版本发现支持

本部分仅适用于 Windows 7 及更高版本的作系统。

在 Windows Vista 及更高版本以及 Windows Server 2008 及更高版本上运行的用户模式显示驱动程序必须在驱动程序不明确支持的 DDI 版本上失败适配器创建(即,驱动程序的 OpenAdapter10 函数调用必须失败)。

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;
}

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

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

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

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