使用根簽名
根簽章是任意排列描述元數據表集合的定義(包括其配置)、根常數和根描述元。 每個專案都有最高限制的成本,因此應用程式可以在根簽章所包含的每一種專案類型之間取捨平衡。
根簽章是可由 API 手動規格建立的物件。 PSO 中的所有著色器都必須與 PSO 指定的根配置兼容,否則個別著色器必須包含彼此相符的內嵌根配置;否則,PSO 建立將會失敗。 根簽章的一個屬性是著色器在撰寫時不需要知道它,不過如有需要,也可以直接在著色器中撰寫根簽章。 現有的著色器資產不需要任何變更即可與根簽章相容。 導入著色器模型 5.1 以提供一些額外的彈性(著色器內描述項的動態索引),而且可以從所需的現有著色器資產開始累加採用。
命令清單語意
在命令清單的開頭,根簽章是未定義的。 圖形著色器具有與計算著色器不同的根簽章,每個簽章都會在命令清單上個別指派。 命令清單或套件組合上的根簽章集也必須符合目前在 Draw/Dispatch 上設定的 PSO;否則,行為是未定義的。 在 Draw/Dispatch 之前,暫時出現的根簽章不匹配是可以接受的,例如在切換到相容的根簽章之前,設置不相容的 PSO(前提是當 Draw/Dispatch 被呼叫時,這些設置已經相容)。 設定 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 中管理圖形管線狀態的 圖形管線狀態繼承 一節。
相關主題