Udostępnij za pośrednictwem


Multihead (Direct3D 9)

Karty wielorzędowe to te, które mają wspólny bufor i akcelerator ramowy, niezależne konwertery cyfrowe-analogowe (DAC) i monitorują dane wyjściowe. Takie urządzenia mogą oferować znacznie większą obsługę wielu monitorów niż podobna liczba heterogenicznych kart wyświetlania.

Karty wielorzędowe są widoczne w interfejsie API jako jedno urządzenie na poziomie interfejsu API, które może obsługiwać kilka łańcuchów zamian pełnoekranowych. W związku z tym wszystkie zasoby są współużytkowane ze wszystkimi głowami, a każda głowa ma dokładnie te same możliwości. Każdy nagłówek można ustawić na tryby wyświetlania niezależnego. Aby odświeżyć każdą głowę, możesz użyć oddzielnych wywołań do IDirect3DSwapChain9::P resent. Możesz również użyć jednego wywołania do IDirect3DDevice9::P resent, aby odświeżyć każdą głowę sekwencyjnie.

Nuta

Odświeżanie każdej głowy nie jest wykonywane jednocześnie z jednym wywołaniem do IDirect3DDevice9::P resent. Obecne statystyki w direct3D 9Ex mogą używać struktury D3DPRESENTSTATS, aby zachować odświeżanie do każdej głowy blisko siebie, aby ograniczyć efekty rozdzierania na wielu głowicach adapterów. Aby uzyskać informacje o synchronizowaniu ramek aplikacji modelu flip model Direct3D 9D, zobacz Direct3D 9Ex Improvements (Ulepszenia funkcji Direct3D 9Ex).

 

Każdy łańcuch wymiany dla urządzenia wielorzędowego musi być pełnoekranowy. Gdy urządzenie zostało w trybie wielorzędowym, musi pozostać pełnoekranowe. Przejście z powrotem do trybu okiennego wymaga zniszczenia urządzenia (z wyjątkiem normalnej operacji ALT+TAB-to-minimal).

Stara metoda dzielenia pamięci wideo między głowami i traktowania każdej głowy jako w pełni niezależnego akceleratora nadal będzie typowym scenariuszem użycia. Ten wniosek nie zastępuje tego mechanizmu, chyba że aplikacja została specjalnie zakodowana do działania w trybie wielorzędowym Direct3D 9.

Sterowniki otrzymują odpowiednią wiedzę, aby przełączać się między dwoma trybami działania.

Jedna głowa będzie nazywana głową główną, a wszystkie inne głowy na tej samej karcie będą nazywane głowami podrzędnymi. Jeśli w systemie znajduje się więcej niż jedna karta wielorzędowa, główny i jego podwładni z jednej karty wielorzutowej są nazywane grupą. Grupy są oznaczane przez karty porządkowe ich głównej głowy.

Struktura D3DCAPS9 została zaktualizowana, aby uwidocznić następujące nowe limity sprzętu.

UINT NumberOfAdaptersInGroup; 
UINT MasterAdapterOrdinal; 
UINT AdapterOrdinalInGroup;
  • Parametr NumberOfAdaptersInGroup jest 1 dla konwencjonalnych kart i większy niż 1 dla karty głównej karty wielorzędowej. Wartość będzie wynosić 0 dla podrzędnej karty wielorzędowej. Każda karta może mieć co najwyżej jeden wzorzec, ale może mieć wiele podwładnych.
  • MasterAdapterOrdinal wskazuje, które urządzenie jest wzorcem dla tego podrzędnego.
  • AdapterOrdinalInGroup wskazuje kolejność odwoływania się do głów przez interfejs API. Karta główna zawsze ma element AdapterOrdinalInGroup 0. Te wartości nie odpowiadają zwykle kartom przekazywanym do metod IDirect3D9, ale dotyczą tylko głów w grupie.

Ta definicja umożliwia kartom wielorzędowym dalsze prezentowanie wielu kart tak, jakby były niezależnymi kartami, tak jak w przypadku directX 8.

Aby utworzyć urządzenie wielorzędowe, określ flagę zachowania D3DCREATE_ADAPTERGROUP_DEVICE w IDirect3D9::CreateDevice. Parametry prezentacji (tablica D3DPRESENT_PARAMETERS) powinny zawierać elementy NumberOfAdaptersInGroup. Środowisko uruchomieniowe przypisze każdy element do każdej głowy w kolejności liczbowej AdapterOrdinalInGroup. Po ustawieniu D3DCREATE_ADAPTERGROUP_DEVICE każdy parametr prezentacji musi mieć:

  • Element członkowski okna ustawiony na wartość FALSE (innymi słowy, jest pełnoekranowy).
  • Ta sama wartość elementu członkowskiego EnableAutoDepthStencil D3DPRESENT_PARAMETERS.

Ponadto jeśli wartość EnableAutoDepthStencil jest true, każde z następujących pól musi mieć taką samą wartość dla każdego D3DPRESENT_PARAMETERS:

  • AutoDepthStencilFormat
  • BackBufferWidth
  • BackBufferHeight
  • BackBufferFormat

Jeśli funkcja DAC jest ustawiona, dodatkowe wywołania IDirect3DDevice9::CreateAdditionalSwapChain są nielegalne.

Jeśli urządzenie zostało utworzone przy użyciu usługi DAC, IDirect3DDevice9::Reset będzie oczekiwać tablicy D3DPRESENT_PARAMETERS.

Każda struktura D3DPRESENT_PARAMETERS przekazana do IDirect3DDevice9::Reset musi być pełnoekranowa. Aby przełączyć się z powrotem do trybu okiennego, aplikacja musi zniszczyć urządzenie i ponownie utworzyć urządzenie inne niż wielorzędowe w trybie okna.

Oto podstawowy scenariusz użycia:

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

Aby uzyskać więcej informacji, zobacz IDirect3D9::CreateDevice i IDirect3DDevice9::GetNumberOfSwapChains.

porady dotyczące programowania