Freigeben über


Multihead (Direct3D 9)

Multihead-Karten sind solche, die über einen gemeinsamen Framepuffer und -beschleuniger, unabhängige Digital-analog-Konverter (DACs) und Monitorausgänge verfügen. Solche Geräte bieten viel mehr verwendbare Unterstützung für mehrere Monitore als eine ähnliche Anzahl heterogener Grafikkarten.

Multiheadkarten werden in der API als einzelnes Gerät auf API-Ebene verfügbar gemacht, das mehrere Vollbild-Swapchains steuern kann. Folglich werden alle Ressourcen mit allen Köpfen geteilt, und jeder Kopf verfügt über genau die gleichen Funktionen. Jeder Kopf kann auf unabhängige Anzeigemodi festgelegt werden. Sie können separate Aufrufe von IDirect3DSwapChain9::P resent verwenden, um jeden Kopf zu aktualisieren. Sie können auch einen Aufruf von IDirect3DDevice9::P resent verwenden, um jeden Kopf sequenziell zu aktualisieren.

Hinweis

Die Aktualisierung jedes Haupts erfolgt nicht gleichzeitig mit einem einzelnen Aufruf von IDirect3DDevice9::P resent. Aktuelle Statistiken in Direct3D 9Ex können die D3DPRESENTSTATS-Struktur verwenden, um die Aktualisierungen an jedem Kopf nah beieinander zu halten, um die Tearing-Effekte auf mehrere Köpfe von Adaptern zu begrenzen. Informationen zum Synchronisieren von Frames von Direct3D 9Ex-Flipmodellanwendungen finden Sie unter Direct3D 9Ex-Verbesserungen.

 

Jede Swapchain für ein Gerät mit mehreren Köpfen muss vollbildig sein. Wenn ein Gerät in den Multihead-Modus gewechselt ist, muss es im Vollbildmodus bleiben. Der Übergang zurück in den Fenstermodus erfordert die Zerstörung des Geräts (mit Ausnahme des normalen ALT+TAB-Vorgangs zur Minimierung).

Die alte Methode, den Videospeicher zwischen den Köpfen zu teilen und jeden Kopf als vollständig unabhängigen Beschleuniger zu behandeln, wird weiterhin ein gängiges Verwendungsszenario sein. Dieser Vorschlag ersetzt diesen Mechanismus nur, wenn die Anwendung speziell so codiert wurde, dass sie im Direct3D 9-Multiheadmodus funktioniert.

Die Fahrer verfügen über ausreichende Kenntnisse, um zwischen den beiden Betriebsmodi zu wechseln.

Ein Kopf wird als master Kopf bezeichnet, und alle anderen Köpfe auf demselben Karte als untergeordnete Köpfe bezeichnet werden. Wenn mehr als ein Multiheadadapter in einem System vorhanden ist, werden der master und seine untergeordneten Elemente aus einem Multiheadadapter als Gruppe bezeichnet. Gruppen werden durch die Adapter-Ordnungszahl ihrer master Kopf gekennzeichnet.

Die D3DCAPS9-Struktur wurde aktualisiert, um die folgenden neuen Hardwarekappen verfügbar zu machen.

UINT NumberOfAdaptersInGroup; 
UINT MasterAdapterOrdinal; 
UINT AdapterOrdinalInGroup;
  • NumberOfAdaptersInGroup ist für herkömmliche Adapter 1 und größer als 1 für den master-Adapter eines multihead-Karte. Der Wert ist 0 für einen untergeordneten Adapter eines multihead-Karte. Jeder Karte kann höchstens eine master, aber möglicherweise viele untergeordnete Elemente haben.
  • MasterAdapterOrdinal gibt an, welches Gerät das master für dieses untergeordnete Gerät ist.
  • AdapterOrdinalInGroup gibt die Reihenfolge an, in der von der API auf Köpfe verwiesen wird. Der master Adapter verfügt immer über AdapterOrdinalInGroup 0. Diese Werte entsprechen nicht den an die IDirect3D9-Methoden übergebenen Adapter-Ordinalen, sondern gelten nur für Köpfe innerhalb einer Gruppe.

Mit dieser Definition können Multiheadkarten weiterhin mehrere Adapter so darstellen, als wären sie unabhängige Karten, genau wie in DirectX 8.

Um ein Multihead-Gerät zu erstellen, geben Sie das Verhaltensflag D3DCREATE_ADAPTERGROUP_DEVICE in IDirect3D9::CreateDevice an. Die Präsentationsparameter (ein Array von D3DPRESENT_PARAMETERS) sollten NumberOfAdaptersInGroup-Elemente enthalten. Die Runtime weist jedem Kopf jedes Element in der numerischen Reihenfolge AdapterOrdinalInGroup zu. Wenn D3DCREATE_ADAPTERGROUP_DEVICE festgelegt ist, muss jeder Präsentationsparameter Folgendes aufweisen:

  • Der Windowed-Member ist auf FALSE festgelegt (mit anderen Worten, vollbildig sein).
  • Der gleiche Wert für das EnableAutoDepthStencil-Element von D3DPRESENT_PARAMETERS.

Wenn EnableAutoDepthStencil auf TRUE festgelegt ist, muss jedes der folgenden Felder für jedes D3DPRESENT_PARAMETERS den gleichen Wert aufweisen:

  • AutoDepthStencilFormat
  • BackBufferWidth
  • BackBufferHeight
  • BackBufferFormat

Wenn DAC festgelegt ist, sind zusätzliche Aufrufe von IDirect3DDevice9::CreateAdditionalSwapChain unzulässig.

Wenn das Gerät mit der DAC erstellt wurde, erwartet IDirect3DDevice9::Reset ein Array von D3DPRESENT_PARAMETERS.

Jede D3DPRESENT_PARAMETERS Struktur, die an IDirect3DDevice9::Reset übergeben wird, muss Vollbildmodus sein. Um wieder in den Fenstermodus zu wechseln, muss die Anwendung das Gerät zerstören und ein Nicht-Multihead-Gerät im Fenstermodus neu erstellen.

Hier sehen Sie ein einfaches Nutzungsszenario:

1. Create multihead device 
2. For each swap chain of device:
   3. Call GetBackBuffer for the i-th swapchain
   4. Call SetRenderTarget 
   5. Call DrawPrimitive 
   6. Optionally call swapchain::Present (or wait until 
all swap chains are drawn and present outside of loop)
7. End the for loop
8. Optionally present all swap chains with device::Present

Weitere Informationen finden Sie unter IDirect3D9::CreateDevice und IDirect3DDevice9::GetNumberOfSwapChains.

Programmiertipps