다음을 통해 공유


버전 검색 지원

이 섹션은 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_2D3D10DDIARG_OPENADAPTER 구조체의 pAdapterFuncs_2 멤버에서 드라이버의 어댑터별 함수 테이블을 반환합니다. pAdapterFuncs_2D3D10_2DDI_ADAPTERFUNCS 구조를 가리킵니다. Direct3D 런타임은 드라이버의 어댑터별 GetSupportedVersions 함수를 호출하여 드라이버가 지원하는 DDI 버전 및 하드웨어 기능을 쿼리합니다. GetSupportedVersions는 DDI 버전 및 하드웨어 기능을 64비트 값 배열로 반환합니다. 다음 코드 예제에서는 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 런타임은 드라이버의 CreateDevice(D3D10) 함수를 호출할 때 D3D10DDIARG_CREATEDEVICE인터페이스버전 멤버에 런타임이 OpenAdapter10_2에 전달한 값과 다른 값을 전달할 수 있습니다. 이 값들은 드라이버의 GetSupportedVersions가 런타임에 반환한 DDI 버전 및 하드웨어 기능 정보를 기반으로 인터페이스버전 멤버에 전달됩니다. 드라이버가 GetSupportedVersions 함수를 통해 이러한 값에 대한 지원을 이미 표시했기 때문에 드라이버는 D3D10DDIARG_CREATEDEVICE 인터페이스버전 멤버에 전달되는 값의 유효성을 검사할 필요가 없습니다.

Direct3D 버전 10.0에서 Direct3D 버전 10.1로 드라이버를 포팅하는 경우 OpenAdapter10_2 대신 CreateDevice(D3D10)에 전달된 인터페이스버전 멤버만 모니터링하도록 드라이버를 변환해야 합니다. 이식된 드라이버에서 CalcPrivateDeviceSizeCreateDevice(D3D10) 함수 구현을 모두 분석하여 인터페이스버전 멤버의 값이 OpenAdapter10_2인터페이스버전 멤버의 값과 일치한다고 가정하지 않도록 해야 합니다.

참고OpenAdapter10_2OpenAdapter10 과 동일한 함수 서명이 있습니다(즉, D3d10umddi.h 헤더에 정의된 대로 PFND3D10DDI_OPENADAPTER). 동일한 사용자 모드 표시 드라이버 DLL에서 두 함수를 모두 구현할 수 있습니다.