描述項堆積概觀

描述項堆積包含許多不屬於管線狀態物件 (PSO) 的物件類型,例如著色器資源檢視 (SRV) 、Unordered Access Views (UAV) 、常數緩衝區檢視 (CBV) 和取樣器。

描述項堆積的用途

描述元堆積的主要用途是包含儲存著色器參考之物件類型描述元規格所需的大量記憶體配置,而著色器會盡可能參考大部分的轉譯視窗, (最好是整個轉譯框架或更多) 。 如果應用程式正在從 API 快速切換管線看到的紋理,則必須在描述元堆積中有空間,才能針對所需的每組狀態即時定義描述中繼資料表。 例如,如果資源再次用於另一個物件,或只是在切換各種物件類型時依序指派堆積空間,應用程式可以選擇重複使用定義。

描述項堆積也允許個別的軟體元件彼此分開管理描述元儲存體。

CPU 可以看到所有堆積。 如果有任何) ,應用程式也可以要求描述元堆積應該具有 (哪些 CPU 存取屬性–寫入合併、回寫等等。 應用程式可以視需要建立任意數量的描述元堆積。 應用程式一律可以選擇建立描述項堆積,這些堆積僅供未限制大小之預備用途,並視需要複製到用於轉譯的描述元堆積。

在相同描述項堆積中可能會有一些限制。 CBV、UAV 和 SRV 專案可以位於相同的描述元堆積中。 不過,取樣器專案無法與 CBV、UAV 或 SRV 專案共用堆積。 一般而言,有兩組描述元堆積,一組用於一般資源,另一組用於取樣器。

Direct3D 12 使用描述項堆積會反映大部分 GPU 硬體的用途,也就是只需要描述元堆積中的描述項,或只使用這些堆積時需要較少的定址位。 Direct3D 12 確實需要使用描述項堆積,沒有選項可將描述元放在記憶體中的任何位置。

描述項堆積只能由 CPU 立即編輯,沒有選項可供 GPU 編輯描述元堆積。

同步處理

描述項堆積內容可以在錄製參考它的命令清單之前、期間和之後變更。 不過,當提交以供執行的命令清單可能會參考該位置時,無法變更描述項,因為這可能會叫用競爭條件。

繫結

最多一個 CBV/SRV/UAV 合併堆積和一個 Sampler 堆積可以隨時系結。 這些堆積會在圖形和計算管線之間共用, (其 POS) 中所述。

切換堆積

應用程式可以使用 SetDescriptorHeapsReset API,在相同命令清單或不同命令清單中切換堆積。 在某些硬體上,這可以是昂貴的作業,需要 GPU 停止排清所有相依于目前系結描述元堆積的工作。 因此,如果必須變更描述元堆積,應用程式應該嘗試在 GPU 工作負載相對輕量時執行此動作,或許會限制命令清單開頭的變更。

使用套件組合時,只能呼叫 SetDescriptorHeaps 方法,而且描述元堆積集必須完全符合呼叫套件組合的命令清單。 如果套件組合未變更描述項資料表,則不需要設定描述項堆積。

如需無法搭配套件組合使用的 API 呼叫清單,請參閱 建立和錄製命令清單和套件組合

管理性

若要在場景中轉譯所有物件,需要許多描述項,而且有一些不同的管理原則可以遵循。

最基本的策略是填入描述元堆積的新區域,並填入下一個繪製呼叫的所有需求。 因此,在發出命令清單上的繪製呼叫之前,描述中繼資料表指標會設定為新填入資料表的開頭。 缺點是不需要記錄堆積中任何特定描述項的位置。

此策略的缺點是,描述元堆積中可能會有許多重複的描述元,特別是在轉譯非常類似的場景時,而且該描述元堆積空間將會快速用到。 在 GPU 上呈現的個別描述元堆積,以及 CPU 所記錄的堆積,可能需要避免衝突。 或者,也可以使用子配置系統。

此外,透過仔細使用從一個繪製呼叫到下一個繪製呼叫的重迭描述中繼資料表,進一步優化基本系統,因此只會新增所需的新描述元。

比基本策略更有效率的策略是預先填入描述元堆積,其中包含已知為場景一部分的物件 (或材質) 所需的描述項。 這裡的概念是,只需要在繪製時間設定描述中繼資料表,因為描述元堆積會事先填入。

預先填滿策略的變化是將描述項堆積視為一個大型陣列,其中包含固定已知位置中的所有必要描述元。 然後,繪製呼叫只需要接收一組常數,這些常數是索引到需要使用描述元的陣列中。

進一步的優化是確保根常數和根描述元包含最常變更的常數,而不是將常數放在描述元堆積中。 對於大部分的硬體而言,這是處理常數的有效方式。

實際上,圖形引擎可能會在不同情況下使用不同的策略,並結合每個策略的元素以符合特定的繪圖需求。

描述項堆積