버전 검색 지원
이 섹션은 Windows 7 이상 운영 체제에만 적용됩니다.
Windows Vista 이상 버전 및 Windows Server 2008 이상 버전에서 실행되는 사용자 모드 표시 드라이버는 드라이버가 명시적으로 지원하지 않는 DDI 버전에 대해 어댑터 만들기(즉, 드라이버의 OpenAdapter10 함수 호출 실패)에 실패해야 합니다.
Windows 7은 Direct3D 애플리케이션이 드라이버가 명시적으로 지원하는 DDI 버전 및 하드웨어 기능을 검색하는 방법을 제공합니다. 이렇게 하면 버전 확인이 향상됩니다. Windows 7에는 버전 관리를 개선하고 API 및 드라이버 초기화를 최적화할 수 있는 기회를 제공하기 위한 새로운 어댑터 관련 기능이 도입되었습니다. Direct3D 런타임이 드라이버의 새 어댑터 관련 함수를 호출할 수 있도록 Direct3D 버전 10.1 드라이버에서 OpenAdapter10_2 함수를 구현하고 내보내야 합니다. Direct3D 버전 10.1 드라이버에서 OpenAdapter10 을 구현하는 경우 드라이버는 OpenAdapter10에 대한 호출을 전달하거나 실패하여 DDI 버전을 지원하는지 여부만 나타낼 수 있습니다.
OpenAdapter10_2 D3D10DDIARG_OPENADAPTER구조체의 pAdapterFuncs_2 멤버에서 드라이버의 어댑터 관련 함수 테이블을 반환합니다. pAdapterFuncs_2D3D10_2DDI_ADAPTERFUNCS 구조를 가리킵니다. Direct3D 런타임은 드라이버의 어댑터별 GetSupportedVersions 함수를 호출하여 드라이버가 지원하는 DDI 버전 및 하드웨어 기능을 쿼리합니다. GetSupportedVersions는 64비트 값 배열의 DDI 버전 및 하드웨어 기능을 반환합니다. 다음 코드 예제에서는 GetSupportedVersions 구현을 보여 줍니다 .
// Array of 64-bit values that are defined in D3d10umddi.h
const UINT64 c_aSupportedVersions[] = {
D3D10_0_7_DDI_SUPPORTED, // 10.0 on Windows 7
D3D10_0_DDI_SUPPORTED, // 10.0 on Windows Vista
D3D10_1_x_DDI_SUPPORTED, // 10.1 with all extended
// format support (but not
// Windows 7 scheduling)
};
HRESULT APIENTRY GetSupportedVersions(
D3D10DDI_HADAPTER hAdapter,
__inout UINT32* puEntries,
__out_ecount_opt( *puEntries )
UINT64* pSupportedDDIInterfaceVersions)
)
{
const UINT32 uEntries = ARRAYSIZE( c_aSupportedVersions );
if (pSupportedDDIInterfaceVersions &&
*puEntries < uEntries)
{
return HRESULT_FROM_WIN32( ERROR_INSUFFICIENT_BUFFER );
}
// Determine concise hardware support from kernel, cache with hAdapter.
// pfnQueryAdapterInfoCb( hAdapter, ... )
*puEntries = uEntries;
if (pSupportedDDIInterfaceVersions)
{
UINT64* pCurEntry = pSupportedDDIInterfaceVersions;
memcpy( pCurEntry, c_aSupportedVersions, sizeof( c_aSupportedVersions ) );
pCurEntry += ARRAYSIZE( c_aSupportedVersions );
assert( pCurEntry - pSupportedDDIInterfaceVersions == uEntries );
}
return S_OK;
}
Direct3D 버전 10.1 드라이버는 해당 OpenAdapter10_2 함수 호출에서 D3D10DDIARG_OPENADAPTER인터페이스 및 버전 멤버에 전달되는 값을 확인할 필요가 없습니다. 이러한 값에는 드라이버를 초기화할 DDI 버전 정보가 포함되어 있습니다. 드라이버는 GetSupportedVersions 함수를 호출하여 DDI 버전 및 하드웨어 기능을 반환할 수 있습니다.
Direct3D 런타임은 런타임이 OpenAdapter10_2 전달한 값과 다른 드라이버의 CreateDevice(D3D10) 함수에 대한 호출에서 D3D10DDIARG_CREATEDEVICE인터페이스 및 버전 멤버에 값을 전달할 수 있습니다. 런타임은 드라이버의 GetSupportedVersions가 런타임에 반환한 DDI 버전 및 하드웨어 기능 정보를 기반으로 하는 D3D10DDIARG_CREATEDEVICE 인터페이스 및 버전 멤버에 값을 전달합니다. 드라이버가 GetSupportedVersions 함수를 통해 이러한 값에 대한 지원을 이미 표시했기 때문에 드라이버는 D3D10DDIARG_CREATEDEVICE 인터페이스 및 버전 멤버에 전달되는 값의 유효성을 검사할 필요가 없습니다.
드라이버를 Direct3D 버전 10.0에서 Direct3D 버전 10.1로 포팅하는 경우 OpenAdapter10_2 대신 CreateDevice(D3D10)에 전달된 인터페이스 및 버전 멤버만 모니터링하도록 드라이버를 변환해야 합니다. 이식된 드라이버에서 CalcPrivateDeviceSize 및 CreateDevice(D3D10) 함수 구현을 모두 분석하여 OpenAdapter10_2 인터페이스 및 버전 멤버의 값과 일치하는 CreateDevice(D3D10)의 인터페이스 및 버전 멤버 값에 대한 가정이 없는지 확인해야 합니다.
참고OpenAdapter10_2OpenAdapter10 과 동일한 함수 서명이 있습니다(즉, D3d10umddi.h 헤더에 정의된 대로 PFND3D10DDI_OPENADAPTER). 동일한 사용자 모드 표시 드라이버 DLL에서 두 함수를 구현할 수 있습니다.