Prise en charge de la découverte de versions
Cette section s’applique uniquement aux systèmes d’exploitation Windows 7 et versions ultérieures.
Un pilote d’affichage en mode utilisateur qui s’exécute sur Windows Vista et versions ultérieures et Windows Server 2008 et versions ultérieures doit échouer la création de l’adaptateur (c’est-à-dire échouer un appel à la fonction OpenAdapter10 du pilote) pour les versions DDI que le pilote ne prend pas explicitement en charge.
Windows 7 permet aux applications Direct3D de découvrir les versions DDI et les fonctionnalités matérielles prises en charge explicitement par le pilote. Cela améliore la vérification de version. Windows 7 introduit de nouvelles fonctions spécifiques à l’adaptateur pour améliorer le contrôle de version et offrir la possibilité d’optimiser l’initialisation des API et des pilotes. Vous devez implémenter et exporter la fonction OpenAdapter10_2 dans votre pilote Direct3D version 10.1 afin que le runtime Direct3D puisse appeler les nouvelles fonctions spécifiques de l’adaptateur du pilote. Si vous implémentez Plutôt OpenAdapter10 dans votre pilote Direct3D version 10.1, le pilote peut uniquement indiquer s’il prend en charge une version de DDI en passant ou en échouant l’appel à OpenAdapter10.
OpenAdapter10_2 retourne une table des fonctions spécifiques à l’adaptateur du pilote dans le membre pAdapterFuncs_2 de la structure D3D10DDIARG_OPENADAPTER . pAdapterFuncs_2 pointe vers une structure D3D10_2DDI_ADAPTERFUNCS . Le runtime Direct3D appelle la fonction GetSupportedVersions spécifique à l’adaptateur du pilote pour interroger les versions DDI et les fonctionnalités matérielles prises en charge par le pilote. GetSupportedVersions retourne les versions de DDI et les fonctionnalités matérielles dans un tableau de valeurs 64 bits. L’exemple de code suivant montre une implémentation 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;
}
Un pilote Direct3D version 10.1 n’est pas nécessaire pour vérifier les valeurs passées aux membres Interface et Version de D3D10DDIARG_OPENADAPTER dans un appel à sa fonction OpenAdapter10_2 même si ces valeurs contiennent des informations de version DDI avec lesquelles initialiser le pilote. Le pilote peut retourner la version de DDI et les fonctionnalités matérielles par le biais d’un appel à sa fonction GetSupportedVersions .
Le runtime Direct3D peut transmettre des valeurs aux membres Interface et Version de D3D10DDIARG_CREATEDEVICE dans un appel à la fonction CreateDevice(D3D10) du pilote qui sont différentes des valeurs que le runtime a passées à OpenAdapter10_2 ; le runtime transmet les valeurs aux membres Interface et Version de D3D10DDIARG_CREATEDEVICE qui sont basés sur la version de DDI et les informations sur les fonctionnalités matérielles que les GetSupportedVersions du pilote ont retournées au runtime. Le pilote n’est pas nécessaire pour valider les valeurs passées aux membres Interface et Version de D3D10DDIARG_CREATEDEVICE, car le pilote a déjà indiqué la prise en charge de ces valeurs par le biais de sa fonction GetSupportedVersions .
Si vous portez votre pilote de Direct3D version 10.0 vers Direct3D version 10.1, vous devez convertir le pilote pour surveiller uniquement les membres Interface et Version passés à CreateDevice(D3D10) au lieu de OpenAdapter10_2. Vous devez analyser les implémentations des fonctions CalcPrivateDeviceSize et CreateDevice(D3D10) dans votre pilote porté pour vous assurer qu’il n’existe aucune hypothèse concernant les valeurs des membres Interface et Version pour CreateDevice(D3D10) correspondant aux valeurs des membres Interface et Version pour OpenAdapter10_2.
NotezOpenAdapter10_2 a la même signature de fonction que OpenAdapter10 (autrement dit, PFND3D10DDI_OPENADAPTER comme défini dans l’en-tête D3d10umddi.h ). Vous pouvez implémenter les deux fonctions dans la même DLL de pilote d’affichage en mode utilisateur.