Initialisieren der Kommunikation mit direct3D Version 11 DDI
Dieser Abschnitt gilt nur für Windows 7 und höher sowie Windows Server 2008 R2 und höhere Versionen des Windows-Betriebssystems.
Initialisierung der Kommunikation
Um die Kommunikation mit der DDI-Version 11 der Anzeigetreiber-DLL des Benutzermodus zu initialisieren, lädt die Direct3D-Runtime 11 zuerst die DLL, wenn die DLL noch nicht geladen ist. Die Direct3D-Runtime ruft als Nächstes die OpenAdapter10_2-Funktion des Benutzermodusanzeigetreibers über die Exporttabelle der DLL auf, um eine instance der Grafikkarte zu öffnen. Die OpenAdapter10_2-Funktion ist die einzige exportierte Funktion der DLL.
Hinweis
Die OpenAdapter10_2-Funktion ist mit der OpenAdapter10-Funktion identisch, mit ausnahme der Rückgabe der Tabelle der adapterspezifischen Funktionen des Treibers:
- OpenAdapter10_2 gibt die Tabelle im pAdapterFuncs_2-Member der D3D10DDIARG_OPENADAPTER-Struktur zurück, wobei pAdapterFuncs_2 auf eine D3D10_2DDI_ADAPTERFUNCS-Struktur verweist.
- OpenAdapter10 gibt die Tabelle im pAdapterFuncs-Element von D3D10DDIARG_OPENADAPTER zurück, wobei pAdapterFuncs auf eine D3D10DDI_ADAPTERFUNCS-Struktur zeigt.
OpenAdapter10_2 wurde entwickelt, um die Initialisierung von Treibern effizienter zu gestalten. Sie müssen OpenAdapter10_2 in Ihren Direct3D-Treibern der Version 11 implementieren. Sie können auch OpenAdapter10_2 (anstelle oder zusätzlich zu OpenAdapter10) in Ihren Direct3D-Treibern der Version 10.1 implementieren, um die Initialisierungseffizienz dieser Treiber zu erhöhen. Weitere Informationen zum Implementieren von OpenAdapter10_2 in Direct3D-Treibern der Version 10.1 finden Sie unter Unterstützung der Versionsermittlung. OpenAdapter10_2 übernimmt den Austausch von Versionsverwaltung und anderen Informationen zwischen der Laufzeit und dem Treiber.
Versionsverwaltung
OpenAdapter10_2 und die adapterspezifischen Funktionen des Treibers ändern die Art und Weise, wie die Versionsverwaltung zwischen der Direct3D-API und Direct3D DDI von Direct3D 10 verarbeitet wird (weitere Informationen dazu, wie Direct3D 10 die Versionsverwaltung behandelt, finden Sie unter Initializing Communication with the Direct3D Version 10 DDI( Initializing Communication with the Direct3D Version 10 DDI). Anstatt dass die Direct3D-API auf einen Fehler der OpenAdapter10_2-Funktion des Treibers angewiesen ist, um keine Unterstützung für eine bestimmte Version anzugeben (wie bei OpenAdapter10_2), muss der Treiber explizit die unterstützten DDI-Versionen auflisten. Die Direct3D-Runtime ruft die GetSupportedVersions-Funktion des Benutzermodusanzeigetreibers (eine der adapterspezifischen Funktionen des Treibers) auf, um die vom Treiber unterstützten DDI-Versionen abzufragen.
Es gibt mindestens zwei neue DDI-Versionen für die Direct3D 11 DDI-Funktionen. Jede DDI-Version unterscheidet, ob der DDI unter Windows Vista oder Windows 7 ausgeführt wird. Die Unterstützung von Direct3D 11 DDI bedeutet jedoch nicht unbedingt die vollständige Unterstützung der Hardwarefeatures, die D3D_FEATURE_LEVEL_11 zugeordnet sind. Treiber können die neuen Threadingfeatures des Direct3D 11 DDI mit Hardware unterstützen, die nicht die anderen Features unterstützt, die vom Direct3D 11 DDI verfügbar gemacht werden, z. B. Tessellation usw. Der folgende Code zeigt, wie jede DDI-Version unterschieden wird:
// D3D11.0 on Vista
#define D3D11_DDI_MAJOR_VERSION 11
#define D3D11_0_DDI_MINOR_VERSION ...
#define D3D11_0_DDI_INTERFACE_VERSION \
((D3D11_DDI_MAJOR_VERSION << 16) | D3D11_0_DDI_MINOR_VERSION)
#define D3D11_0_DDI_BUILD_VERSION ...
#define D3D11_0_DDI_SUPPORTED \
((((UINT64)D3D11_0_DDI_INTERFACE_VERSION) << 32) | \
(((UINT64)D3D11_0_DDI_BUILD_VERSION) << 16))
// D3D11.0 on Windows 7
#define D3D11_0_7_DDI_MINOR_VERSION ...
#define D3D11_0_7_DDI_INTERFACE_VERSION \
((D3D11_DDI_MAJOR_VERSION << 16) | D3D11_0_7_DDI_MINOR_VERSION)
#define D3D11_0_7_DDI_BUILD_VERSION ...
#define D3D11_0_7_DDI_SUPPORTED \
((((UINT64)D3D11_0_7_DDI_INTERFACE_VERSION) << 32) | \
(((UINT64)D3D11_0_7_DDI_BUILD_VERSION) << 16))
#ifndef IS_D3D11_WIN7_INTERFACE_VERSION
#define IS_D3D11_WIN7_INTERFACE_VERSION( i ) (D3D11_0_7_DDI_INTERFACE_VERSION == i)
#endif
Informationsaustausch
Neben der Angabe von Versionsinformationen tauscht die OpenAdapter10_2 Funktion des Treibers auch andere Informationen zwischen der Laufzeit und dem Treiber aus.
Im Aufruf der OpenAdapter10_2-Funktion des Treibers stellt die Runtime die PfnQueryAdapterInfoCb-Adapterrückruffunktion im pAdapterCallbacks-Element der D3D10DDIARG_OPENADAPTER-Struktur bereit. Der Anzeigetreiber im Benutzermodus sollte die PfnQueryAdapterInfoCb-Adapterrückruffunktion aufrufen, um die Grafikhardwarefunktionen vom Display-Miniporttreiber abzufragen.
Die Laufzeit ruft die CreateDevice(D3D10) -Funktion des Benutzermodus-Anzeigetreibers (eine der adapterspezifischen Funktionen des Treibers) auf, um ein Anzeigegerät für die Verarbeitung einer Sammlung des Renderzustands zu erstellen und die Initialisierung abzuschließen. Nach Abschluss der Initialisierung kann die Direct3D-Runtime, Version 11, die vom Anzeigetreiber bereitgestellten Direct3D-Funktionen der Version 11 aufrufen, und der Benutzermodusanzeigetreiber kann die von der Laufzeit bereitgestellten Funktionen aufrufen.
Die CreateDevice(D3D10)-Funktion des Benutzermodusanzeigetreibers wird mit einer D3D10DDIARG_CREATEDEVICE-Struktur aufgerufen, deren Member wie folgt eingerichtet sind, um die Version 11 DDI des Benutzermodusanzeigetreibers zu initialisieren:
Die Runtime legt Interface auf die Version der Schnittstelle fest, die die Laufzeit vom Benutzermodusanzeigetreiber benötigt.
Die Runtime legt Version auf eine Zahl fest, die der Treiber verwenden kann, um zu identifizieren, wann die Runtime erstellt wird. Der Treiber kann z. B. die Versionsnummer verwenden, um zwischen einer Runtime zu unterscheiden, die mit Windows Vista veröffentlicht wurde, und einer Runtime, die mit einem nachfolgenden Service Pack veröffentlicht wurde, das möglicherweise einen Fix enthält, den der Treiber benötigt.
Die Runtime legt hRTDevice fest, um das Handle anzugeben, das der Treiber verwenden soll, wenn der Treiber wieder in die Runtime aufruft.
Die Runtime legt hDrvDevice fest, um das Handle anzugeben, das die Laufzeit in nachfolgenden Treiberaufrufen verwendet.
Die Runtime stellt eine Tabelle ihrer gerätespezifischen Rückruffunktionen in der D3DDDI_DEVICECALLBACKS-Struktur bereit, auf die pKTCallbacks verweist. Der Anzeigetreiber für den Benutzermodus ruft die von der Laufzeit bereitgestellten Rückruffunktionen auf, um auf Kernelmodusdienste im Display-Miniporttreiber zuzugreifen.
Der Benutzermodusanzeigetreiber gibt eine Tabelle seiner gerätespezifischen Funktionen in der D3D11DDI_DEVICEFUNCS-Struktur zurück, auf die p11DeviceFuncs zeigt.
Die Runtime stellt eine DXGI_DDI_BASE_ARGS-Struktur bereit, auf die DXGIBaseDDI verweist. Die Runtime und der Benutzermodusanzeigetreiber stellen ihre DirectX-Grafikinfrastruktur-DDI für diese Struktur bereit.
Die Laufzeit legt hRTCoreLayer fest, um das Handle anzugeben, das der Treiber verwenden soll, wenn der Treiber zurück in die Laufzeit ruft, um auf die Direct3D 10-Kernfunktionalität zuzugreifen (d. h. in Aufrufen der Funktionen, die vom p11UMCallbacks-Member angegeben werden).
Die Runtime stellt eine Tabelle ihrer Wichtigsten Rückruffunktionen in der D3D11DDI_CORELAYER_DEVICECALLBACKS-Struktur bereit, auf die p11UMCallbacks verweist. Der Benutzermodusanzeigetreiber ruft die von der Laufzeit bereitgestellten Kernrückruffunktionen auf, um den Zustand zu aktualisieren.