Freigeben über


Unterstützung von Threading, Befehlslisten und 3D-Pipeline

Dieser Abschnitt gilt nur für Windows 7 und höher sowie Windows Server 2008 R2 und höhere Versionen des Windows-Betriebssystems.

Ein Anzeigetreiber für den Benutzermodus gibt die neuen Funktionen von Direct3D Version 11 an, die er unterstützt (z. B. Threading, Befehlslisten und 3D-Pipeline), wenn die Direct3D-Laufzeitversion 11 die GetCaps(D3D10_2) -Funktion des Treibers aufruft. GetCaps(D3D10_2) ist eine der adapterspezifischen Funktionen des Treibers, die der Treiber in der D3D10_2DDI_ADAPTERFUNCS-Struktur bereitstellt, auf die der pAdapterFuncs_2 Member der D3D10DDIARG_OPENADAPTER-Struktur zeigt. Weitere Informationen zum Bereitstellen adapterspezifischer Funktionen während der Treiberinitialisierung finden Sie unter Initialisieren der Kommunikation mit direct3D Version 11 DDI. Wenn die GetCaps(D3D10_2)-Funktion aufgerufen wird, stellt der Anzeigetreiber im Benutzermodus neue Direct3D-Funktionen der Version 11 bereit, die auf dem Anforderungstyp basieren (der im Type-Member der D3D10_2DDIARG_GETCAPS-Struktur angegeben ist, auf die der pData-Parameter der Funktion GetCaps(D3D10_2) verweist).

Threading und Befehlslisten

Die Direct3D-API, Version 11, erfordert einen Betriebsmodus, in dem die Anwendungsthreads synchronisiert werden können, um sicherzustellen, dass jeweils nur einer der Threads im DDI ausgeführt wird. Die Direct3D-API, Version 11, erfordert auch einen Betriebsmodus mit einer Softwareemulation von Befehlslisten. Diese Betriebsmodi werden von DDIs mit früheren Versionen (z. B. Direct3D Version 10 DDI) benötigt und genutzt. Daher werden diese Betriebsmodi als Entwicklungshilfe für Treiberschreiber auf die Direct3D-Version 11 DDI erweitert. Treiberautoren können entscheiden, welche Betriebsmodi von ihren Treibern für direct3D Version 11 DDI unterstützt werden sollen.

Alle Treiber sollten schließlich alle Arten von Threadingvorgängen vollständig unterstützen (d. a. alle Treiber sollten schließlich alle Threadingfunktionen der D3D11DDI_THREADING_CAPS-Struktur unterstützen). Der Treiber kann jedoch verlangen, dass die API Befehlslisten emuliert oder einen Singlethread-Betriebsmodus für den Treiber erzwingt. Die API muss die Threadingfunktionen des Treibers während der Erstellung eines API-Geräts kennen, jedoch vor der Erstellung eines DDI-Geräts. Daher bestimmt die Runtime die Threadingfunktionen des Treibers, wenn sie die getCaps(D3D10_2) -adapterspezifische Funktion des Treibers aufruft, wobei der Type-Member von D3D10_2DDIARG_GETCAPS auf D3D11DDICAPS_THREADING festgelegt ist. Der Treiber gibt einen Zeiger auf eine D3D11DDI_THREADING_CAPS-Struktur im pData-Member von D3D10_2DDIARG_GETCAPS zurück, der die Threadingfunktionen des Treibers identifiziert. Der Treiber muss den Freethreadmodus (D3D11DDICAPS_FREETHREADED) unterstützen, wenn der Treiber auch Befehlslisten (D3D11DDICAPS_COMMANDLISTS_BUILD_2) unterstützt, da Befehlslisten im Freethreadmodus erstellt werden. Der Treiber muss sich anmelden, um den Freethreadmodus und Befehlslisten zu unterstützen. Die Anwendung kann die Unterstützung ermitteln, die der Treiber durch die Verwendung der CheckFeatureSupport-Funktion auf Anwendungsebene und der D3D11_FEATURE_THREADING Konstanten angegeben hat. Einige Anwendungen sind jedoch aufgrund der Von der API bereitgestellten Unterstützung möglicherweise nicht wichtig.

3D-Pipelineebene

Treiber, die direct3D Version 11 DDI unterstützen, müssen nicht alle Hardwarefeatures von Direct3D Version 11 DDI unterstützen. Treiber können das neue Threadingmodell von Direct3D Version 11 DDI zusätzlich zu Hardware unterstützen, die nur direct3D Version 10 DDI unterstützt. Die Direct3D-Runtime, Version 11, bestimmt die maximale Hardwareunterstützungsebene des Treibers, wenn die Runtime die GetCaps(D3D10_2) -Funktion des Treibers aufruft, wobei der Type-Member von D3D10_2DDIARG_GETCAPS auf D3D11DDICAPS_3DPIPELINESUPPORT festgelegt ist. Der Treiber gibt einen Zeiger auf eine D3D11DDI_3DPIPELINESUPPORT_CAPS-Struktur im pData-Member von D3D10_2DDIARG_GETCAPS zurück, der die maximale Hardwareunterstützungsstufe angibt.

Die API verwendet nicht nur die DDI-Version als primären Indikator für die Unterstützung auf API-Featureebene. die API ermöglicht es dem Treiber, wieder in diesen Prozess einzuspeisen. Die Laufzeit wählt einen D3D11DDI_3DPIPELINELEVEL Wert aus und leitet den Wert während der Geräteerstellung in einem Aufruf der CreateDevice(D3D10) -Funktion des Treibers als Teil des Flags-Elements der D3D10DDIARG_CREATEDEVICE-Struktur zurück.

Wenn der Treiber Hardwareebenen unterstützt, die kleiner sind als Direct3D Version 11 für Direct3D Version 11 DDI, gibt es geringfügige Auswirkungen auf den Betrieb des Treibers. Die erste ist, dass die Direct3D-Runtime, Version 11, möglicherweise überhaupt nie viele neue Direct3D-DDI-Funktionen der Version 11 aufruft. Beispielsweise ruft die Direct3D-Runtime, Version 11, keine der neuen DDI-Funktionen der Shaderphase (wie DsSetShader) auf, wenn der Treiber eine Hardwarefeatureebene unterstützt, die kleiner als Direct3D Version 11 ist. Andere DDI-Funktionen befolgen die Regeln der Featureebene und ignorieren die Tatsache, dass die Direct3D-Version 11 DDI möglicherweise mit höheren Funktionen verbunden ist. Obwohl beispielsweise IAVertexInputSlots für die Direct3D-API version 11 32 ist, lässt die Direct3D-Version 10-Featureebene nur 16 zu, und das sollte der Treiber erwarten.

Veraltete oder konvertierte Features stellen einen weiteren interessanten Aspekt dar. Die Deaktivierung ist auf der DDI-Ebene der Direct3D-Version 11 nicht möglich, da die Einstellung die Möglichkeit unterstützen muss, DDI-Funktionen früherer Versionen auszudrücken. Beispielsweise ist die Direct3D 11-API-Version von PIPELINESTATS immer konstant. es werden jedoch verschiedene D3D10_DDI_QUERY_DATA_PIPELINE_STATISTICS mit Direct3D 10-Featureebenen und D3D11_DDI_QUERY_DATA_PIPELINE_STATISTICS mit Direct3D 11-Featureebenen usw. angefordert. Obwohl die API versucht hat, die Textfiltergröße als veraltet zu kennzeichnen, ist es für Treiber einfacher, den DDI-Funktionstabelleneintrag in seiner Gesamtheit als den Funktionstabelleneintrag wieder zu verwenden.

Auch wenn ein Treiber, der direct3D Version 11 DDI unterstützt, nicht die vollständige Direct3D-Version 11-Featureebene unterstützt, kann der Treiber die "erweiterte Formaterkennung" nicht deaktivieren, wie unter Unterstützung des Bewusstseins für erweitertes Format beschrieben. Da der Treiber direct3D Version 11 DDI unterstützt, sollte der Treiber die folgenden Aufgaben ausführen:

  • Unterstützung von BGR-Formaten

  • Reagieren Sie ordnungsgemäß auf Aufrufe der CheckFormatSupport-Funktion , um nach XR_BIAS Unterstützung zu suchen. Der Treiber sollte entweder Support anfordern oder den Support verweigern.

  • Umwandlung vollständig typisierter Rückpuffer zulassen

Die Direct3D-API, Version 11, informiert den Treiber auch darüber, ob die Anwendung mehrere Threads über das flag D3D11DDI_CREATEDEVICE_FLAG_SINGLETHREADED verwendet. Wenn dieses Flag im Flags-Member der D3D10DDIARG_CREATEDEVICE-Struktur vorhanden ist, wenn ein Anzeigegerät durch einen Aufruf der CreateDevice(D3D10) -Funktion des Treibers erstellt wird, kann der Treiber feststellen, dass keine verzögerten Kontexte erstellt werden und dass der Treiber nicht synchronisiert werden muss, da keine gleichzeitigen Erstellungen stattfinden.