設定和填充描述器堆
可以在命令清單上設定的描述項堆積類型,就是包含描述項數據表可以使用的描述項(一次最多一個)。
設定描述符堆
可以在命令清單上設定的描述元堆積類型如下:
D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV
D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER
命令清單上設定的堆積也必須建立為著色器可見。 命令清單有三種類型:DIRECT、BUNDLE 和 COMPUTE。
在命令清單中設定描述項堆積之後,定義描述項數據表的後續呼叫會參考目前的描述元堆積。 在命令清單的開頭以及當描述堆積在命令清單上被變更後,描述表的狀態未定義。 重複地設定相同的描述元堆積,並不會導致未定義描述項數據表設定。
相反地,在套件組合中,描述元堆積只能設定一次(重複呼叫設定相同的堆積兩次不會產生錯誤):否則,行為是未定義的。 設定的描述元堆積必須符合任何命令清單呼叫套件組合時的狀態;否則,行為是未定義的。 這可讓套件組合繼承和編輯命令清單的描述項數據表設定。 不會變更描述元數據表的套件組合(只繼承它們),完全不需要設定描述元堆積,而且只會繼承自呼叫命令清單。
設定描述元堆積時(使用 ID3D12GraphicsCommandList::SetDescriptorHeaps),所有使用的堆積都會在單一呼叫中設定(且所有先前設定的堆積都未由呼叫設定)。 在呼叫中可以設定最多一個上述每种類型的堆。
填入描述堆疊
應用程式建立描述元堆積之後,就可以使用裝置上的方法,直接在堆積中產生描述元,或將描述元從一個位置複製到另一個位置。
描述元堆積記憶體的初始內容未定義,因此要求 GPU 或驅動程式參考未初始化的記憶體進行轉譯,可能會導致未定義的結果,例如裝置重設。
如果應用程式將描述項堆積設定為對 CPU 可見,則 CPU 可以呼叫方法,在堆積中建立描述符,並以自由線程的方式在不同位置之間複製(包括跨堆積)。 如果堆積已設定為SHADER_VISIBLE,則不允許CPU讀取。
相關主題