使用根簽章

根簽章是任意排列描述中繼資料表集合的定義, (包括其配置) 、根常數和根描述元。 每個專案都有最大限制的成本,因此應用程式可以取捨根簽章將包含之每種類型的專案之間的餘額。

根簽章是物件,可透過 API 上的手動規格來建立。 PSO 中的所有著色器都必須與 PSO 指定的根配置相容,否則個別著色器必須包含彼此相符的內嵌根配置;否則,PSO 建立將會失敗。 根簽章的其中一個屬性是著色器不需要在撰寫時知道它,但如有需要,也可以直接在著色器中撰寫根簽章。 現有的著色器資產不需要任何變更才能與根簽章相容。 引進著色器模型 5.1 以提供一些額外的彈性, (著色器內描述元的動態索引編制) ,而且可以從現有的著色器資產開始,視需要累加採用。

命令清單語意

在命令清單的開頭,根簽章是未定義的。 圖形著色器具有與計算著色器不同的根簽章,每個簽章分別指派在命令清單上。 命令清單或套件組合上設定的根簽章也必須符合目前在 Draw/Dispatch 設定的 PSO;否則,行為為未定義。 繪製/分派之前的暫時性根簽章不相符-例如,在切換至相容的根簽章之前設定不相容的 PSO,只要在繪製/分派) 時,這些簽章就 (相容。 設定 PSO 不會變更根簽章。 應用程式必須呼叫專用 API 來設定根簽章。

在命令清單上設定根簽章之後,配置會定義應用程式預期提供的一組系結,以及哪些 PSO 可以使用 (針對下一個繪製/分派呼叫使用相同的配置編譯) 。 例如,應用程式可以定義根簽章,以擁有下列專案。 每個專案稱為「位置」。

  • [0] CBV 描述元內嵌 (根描述元)
  • [1] 描述項資料表,其中包含 2 個 SRV、1 個 CBV 和 1 個 UAV
  • [2] 包含 1 個取樣器的描述中繼資料表
  • [3] 根常數的 4x32 位集合
  • [4] 描述項資料表,其中包含未指定的 SRV 數目

在此情況下,在能夠發出 Draw/Dispatch 之前,應用程式應該會將適當的系結設定為應用程式使用其目前根簽章定義的每個位置 [0..4]。 例如,在位置 [1],描述項資料表必須系結,這是描述元堆積中連續的區域,其中包含 (,或將在執行時包含) 2 SRV、1 CBV 和 1 UAV。 同樣地,描述項資料表必須設定在位置 [2] 和 [4]。

應用程式一次可以變更根簽章系結的一部分, (其餘部分保持不變) 。 例如,如果需要在繪圖之間變更的唯一專案是位置 [2] 的其中一個常數,也就是所有應用程式都需要重新系結。 如先前所述,驅動程式/硬體會版本所有根簽章系結狀態,因為它會自動修改。 如果在命令清單上變更根簽章,則所有先前的根簽章系結都會過時,而且所有新預期的系結都必須在繪製/分派之前設定;否則,行為為未定義。 如果根簽章已備援設定為目前設定的相同簽章,現有的根簽章系結就不會過時。

套件組合語意

套件組合會繼承命令清單的根簽章系結, (上述命令清單範例中各種位置的系結) 。 如果套件組合需要變更某些繼承的根簽章系結,它必須先將根簽章設定為與呼叫命令清單相同, (繼承的系結不會變成過時) 。 如果套件組合將根簽章設定為與呼叫命令清單不同,其效果與變更上述命令清單上的根簽章相同:所有先前的根簽章系結都過時,而且必須在 Draw/Dispatch 之前設定新預期的系結;否則,行為為未定義。 如果套件組合不需要變更任何根簽章系結,就不需要設定根簽章。

下列程式碼顯示套件組合中的範例呼叫流程。

// Command List
...
pCmdList->SetGraphicsRootSignature(pRootSig); // new parameter space
MyEngine_SetTextures(); // bundle inherits descriptor table setting
MyEngine_SetAnimationFactor(fTime); // bundle inherits root constant
pCmdList->ExecuteBundle(...);
...
// Bundle
pBundle->SetGraphicsRootSignature(pRootSig); // same as caller, in order to inherits bindings
pBundle->SetPipelineState(pPS); 
pBundle->SetGraphicsRoot32BitConstant(drawConstantsSlot,0,drawIDOffset);
pBundle->Draw(...); // using inherited textures / animation factor
pBundle->SetGraphicsRoot32BitConstant(drawConstantsSlot,1,drawIDOffset);
pBundle->Draw(...);
...

從套件組合推出時,套件組合所做的任何根配置變更和/或系結變更,都會在套件組合完成執行時繼承回呼叫命令清單。

如需繼承的詳細資訊,請參閱在 Direct3D 12 中管理圖形管線狀態的圖形管線狀態繼承一節。

根簽章