版本发现支持

本部分仅适用于 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_2D3D10DDIARG_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;
}

Direct3D 版本 10.1 驱动程序不需要验证在调用其 OpenAdapter10_2 函数时传递给 D3D10DDIARG_OPENADAPTER的 InterfaceVersion 成员的值,即使这些值包含用于初始化驱动程序的 DDI 版本信息。 驱动程序可以通过调用其 GetSupportedVersions 函数返回 DDI 版本和硬件功能。

Direct3D 运行时可以在调用驱动程序的 CreateDevice (D3D10 ) 函数中将值传递给 D3D10DDIARG_CREATEDEVICE接口成员和版本成员,这些值不同于运行时传递给OpenAdapter10_2的值;运行时将值传递给D3D10DDIARG_CREATEDEVICE的接口成员和版本成员,这些成员基于驱动程序的 GetSupportedVersion 返回给运行时的 DDI 版本和硬件功能信息。 驱动程序不需要验证传递给 D3D10DDIARG_CREATEDEVICE 的 InterfaceVersion 成员的值,因为驱动程序已通过其 GetSupportedVersions 函数指示支持这些值。

如果要将驱动程序从 Direct3D 版本 10.0 移植到 Direct3D 版本 10.1,则应将驱动程序转换为仅监视传递到 CreateDevice (D3D10) 而不是OpenAdapter10_2接口版本成员。 应分析移植驱动程序中的 CalcPrivateDeviceSizeCreateDevice (D3D10) 函数实现,以确保 CreateDevice (D3D10 InterfaceVersion 成员中的值没有假设,) 与 OpenAdapter10_2InterfaceVersion 成员中的值匹配。

注意OpenAdapter10_2 具有与 OpenAdapter10 (相同的函数签名,即PFND3D10DDI_OPENADAPTER D3d10umddi.h 标头) 中定义的。 可以在同一用户模式显示驱动程序 DLL 中实现这两个函数。