Unterstützung der Versionsermittlung
Dieser Abschnitt gilt nur für Windows 7 und höhere Betriebssysteme.
Ein Benutzermodusanzeigetreiber, der unter Windows Vista und höheren Versionen und Windows Server 2008 und höheren Versionen ausgeführt wird, muss die Adaptererstellung für DDI-Versionen, die nicht explizit unterstützt werden, fehlschlagen (d. h. ein Aufruf der OpenAdapter10-Funktion des Treibers).
Windows 7 bietet Direct3D-Anwendungen die Möglichkeit, die DDI-Versionen und Hardwarefunktionen zu ermitteln, die der Treiber explizit unterstützt. Dadurch wird die Versionsüberprüfung verbessert. Windows 7 führt neue adapterspezifische Funktionen ein, um die Versionsverwaltung zu verbessern und die Möglichkeit zu bieten, die API- und Treiberinitialisierung zu optimieren. Sie müssen die OpenAdapter10_2-Funktion in Ihrem Direct3D-Treiber, Version 10.1, implementieren und exportieren, damit die Direct3D-Runtime die neuen adapterspezifischen Funktionen des Treibers aufrufen kann. Wenn Sie Stattdessen OpenAdapter10 in Ihrem Direct3D-Treiber version 10.1 implementieren, kann der Treiber nur angeben, ob er eine DDI-Version unterstützt, indem er den Aufruf von OpenAdapter10 übergibt oder fehlschlägt.
OpenAdapter10_2 gibt eine Tabelle der adapterspezifischen Funktionen des Treibers im pAdapterFuncs_2 Member der D3D10DDIARG_OPENADAPTER-Struktur zurück. pAdapterFuncs_2 verweist auf eine D3D10_2DDI_ADAPTERFUNCS-Struktur . Die Direct3D-Runtime ruft die adapterspezifische GetSupportedVersions-Funktion des Treibers auf, um die vom Treiber unterstützten DDI-Versionen und Hardwarefunktionen abzufragen. GetSupportedVersions gibt die DDI-Versionen und Hardwarefunktionen in einem Array von 64-Bit-Werten zurück. Das folgende Codebeispiel zeigt eine GetSupportedVersions-Implementierung :
// 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;
}
Ein Direct3D-Treiber, Version 10.1, ist nicht erforderlich, um die Werte zu überprüfen, die an die Member Interface und Version von D3D10DDIARG_OPENADAPTER in einem Aufruf der OpenAdapter10_2-Funktion übergeben werden, obwohl diese Werte DDI-Versionsinformationen enthalten, mit denen der Treiber initialisiert werden soll. Der Treiber kann DDI-Version und Hardwarefunktionen über einen Aufruf seiner GetSupportedVersions-Funktion zurückgeben.
Die Direct3D-Runtime kann Werte an die Member Interface und Version von D3D10DDIARG_CREATEDEVICE in einem Aufruf der CreateDevice(D3D10) -Funktion des Treibers übergeben, die sich von den Werten unterscheiden, die die Runtime an OpenAdapter10_2 übergeben hat. Die Runtime übergibt Werte an die Member Interface und Version von D3D10DDIARG_CREATEDEVICE, die auf den Informationen der DDI-Version und der Hardwarefunktionen basieren, die die GetSupportedVersions des Treibers an die Runtime zurückgegeben haben. Der Treiber ist nicht erforderlich, um die Werte zu überprüfen, die an die Member Interface und Version von D3D10DDIARG_CREATEDEVICE übergeben werden, da der Treiber bereits die Unterstützung dieser Werte über seine GetSupportedVersions-Funktion angegeben hat.
Wenn Sie Ihren Treiber von Direct3D Version 10.0 in Direct3D Version 10.1 portieren, sollten Sie den Treiber konvertieren, um nur die Schnittstellen- und Versionsmember zu überwachen, die anstelle von OpenAdapter10_2 an CreateDevice(D3D10) übergeben werden. Sie sollten sowohl CalcPrivateDeviceSize - als auch CreateDevice(D3D10)- Funktionsimplementierungen in Ihrem portierten Treiber analysieren, um sicherzustellen, dass es keine Annahmen über die Werte in den Membern Interface und Version für CreateDevice(D3D10) gibt, die den Werten in den Membern Interface und Version für OpenAdapter10_2 entsprechen.
Beachten SieOpenAdapter10_2 die gleiche Funktionssignatur wie OpenAdapter10 aufweist (d. h. PFND3D10DDI_OPENADAPTER, wie im D3d10umddi.h-Header definiert). Sie können beide Funktionen in derselben Benutzermodus-Anzeigetreiber-DLL implementieren.