進階使用描述中繼資料表
下列各節提供描述中繼資料表進階用法的相關資訊。
變更轉譯呼叫之間的描述中繼資料表專案
在將設定描述中繼資料表集的命令清單提交至佇列以供執行之後,應用程式不得從 CPU 編輯 GPU 可能參考的描述元堆積部分,直到應用程式知道 GPU 已使用參考完成為止。
工作完成可以使用 API 柵欄來追蹤 GPU 進度,或更粗略的機制來判斷完成工作,例如等候轉譯已傳送給顯示 - 任何符合應用程式的情況。 如果應用程式知道只會存取描述項資料表所指向的區域子集, (表示因為著色器中的流程式控制制) ,其他未推斷的描述元仍無法變更。 如果應用程式需要在轉譯呼叫之間切換不同的描述中繼資料表,應用程式可以選擇幾個方法:
- 描述項資料表版本設定:針對命令清單所參考的每個唯一描述元集合,建立 (或) 重複使用個別描述中繼資料表。 編輯並重複使用先前在描述元堆積上填入的區域時,應用程式必須先確定 GPU 已完成使用將回收之描述元堆積的任何部分。
- 動態索引:應用程式可以在繪製/分派 (之間排列不同物件,或甚至是在描述元堆積範圍中的繪圖) 內變更、定義跨越所有描述元的描述中繼資料表,以及從著色器,在著色器執行期間使用資料表的動態索引,以選取要使用的物件。
- 直接將描述項放在根簽章中。 只有非常少量的描述元可以透過這種方式管理,因為根簽章空間有限。
使用描述中繼資料表版本設定的含意是,必須針對圖形管線所參考的每個唯一描述元集合,針對可能執行、排入佇列執行或在任何指定時間記錄的每個命令清單,將描述元記憶體從描述元堆積中擷取。
D3D12 負責管理透過描述元堆積和描述中繼資料表管理的物件類型版本控制給應用程式。 其中一個優點是應用程式可以選擇盡可能重複使用描述中繼資料表內容,而不是一律為每個命令清單提交定義新的描述中繼資料表版本。 根簽章是 D3D12 驅動程式自動版本的空間。
能夠將多個描述中繼資料表系結至根簽章 (,因此一次系結至管線) ,可讓應用程式視需要以不同頻率分組和切換描述元參考集。 例如,應用程式可能會使用少量 (可能只有一個很少變更的大型靜態描述中繼資料表) ,或基礎描述元堆積記憶體中的哪些區域會視需要填入,並使用著色器動態索引來選取紋理。 同時,應用程式可以維護另一個資源類別,其中每個繪製呼叫所參考的集合會使用描述中繼資料表版本控制技術從 CPU 切換。
超出範圍索引編制
從著色器編制任何描述中繼資料表的索引超出範圍,會導致大量未定義的記憶體存取,包括讀取任意同進程記憶體的可能性,就像是硬體狀態原因元一樣,並且會因硬體的用途而產生結果。 這可能會產生裝置重設,但不會損毀 Windows。
著色器衍生和除數索引
如果在 2x2 戳記中執行的圖元著色器調用 (以支援衍生計算,) 從描述中繼資料表中選擇不同的紋理索引來取樣,而且如果任何指定圖元的選取取樣器組態和紋理需要從紋理座標衍生專案進行 LOD 計算,則 LOD 計算和紋理取樣程式是由 2x2 戳記中每個紋理查閱的硬體獨立完成, 這會影響效能。
相關主題