[DirectX11] Device & CreateDevice
Device
디바이스는 리소스를 만들고 디스플레이 어댑터의 기능을 열거하는 데 사용됩니다.
각 애플리케이션에는 디바이스가 하나 이상 있어야 하며, 대부분의 애플리케이션은 하나의 디바이스만 만듭니다. D3D11CreateDevice 또는 D3D11CreateDeviceAndSwapChain 을 호출하여 컴퓨터에 설치된 하드웨어 드라이버 중 하나에 대한 디바이스를 만들고 D3D_DRIVER_TYPE 플래그를 사용하여 드라이버 유형을 지정합니다. 각 디바이스는 원하는 기능에 따라 디바이스 컨텍스트를 하나 이상 사용할 수 있습니다.
DeviceContext
디바이스 컨텍스트에는 디바이스가 사용되는 상황 또는 설정이 포함됩니다. 더 구체적으로, 디바이스 컨텍스트는 디바이스가 소유한 리소스를 사용하여 파이프라인 상태를 설정하고 렌더링 명령을 생성하는 데 사용됩니다. Direct3D 11은 두 가지 유형의 디바이스 컨텍스트를 구현합니다. 하나는 즉시 렌더링용이고 다른 하나는 지연된 렌더링용입니다. 두 컨텍스트 모두 ID3D11DeviceContext 인터페이스로 표시됩니다.
// D3D11CreateDevice 기본 구조
HRESULT WINAPI D3D11CreateDevice(
IDXGIAdapter * pAdapter,
D3D_DRIVER_TYPE DriverType,
HMODULE Software,
UINT Flags,
D3D_FEATURE_LEVEL * pFeatureLevels,
UINT FeatureLevels,
UINT SDKVersion,
ID3D11Device * *ppDevice,
D3D_FEATURE_LEVEL * pFeatureLevel,
ID3D11DeviceContext * *ppImmediateContext
);
DirectX 11에서 DirectX 장치를 생성하는 함수 D3D11CreateDevice의 선언입니다.
함수의 매개변수들은 다음과 같습니다.
- pAdapter: 생성할 DirectX 장치의 어댑터를 지정합니다. NULL을 지정하면 기본 어댑터를 사용합니다.
- DriverType: 생성할 DirectX 장치의 드라이버 유형을 지정합니다. D3D_DRIVER_TYPE_* 상수 중 하나를 지정합니다.
- Software: 생성할 DirectX 장치가 소프트웨어 드라이버를 사용해야 할 경우 소프트웨어 드라이버 모듈의 핸들을 지정합니다. 그렇지 않으면 NULL을 지정합니다.
- Flags: DirectX 장치를 생성할 때 사용할 플래그를 지정합니다.
- pFeatureLevels: DirectX 장치가 지원하는 기능 수준의 배열을 지정합니다.
- FeatureLevels: pFeatureLevels 배열의 크기를 지정합니다.
- SDKVersion: 사용 중인 DirectX SDK의 버전을 지정합니다.
- ppDevice: 생성된 DirectX 장치의 포인터를 반환합니다.
- pFeatureLevel: 생성된 DirectX 장치의 기능 수준을 반환합니다.
- ppImmediateContext: 생성된 DirectX 장치와 연결된 즉시 컨텍스트(ID3D11DeviceContext 인터페이스)의 포인터를 반환합니다.
D3D11CreateDevice 함수는 주어진 매개변수에 따라 DirectX 장치를 생성하고, 생성된 DirectX 장치의 포인터와 기능 수준, 즉시 컨텍스트의 포인터를 반환합니다. 이 함수를 사용하여 DirectX 애플리케이션에서 필요한 DirectX 장치를 생성할 수 있습니다.
IDXGIAdapter * pAdapter
- 이 함수로 생성할 장치를 나타내는 디스플레이 어댑터를 지정한다. NULL 또는 0을 지정하면 기본 디스플레이 어댑터가 사용됩니다.
- DirectX DXGIAdapter는 DirectX Graphics Infrastructure (DXGI)의 인터페이스 중 하나입니다. DXGIAdapter 인터페이스는 DirectX 10 이상에서 사용 가능하며, 그래픽 하드웨어 어댑터에 대한 정보를 캡슐화하는 데 사용됩니다.
- DXGIAdapter 인터페이스는 주로 다음과 같은 기능을 수행합니다.
- 그래픽 어댑터의 속성 및 기능을 쿼리합니다.
- 그래픽 어댑터와 관련된 렌더링 컨텍스트를 만듭니다.
- 다중 모니터 지원을 위한 그래픽 어댑터의 정보를 제공합니다.
- 그래픽 어댑터는 일반적으로 그래픽 카드와 관련이 있으며, 그래픽 처리를 수행하는 데 필요한 하드웨어 및 소프트웨어 리소스를 제공합니다. DXGIAdapter 인터페이스는 이러한 그래픽 어댑터의 정보를 가져와 DirectX 애플리케이션에서 이를 활용할 수 있게 합니다.
- 예를 들어, DirectX 애플리케이션이 DXGIAdapter 인터페이스를 사용하여 사용 가능한 그래픽 어댑터의 수를 확인할 수 있습니다. 또한 DXGIAdapter 인터페이스를 사용하여 각 그래픽 어댑터의 이름, 메모리 용량, 드라이버 정보 등의 정보를 확인할 수 있습니다. 이러한 정보는 DirectX 애플리케이션에서 그래픽 렌더링을 위한 최적의 그래픽 어댑터를 선택하거나, 다중 모니터를 구성하는 데 사용될 수 있습니다.
D3D_DRIVER_TYPE DriverType,
typedef
enum D3D_DRIVER_TYPE
{
D3D_DRIVER_TYPE_UNKNOWN // 드라이버 유형을 알 수 없습니다.
D3D_DRIVER_TYPE_HARDWARE //
D3D_DRIVER_TYPE_REFERENCE = ( D3D_DRIVER_TYPE_HARDWARE + 1 ) ,
D3D_DRIVER_TYPE_NULL = ( D3D_DRIVER_TYPE_REFERENCE + 1 ) ,
D3D_DRIVER_TYPE_SOFTWARE = ( D3D_DRIVER_TYPE_NULL + 1 ) ,
D3D_DRIVER_TYPE_WARP = ( D3D_DRIVER_TYPE_SOFTWARE + 1 )
} D3D_DRIVER_TYPE;
D3D_DRIVER_TYPE_UNKNOWN
- 드라이버 유형을 알 수 없습니다.
D3D_DRIVER_TYPE_HARDWARE ( 보통 이걸 사용 )
● 하드웨어에서 Direct3D 기능을 구현하는 하드웨어 드라이버. 이것은 최상의 성능을 제공하기 때문에 Direct3D 응용 프로그램에서 사용해야 하는 기본 드라이버입니다. 하드웨어 드라이버는 하드웨어 가속(지원되는 하드웨어에서)을 사용하지만 하드웨어에서 지원되지 않는 파이프라인 부분에 소프트웨어를 사용할 수도 있습니다.
D3D_DRIVER_TYPE_REFERENCE
● 모든 Direct3D 기능을 지원하는 소프트웨어 구현인 참조 드라이버. 참조 드라이버는 속도보다는 정확성을 위해 설계되어 결과적으로 느리지만 정확합니다. 드라이버의 래스터라이저 부분은 가능할 때마다 특수 CPU 명령을 사용하지만 소매 응용 프로그램용은 아닙니다.
D3D_DRIVER_TYPE_NULL
● 렌더링 기능이 없는 참조 드라이버인 NULL 드라이버. 이 드라이버는 일반적으로 비렌더링 API 호출 디버깅에 사용되며 소매 애플리케이션에는 적합하지 않습니다. 이 드라이버는 DirectX SDK에 의해 설치됩니다.
D3D_DRIVER_TYPE_SOFTWARE
● 소프트웨어로 완전히 구현된 드라이버인 소프트웨어 드라이버. 소프트웨어 구현은 매우 느린 성능으로 인해 고성능 애플리케이션을 위한 것이 아닙니다.
D3D_DRIVER_TYPE_WARP
● 고성능 소프트웨어 래스터라이저인 WARP 드라이버. 래스터라이저는 고성능 소프트웨어 구현을 통해 기능 수준 9_1에서 수준 10_1까지 지원합니다.
HMODULE Software,
● 소프트웨어 구동기를 지정한다. 이 포스팅에서는 하드웨어를 사용해서 렌더링 하므로 항상 NULL 값을 지정합니다.
● 이외의 값으로 지정하기 위해선, 실제로 사용 가능한 소프트웨어 구동기가 있어야 한다.
UINT Flags,
● 추가적인 장치 생성 플래그들(OR로 결합가능)을 지정한다.
- D3D11_CREATE_DEVICE_SINGLETHREADED: DirectX 장치를 단일 스레드 모드로 생성합니다.
- D3D11_CREATE_DEVICE_DEBUG: 디버그 메시지를 생성할 수 있도록 DirectX 디버그 레이어를 활성화합니다.
- D3D11_CREATE_DEVICE_BGRA_SUPPORT: BGRA 픽셀 형식을 지원하는 DirectX 장치를 생성합니다.
- D3D11_CREATE_DEVICE_PREVENT_INTERNAL_THREADING_OPTIMIZATIONS: DirectX 내부 스레딩 최적화를 비활성화합니다.
- D3D11_CREATE_DEVICE_DISABLE_GPU_TIMEOUT: GPU 타임아웃을 비활성화합니다.
이 외에도 다양한 플래그가 존재하며, DirectX 애플리케이션의 요구 사항에 따라 적절한 플래그를 선택하여 DirectX 장치를 생성할 수 있습니다. 이러한 플래그를 조합하여 DirectX 장치를 생성하는 것은 DirectX 애플리케이션의 성능과 안정성에 영향을 미칠 수 있으므로, 신중하게 선택해야 합니다.
D3D_FEATURE_LEVEL * pFeatureLevels,
D3D_FEATURE_LEVEL 형식 원소들의 배열로, 원소들의 순서가 곧 기능 수준들을 점검하는 순서이다. 이 매개변수에 NULL 값을 지정하면 지원되는 최고 기능 수준이 선택됩니다.
D3D_FEATURE_LEVEL은 DirectX 장치의 기능 수준을 지정하는 열거형(Enum)입니다. 이 값은 DirectX 장치가 지원하는 기능의 범위를 결정하며, DirectX 애플리케이션이 해당 장치에서 지원되는 최대 기능 수준을 결정하는 데 사용됩니다.
typedef
enum D3D_FEATURE_LEVEL
{
D3D_FEATURE_LEVEL_1_0_CORE = 0x1000,
D3D_FEATURE_LEVEL_9_1 = 0x9100,
D3D_FEATURE_LEVEL_9_2 = 0x9200,
D3D_FEATURE_LEVEL_9_3 = 0x9300,
D3D_FEATURE_LEVEL_10_0 = 0xa000,
D3D_FEATURE_LEVEL_10_1 = 0xa100,
D3D_FEATURE_LEVEL_11_0 = 0xb000,
D3D_FEATURE_LEVEL_11_1 = 0xb100,
D3D_FEATURE_LEVEL_12_0 = 0xc000,
D3D_FEATURE_LEVEL_12_1 = 0xc100,
D3D_FEATURE_LEVEL_12_2 = 0xc200
} D3D_FEATURE_LEVEL;
UINT FeatureLevels,
배열 pFeatureLvels의 D3D_FEATURE_LEVEL의 원소 갯수이다. NULL값을 지정했다면 이 매개변수는 0으로 지정한다.
UINT SDKVersion,
DirectX의 SDK 버전을 선택한다. D3D11_SDK_VERSION
ID3D11Device * *ppDevice,
생성한 Device를 반환 한다.
D3D_FEATURE_LEVEL * pFeatureLevel,
5번 매개변수의 pFeatureLeves 배열에서 처음으로 지원되는 기능을 돌려준다.
ID3D11DeviceContext * *ppImmediateContext
생성된 DeviceContext를 돌려준다.
'Programming > DirectX11' 카테고리의 다른 글
DirectX11 Draw 관련 메서드 (0) | 2023.03.19 |
---|---|
DirectX11 초기화 단계 (0) | 2023.03.19 |