Compartir a través de


Compatibilidad con la detección de versiones

Esta sección solo se aplica a los sistemas operativos Windows 7 y versiones posteriores.

Un controlador de pantalla en modo de usuario que se ejecuta en Windows Vista y versiones posteriores y Windows Server 2008 y versiones posteriores debe producir un error en la creación del adaptador (es decir, no se puede realizar una llamada a la función OpenAdapter10 del controlador) para las versiones DDI que el controlador no admite explícitamente.

Windows 7 proporciona una manera de que las aplicaciones de Direct3D detecten las versiones de DDI y las funcionalidades de hardware que admite explícitamente el controlador. Esto mejora la comprobación de la versión. Windows 7 presenta nuevas funciones específicas del adaptador para mejorar el control de versiones y proporcionar la oportunidad de optimizar la inicialización de api y controladores. Debes implementar y exportar la función OpenAdapter10_2 en el controlador direct3D versión 10.1 para que el entorno de ejecución de Direct3D pueda llamar a las nuevas funciones específicas del adaptador del controlador. Si en su lugar implementa OpenAdapter10 en el controlador direct3D versión 10.1, el controlador solo puede indicar si admite una versión DDI pasando o con errores la llamada a OpenAdapter10.

OpenAdapter10_2 devuelve una tabla de las funciones específicas del adaptador del controlador en el miembro pAdapterFuncs_2 de la estructura D3D10DDIARG_OPENADAPTER . pAdapterFuncs_2 apunta a una estructura de D3D10_2DDI_ADAPTERFUNCS . El tiempo de ejecución de Direct3D llama a la función GetSupportedVersions específica del adaptador del controlador para consultar las versiones de DDI y las funcionalidades de hardware que admite el controlador. GetSupportedVersions devuelve las versiones de DDI y las funcionalidades de hardware en una matriz de valores de 64 bits. En el ejemplo de código siguiente se muestra una implementación de 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;
}

No es necesario un controlador de Direct3D versión 10.1 para comprobar los valores que se pasan a los miembros Interface y Version de D3D10DDIARG_OPENADAPTER en una llamada a su función OpenAdapter10_2 , aunque estos valores contienen información de versión de DDI con la que inicializar el controlador. El controlador puede devolver la versión de DDI y las funcionalidades de hardware a través de una llamada a su función GetSupportedVersions .

El tiempo de ejecución de Direct3D puede pasar valores a los miembros Interface y Version de D3D10DDIARG_CREATEDEVICE en una llamada a la función CreateDevice(D3D10) del controlador que son diferentes de los valores que el tiempo de ejecución pasó a OpenAdapter10_2; El tiempo de ejecución pasa valores a los miembros Interface y Version de D3D10DDIARG_CREATEDEVICE que se basan en la versión de DDI y la información de funcionalidades de hardware que el controlador GetSupportedVersions devolvió al entorno de ejecución. El controlador no es necesario para validar los valores que se pasan a los miembros Interface y Version de D3D10DDIARG_CREATEDEVICE porque el controlador ya ha indicado compatibilidad con estos valores a través de su función GetSupportedVersions .

Si vas a migrar el controlador de Direct3D versión 10.0 a Direct3D versión 10.1, debes convertir el controlador para supervisar solo los miembros interface y Version que se pasan a CreateDevice(D3D10) en lugar de OpenAdapter10_2. Debe analizar las implementaciones de funciones de CalcPrivateDeviceSize y CreateDevice(D3D10) en el controlador portado para asegurarse de que no hay suposiciones sobre los valores de los miembros Interface y Version para CreateDevice(D3D10) que coincidan con los valores de los miembros Interface y Version para OpenAdapter10_2.

NotaOpenAdapter10_2 tiene la misma firma de función que OpenAdapter10 (es decir, PFND3D10DDI_OPENADAPTER tal y como se define en el encabezado D3d10umddi.h ). Puede implementar ambas funciones en el mismo archivo DLL del controlador de pantalla en modo de usuario.