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.