根簽章概觀

根簽章是由應用程式設定,並將命令清單連結至著色器所需的資源。 圖形命令清單同時具有圖形和計算根簽章。 計算命令清單只會有一個計算根簽章。 這些根簽章彼此獨立。

根參數和引數

根簽章類似于 API 函式簽章,它會決定著色器應該預期的資料類型,但不會定義實際的記憶體或資料。 根參數是根簽章中的一個專案。 在執行時間設定和變更的根參數實際值稱為 根引數。 變更根引數會變更著色器讀取的資料。

根常數、描述元和資料表

根簽章可以包含三種類型的參數;根常數 (根引數內嵌在根引數) 、根描述元 (描述元內嵌在根引數) ,以及描述中繼資料表 (描述元指標) 。

根常數是內嵌的 32 位值,這些值會顯示在著色器中做為常數緩衝區。

內嵌根描述元應該包含最常存取的描述元,但僅限於 CBV,以及原始或結構化 UAV 或 SRV 緩衝區。 更複雜的類型,例如 2D 紋理 SRV,無法當做根描述元使用。 根描述元不包含大小限制,因此與描述元堆積中的描述元不同,這不包括大小。

根簽章中的描述中繼資料表專案包含描述元、HLSL 著色器系結名稱和可見度旗標。 如需著色器名稱的詳細資訊,請參閱 著色器模型 5.1 。 在某些硬體上,只有著色器階段能夠看見描述元, (參考 D3D12_SHADER_VISIBILITY) ,才能獲得效能提升。

根描述中繼資料表專案

根簽章的配置相當有彈性,但某些條件約束會加在較不具功能的硬體上。 不論硬體層級為何,應用程式一律應該嘗試視需要將根簽章設為小,以達到最大效率。 應用程式可以在根簽章中取捨更多描述中繼資料表,但根常數的空間較少,反之亦然。

每當任何部分的內容在繪製 (圖形) /dispatch (計算) 呼叫時,應用程式系結的根簽章內容 (目錄資料表、根常數和根描述元) 系結的 D3D12 驅動程式會自動建立版本。 因此,每個繪製/分派都會取得一組唯一的完整根簽章狀態。

在理想情況下,管線狀態物件群組 (PS) 共用相同的根簽章。 在管線上設定根簽章之後,其定義的所有系結 (描述中繼資料表、描述元、常數) 可以個別設定或變更,包括繼承至套件組合。

應用程式可以在想要多少描述中繼資料表與內嵌描述元之間做出取捨, (需要更多空間,但移除間接取捨) 與內嵌常數 (在根簽章中沒有間接性) 。 應用程式應該盡可能謹慎地使用根簽章,依賴應用程式控制的記憶體,例如指向它們來表示大量資料的堆積和描述元堆積。

根簽章