Direct3D 버전 11 DDI와의 통신 초기화
이 섹션은 Windows 7 이상 및 Windows Server 2008 R2 이상 버전의 Windows 운영 체제에만 적용됩니다.
통신 초기화
사용자 모드 디스플레이 드라이버 DLL의 버전 11 DDI와의 통신을 초기화하기 위해 DLL이 아직 로드되지 않은 경우 Direct3D 버전 11 런타임에서 먼저 DLL을 로드합니다. Direct3D 런타임은 DLL의 내보내기 테이블을 통해 사용자 모드 디스플레이 드라이버의 OpenAdapter10_2 함수를 호출하여 그래픽 어댑터의 instance 엽니다. OpenAdapter10_2 함수는 DLL에서 유일하게 내보낸 함수입니다.
참고
OpenAdapter10_2 함수는 드라이버의 어댑터 관련 함수 테이블이 반환되는 방식을 제외하고 OpenAdapter10 함수와 동일합니다.
- OpenAdapter10_2pAdapterFuncs_2 D3D10_2DDI_ADAPTERFUNCS 구조를 가리키는 D3D10DDIARG_OPENADAPTER 구조체의 pAdapterFuncs_2 멤버에 있는 테이블을 반환합니다.
- OpenAdapter10은 pAdapterFuncs가 D3D10DDI_ADAPTERFUNCS 구조를 가리키는D3D10DDIARG_OPENADAPTERpAdapterFuncs 멤버의 테이블을 반환합니다.
OpenAdapter10_2 드라이버를 보다 효율적으로 초기화할 수 있도록 설계되었습니다. Direct3D 버전 11 드라이버에서 OpenAdapter10_2 구현해야 합니다. Direct3D 버전 10.1 드라이버에서 OpenAdapter10이 아닌 OpenAdapter10_2 구현하여 해당 드라이버의 초기화 효율성을 높일 수도 있습니다. Direct3D 버전 10.1 드라이버에서 OpenAdapter10_2 구현하는 방법에 대한 자세한 내용은 버전 검색 지원을 참조하세요. OpenAdapter10_2 런타임과 드라이버 간의 버전 관리 및 기타 정보 교환을 처리합니다.
버전 관리
OpenAdapter10_2 및 드라이버의 어댑터 관련 함수는 Direct3D 10에서 버전 관리를 처리하는 방식에서 Direct3D API와 Direct3D DDI 간의 버전 관리 방식을 변경합니다(Direct3D 10에서 버전 관리를 처리하는 방법에 대한 자세한 내용은 Direct3D 버전 10 DDI와의 통신 초기화를 참조하세요). 드라이버의 OpenAdapter10_2 함수가 실패하여 특정 버전에 대한 지원이 없음을 나타내는 Direct3D API 대신( OpenAdapter10_2) 드라이버는 지원하는 DDI 버전을 명시적으로 나열해야 합니다. Direct3D 런타임은 사용자 모드 디스플레이 드라이버의 GetSupportedVersions 함수(드라이버의 어댑터 관련 함수 중 하나)를 호출하여 드라이버가 지원하는 DDI 버전을 쿼리합니다.
Direct3D 11 DDI 함수에 대한 두 개 이상의 새 DDI 버전이 있습니다. 각 DDI 버전은 DDI가 Windows Vista 또는 Windows 7에서 실행되는지 여부를 구분합니다. 그러나 Direct3D 11 DDI를 지원한다고 해서 반드시 D3D_FEATURE_LEVEL_11 연결된 하드웨어 기능을 완전히 지원하는 것은 아닙니다. 드라이버는 Direct3D 11 DDI에 의해 노출되는 다른 기능(예: 테셀레이션)을 지원하지 않는 하드웨어를 사용하여 Direct3D 11 DDI의 새로운 스레딩 기능을 지원할 수 있습니다. 다음 코드는 각 DDI 버전을 구분하는 방법을 보여 있습니다.
// D3D11.0 on Vista
#define D3D11_DDI_MAJOR_VERSION 11
#define D3D11_0_DDI_MINOR_VERSION ...
#define D3D11_0_DDI_INTERFACE_VERSION \
((D3D11_DDI_MAJOR_VERSION << 16) | D3D11_0_DDI_MINOR_VERSION)
#define D3D11_0_DDI_BUILD_VERSION ...
#define D3D11_0_DDI_SUPPORTED \
((((UINT64)D3D11_0_DDI_INTERFACE_VERSION) << 32) | \
(((UINT64)D3D11_0_DDI_BUILD_VERSION) << 16))
// D3D11.0 on Windows 7
#define D3D11_0_7_DDI_MINOR_VERSION ...
#define D3D11_0_7_DDI_INTERFACE_VERSION \
((D3D11_DDI_MAJOR_VERSION << 16) | D3D11_0_7_DDI_MINOR_VERSION)
#define D3D11_0_7_DDI_BUILD_VERSION ...
#define D3D11_0_7_DDI_SUPPORTED \
((((UINT64)D3D11_0_7_DDI_INTERFACE_VERSION) << 32) | \
(((UINT64)D3D11_0_7_DDI_BUILD_VERSION) << 16))
#ifndef IS_D3D11_WIN7_INTERFACE_VERSION
#define IS_D3D11_WIN7_INTERFACE_VERSION( i ) (D3D11_0_7_DDI_INTERFACE_VERSION == i)
#endif
정보 교환
버전 정보를 지정하는 것 외에도 드라이버의 OpenAdapter10_2 함수는 런타임과 드라이버 간에 다른 정보를 교환합니다.
드라이버의 OpenAdapter10_2 함수 호출에서 런타임은 D3D10DDIARG_OPENADAPTER구조체의 pAdapterCallbacks 멤버에 pfnQueryAdapterInfoCb 어댑터 콜백 함수를 제공합니다. 사용자 모드 디스플레이 드라이버는 pfnQueryAdapterInfoCb 어댑터 콜백 함수를 호출하여 디스플레이 미니포트 드라이버의 그래픽 하드웨어 기능을 쿼리해야 합니다.
런타임은 사용자 모드 디스플레이 드라이버의 CreateDevice(D3D10) 함수( 드라이버의 어댑터 관련 함수 중 하나)를 호출하여 렌더링 상태 컬렉션을 처리하고 초기화를 완료하기 위한 디스플레이 디바이스를 만듭니다. 초기화가 완료되면 Direct3D 버전 11 런타임에서 디스플레이 드라이버 제공 Direct3D 버전 11 함수를 호출할 수 있으며 사용자 모드 디스플레이 드라이버는 런타임 제공 함수를 호출할 수 있습니다.
사용자 모드 디스플레이 드라이버의 CreateDevice(D3D10) 함수는 사용자 모드 디스플레이 드라이버의 버전 11 DDI를 초기화하기 위해 다음과 같은 방식으로 멤버가 설정된 D3D10DDIARG_CREATEDEVICE 구조로 호출됩니다.
런타임은 인터페이스 를 사용자 모드 표시 드라이버에서 런타임에 필요한 인터페이스 버전으로 설정합니다.
런타임은 버전 을 드라이버가 런타임이 빌드되는 시기를 식별하는 데 사용할 수 있는 숫자로 설정합니다. 예를 들어 드라이버는 버전 번호를 사용하여 Windows Vista에서 릴리스된 런타임과 드라이버에 필요한 수정 사항을 포함할 수 있는 후속 서비스 팩으로 릴리스된 런타임을 구분할 수 있습니다.
런타임은 hRTDevice 를 설정하여 드라이버가 런타임으로 다시 호출할 때 드라이버가 사용해야 하는 핸들을 지정합니다.
런타임은 hDrvDevice 를 설정하여 런타임이 후속 드라이버 호출에서 사용하는 핸들을 지정합니다.
런타임은 pKTCallbacks가 가리키는 D3DDDI_DEVICECALLBACKS 구조에서 디바이스별 콜백 함수의 테이블을 제공합니다. 사용자 모드 디스플레이 드라이버는 런타임 제공 콜백 함수를 호출하여 디스플레이 미니포트 드라이버의 커널 모드 서비스에 액세스합니다.
사용자 모드 디스플레이 드라이버는 p11DeviceFuncs가 가리키는 D3D11DDI_DEVICEFUNCS 구조에서 디바이스별 함수의 테이블을 반환합니다.
런타임은 DXGIBaseDDI가 가리키는 DXGI_DDI_BASE_ARGS 구조를 제공합니다. 런타임 및 사용자 모드 디스플레이 드라이버는 DirectX 그래픽 인프라 DDI 를 이 구조에 제공합니다.
런타임은 hRTCoreLayer 를 설정하여 드라이버가 런타임으로 다시 호출하여 핵심 Direct3D 10 기능(즉, p11UMCallbacks 멤버가 지정하는 함수 호출)에 액세스할 때 드라이버가 사용해야 하는 핸들을 지정합니다.
런타임은 p11UMCallbacks가 가리키는 D3D11DDI_CORELAYER_DEVICECALLBACKS 구조에서 핵심 콜백 함수의 테이블을 제공합니다. 사용자 모드 표시 드라이버는 런타임에서 제공하는 핵심 콜백 함수를 호출하여 상태를 새로 고칩니다.