Multihead (Direct3D 9)

多頭卡是具有通用框架緩衝區和加速器、獨立的數位對類比轉換器, (DAC) ,以及監視輸出。 這類裝置可提供比類似數目異質顯示器介面卡更多的可用多個監視器支援。

多頭卡會在 API 中公開為單一 API 層級裝置,可驅動數個全螢幕交換鏈結。 因此,所有資源都會與所有頭部共用,而且每個前端都有完全相同的功能。 每個前端都可以設定為獨立的顯示模式。 您可以使用對 IDirect3DSwapChain9::P resent 的個別呼叫來重新整理每個前端。 您也可以使用 一個 IDirect3DDevice9::P resent 呼叫來循序重新整理每個前端。

注意

每次呼叫 IDirect3DDevice9::P resent時,不會同時重新整理每個前端。 Direct3D 9Ex 中的呈現統計資料可以使用 D3DPRESENTSTATS 結構,讓每個頭部保持彼此接近的重新整理,以限制多張配接器頭部的卸載效果。 如需同步處理 Direct3D 9Ex 翻轉模型應用程式框架的詳細資訊,請參閱 Direct3D 9Ex 改善

 

多頭裝置的每個交換鏈結都必須是全螢幕。 當裝置進入多頭模式時,它必須保持全螢幕。 轉換回視窗模式需要解構裝置 (,但正常 ALT+TAB 到最小化作業) 除外。

在頭部之間分割視訊記憶體並將每個頭部視為完全獨立加速器的舊方法,仍然是常見的使用案例。 除非應用程式已特別編碼為在 Direct3D 9 多頭模式中運作,否則此提案不會取代該機制。

驅動程式具備足夠的知識,以在兩種作業模式之間切換。

一個頭部會稱為主要頭部,而同一張卡片上的所有其他頭部則稱為次級頭部。 如果系統中有一個以上的多頭介面卡,則來自一個多頭介面卡的主卡及其從屬稱為群組。 群組是由主要前端的配接器序數表示。

已更新 D3DCAPS9結構,以公開下列新的硬體端點。

UINT NumberOfAdaptersInGroup; 
UINT MasterAdapterOrdinal; 
UINT AdapterOrdinalInGroup;
  • NumberOfAdaptersInGroup 是傳統介面卡的 1,多頭卡的主介面卡大於 1。 多頭卡的次級介面卡值將會是 0。 每個卡片最多可以有一個主圖形,但可能會有許多次級。
  • MasterAdapterOrdinal 指出哪個裝置是這個次級的主要裝置。
  • AdapterOrdinalInGroup 指出 API 參考頭部的順序。 主要配接器一律具有 AdapterOrdinalInGroup 0。 這些值不會對應至傳遞至 IDirect3D9 方法的配接器序數,但只適用于群組內的頭部。

此定義可讓多頭卡片繼續呈現多個介面卡,就像是獨立卡片一樣,就像在 DirectX 8 中一樣。

若要建立多頭裝置,請在 IDirect3D9::CreateDevice中指定行為旗標D3DCREATE_ADAPTERGROUP_DEVICE。 簡報參數 (D3DPRESENT_PARAMETERS) 陣列應該包含 NumberOfAdaptersInGroup 元素。 執行時間會以 AdapterOrdinalInGroup 數值順序將每個元素指派給每個前端。 設定D3DCREATE_ADAPTERGROUP_DEVICE時,每個簡報參數都必須具有:

  • Windowed 成員設定為 FALSE (,換句話說,為全螢幕) 。
  • D3DPRESENT_PARAMETERS EnableAutoDepthStencil 成員的相同值。

此外,如果 EnableAutoDepthStencil 為 TRUE,則下列每個欄位都必須為每個 D3DPRESENT_PARAMETERS具有相同的值:

  • AutoDepthStencilFormat
  • BackBufferWidth
  • BackBufferHeight
  • BackBufferFormat

如果設定 DAC, 則 IDirect3DDevice9::CreateAdditionalSwapChain 的其他呼叫不合法。

如果裝置是使用 DAC 建立的, IDirect3DDevice9::Reset 預期會有 D3DPRESENT_PARAMETERS陣列。

傳遞至IDirect3DDevice9::Reset的每個D3DPRESENT_PARAMETERS結構都必須是全螢幕。 若要切換回視窗模式,應用程式必須終結裝置,並在視窗模式中重新建立非多頭裝置。

以下是基本使用案例:

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

如需詳細資訊,請參閱 IDirect3D9::CreateDeviceIDirect3DDevice9::GetNumberOfSwapChains

程式設計提示