Device , DeviceContext 생성

DirectX11 2016. 7. 3. 19:08

Device, DeviceContext 는 물리적인 그래픽 장치 하드웨어에 대한 소프트웨어 제어기라고 생각하면 된다.


ID3D11Device 인터페이스는 기능 지원 점검과 자원 할당에 쓰인다.


ID3D11DeviceContext 인터페이스는 렌더 대상을 설정하고, 자원을 그래픽 파이프 라인에 묶고, GPU가 렌더링 명령들을 지시하는 데 쓰인다.


Device와 DeviceContext를 생성하는 함수


HRESULT D3D11CreateDevice {

IDXGIAdapter *pAdapter, 

D3D_DRIVER_TYPE DriverType,

HMODULE Software,

UINT Flags,

CONST D3D_FEATURE_LEVEL *pFeatureLevels,

UINT FeatureLevels,

UINT SDKVersion,

ID3D11Device **ppDevice,

D3D__FEATURE_LEVEL *pFeatureLevel,

ID3D11DeviceContext **ppImmediateContext

};


1. pAdapter : 이 함수로 생성할 Device를 나타내는 디스플레이 어댑터를 지정한다.

이 메개 변수에 널 값을 지정하면 기본 디스플레이 어댑터가 사용된다.


2. DriverType : 일반적으로 렌더링에 3차원 그래픽 가속이 적용되게 하기 위해선 이 매개변수에 D3D_DRIVER_TYPE_HARDWARE를 지정한다.

다른 매개 변수로는 

ⓐ D3D_DRIVER_TYPE_REFERENCE

  - 표준 장치를 생성한다. 즉, 하드웨어가 지원하지 않는 기능을 시험할때, 구동기의 버그를 시험할때 사용한다.

ⓑ D3D_DRIVER_TYPE_SOFTWARE

  - 3차원 하드웨어를 흉내내는 소프트웨어 구동기를 생성한다.

ⓒ D3D_DRIVER_TYPE_WARP

  - Direct3D 10.1 소프트웨어 구동기를 생성한다. (D3D11버전을 지원하지 않는다.)


3. Software: 소프트웨어 구동기를 지정한다.


4. Flags: 추가적인 장치 플래그들을 지정한다.

(흔히 쓰이는 2개)

ⓐ D3D_CREATE_DEVICE_DEBUG : 디버그 모드 빌드에서 디버그 계층을 활성화 하려면 이 플래그를 설정 해야한다.

( 이 플래그를 지정하면 VC++출력창에 디버그 메세지를 보낸다. )


ⓑ D3D_CREATE_DEVICE_SINGLETHREADED : Direct3D가 여러 개의 스레드에서 호출되지 않는다는 보장이 있을 때, 이 플래그를 지정하면 성능이 향상된다.

( 이 플래그가 활성화 되면 ID3D11Device::CreateDeferredContext의 호출은 실패한다.)

5. pFeatureLevels : D3D_FEATURE_LEVEL 형식의 배열 (널 값이면 최고수준)


6. FeatureLevels : pFeatureLevels 의 갯수 (위에 값이 널값이면 0으로 지정하면 된다.)


7. SDKVersion : 항상 D3D11_SDK_VERSION을 지정한다.


8. ppDevice : 함수가 생성한 Device


9 pFeatureLevel : 위에서 설정된 FeatureLevel을 반영한다.


10. ppImmediateContext : 생성된 DeviceContext를 돌려준다.


위의 매개변수가 Immediate라는 것은 다른 지연된 DeferredContext도 있다.

주 렌더링 스레드에는 Immediate를 사용하고

워커 스레드 에선 임의의 갯수인 Deferred를 사용한다.

1. 각 워커 스레드는 그리기 명령들을 명령목록(ID3D11CommandList)에 기록한다.

2. 주 렌더링 스레드는 Immediate를 이용해서 워커 스레드 명령목록에 있는 명령들을 기록한다.

명령목록을 생성하는데 시간이 걸린다면 다중 코어 시스템에서 이처럼 명령목록들을 병렬로 생성하여 성능향상을 꾀할 수 있다.


posted by 알쿠미