共用方式為


版本探索支援

本節僅適用于 Windows 7 和更新版本的作業系統。

在 Windows Vista 和更新版本和 Windows Server 2008 和更新版本上執行的使用者模式顯示驅動程式必須失敗建立介面卡 (,也就是無法呼叫驅動程式的 OpenAdapter10 函式,) 驅動程式未明確支援的 DDI 版本。

Windows 7 提供一種方式,讓 Direct3D 應用程式探索驅動程式明確支援的 DDI 版本和硬體功能。 這可改善版本驗證。 Windows 7 引進了新的介面卡特定函式來改善版本設定,並提供優化 API 和驅動程式初始化的機會。 您必須在 Direct3D 10.1 版驅動程式中實作和匯出 OpenAdapter10_2 函式,讓 Direct3D 執行時間可以呼叫驅動程式的新配接器特定函式。 如果您改為在 Direct3D 10.1 版驅動程式中實作 OpenAdapter10 ,驅動程式只能透過傳遞或失敗呼叫 OpenAdapter10來指出它是否支援 DDI 版本。

OpenAdapter10_2傳回D3D10DDIARG_OPENADAPTER結構之pAdapterFuncs_2成員中驅動程式配接器特定函式的資料表。 pAdapterFuncs_2 指向 D3D10_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;
}

即使這些值包含初始化驅動程式的 DDI 版本資訊,仍不需要 Direct3D 10.1 版驅動程式,才能驗證傳遞給 D3D10DDIARG_OPENADAPTER OpenAdapter10_2介面版本成員的值。 驅動程式可以透過呼叫 GetSupportedVersions 函式,傳回 DDI 版本和硬體功能。

Direct3D 執行時間可以在呼叫驅動程式的CreateDevice (D3D10) 函式中,將值傳遞給D3D10DDIARG_CREATEDEVICEInterfaceVersion成員,這些函式與執行時間傳遞至OpenAdapter10_2的值不同;執行時間會根據驅動程式的 GetSupportedVersions傳回給執行時間的 DDI 版本和硬體功能資訊,將值傳遞給D3D10DDIARG_CREATEDEVICE的介面和版本成員。 驅動程式不需要驗證傳遞給 D3D10DDIARG_CREATEDEVICE 介面Version 成員的值,因為驅動程式已透過 GetSupportedVersions 函式指出這些值的支援。

如果您要將驅動程式從 Direct3D 10.0 版移植到 Direct3D 10.1 版,您應該將驅動程式轉換為只監視傳遞至CreateDevice (D3D10) InterfaceVersion成員,而不是OpenAdapter10_2。 您應該在移植驅動程式中分析CalcPrivateDeviceSizeCreateDevice (D3D10) 函式實作,以確保在 CreateDevice (D3D10 的 Interface 和 Version 成員中,沒有任何關於 CreateDevice (D3D10中的值假設,) 符合OpenAdapter10_2InterfaceVersion成員中的值。

請注意,OpenAdapter10_2 的函式簽章與 OpenAdapter10 (相同,PFND3D10DDI_OPENADAPTER如 D3d10umddi.h 標頭中所定義) 。 您可以在相同的使用者模式顯示驅動程式 DLL 中實作這兩個函式。