Compartilhar via


Suporte à descoberta de versão

Esta seção se aplica somente aos sistemas operacionais Windows 7 e posteriores.

Um driver de exibição no modo de usuário executado no Windows Vista e versões posteriores e no Windows Server 2008 e versões posteriores deve falhar na criação do adaptador (ou seja, falhar uma chamada para a função OpenAdapter10 do driver) para versões DDI que o driver não dá suporte explicitamente.

O Windows 7 fornece uma maneira de os aplicativos Direct3D descobrirem as versões de DDI e os recursos de hardware que o driver dá suporte explicitamente. Isso melhora a verificação de versão. O Windows 7 apresenta novas funções específicas do adaptador para melhorar o controle de versão e fornecer a oportunidade de otimizar a inicialização da API e do driver. Você deve implementar e exportar a função OpenAdapter10_2 no driver do Direct3D versão 10.1 para que o runtime do Direct3D possa chamar as novas funções específicas do adaptador do driver. Se você implementar o OpenAdapter10 no driver do Direct3D versão 10.1, o driver só poderá indicar se ele dá suporte a uma versão DDI passando ou falhando a chamada para OpenAdapter10.

OpenAdapter10_2 retorna uma tabela das funções específicas do adaptador do driver no membro pAdapterFuncs_2 da estrutura D3D10DDIARG_OPENADAPTER . pAdapterFuncs_2 aponta para uma estrutura D3D10_2DDI_ADAPTERFUNCS . O runtime do Direct3D chama a função GetSupportedVersions específica do adaptador do driver para consultar as versões de DDI e os recursos de hardware compatíveis com o driver. GetSupportedVersions retorna as versões DDI e os recursos de hardware em uma matriz de valores de 64 bits. O exemplo de código a seguir mostra uma implementação 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;
}

Um driver direct3D versão 10.1 não é necessário para verificar os valores que são passados para os membros interface e versão de D3D10DDIARG_OPENADAPTER em uma chamada para sua função OpenAdapter10_2 mesmo que esses valores contenham informações de versão de DDI com as quais inicializar o driver. O driver pode retornar recursos de versão e hardware de DDI por meio de uma chamada para sua função GetSupportedVersions .

O runtime do Direct3D pode passar valores para os membros interface e versão do D3D10DDIARG_CREATEDEVICE em uma chamada para a função CreateDevice(D3D10) do driver que são diferentes dos valores que o runtime passou para OpenAdapter10_2; o runtime passa valores para os membros interface e versão de D3D10DDIARG_CREATEDEVICE que se baseiam nas informações de funcionalidades de hardware e versão do DDI que o GetSupportedVersions do driver retornou ao runtime. O driver não é necessário para validar os valores que são passados para os membros interface e versão do D3D10DDIARG_CREATEDEVICE porque o driver já indicou suporte a esses valores por meio de sua função GetSupportedVersions .

Se você estiver portando o driver do Direct3D versão 10.0 para o Direct3D versão 10.1, deverá converter o driver para monitorar apenas os membros interface e versão que são passados para CreateDevice(D3D10) em vez de OpenAdapter10_2. Você deve analisar as implementações de função CalcPrivateDeviceSize e CreateDevice(D3D10) no driver portado para garantir que não haja suposições sobre os valores nos membros interface e versão para CreateDevice(D3D10) que correspondam aos valores nos membros interface e versão para OpenAdapter10_2.

ObserveOpenAdapter10_2 tem a mesma assinatura de função que OpenAdapter10 (ou seja, PFND3D10DDI_OPENADAPTER conforme definido no cabeçalho D3d10umddi.h ). Você pode implementar ambas as funções na mesma DLL do driver de exibição no modo de usuário.