描述項概觀
描述項是由 API 呼叫所建立,並識別資源。
描述項數據
描述項是相對較小的數據區塊,其會以 GPU 特定的不透明格式完整描述 GPU 的物件。 有數種不同的描述元類型:轉譯目標檢視 (RTV)、深度樣板檢視 (DSV)、著色器資源檢視 (SRV)、未排序的存取檢視 (UAV)、常數緩衝區檢視 (CBV) 和取樣器。
描述項會根據 GPU 硬體而有所不同。 您可以呼叫 ID3D12Device::GetDescriptorHandleIncrementSize來查詢 SRV、UAV 或 CBV 的大小。 在這份文件中,描述項顯示為不可分割的單位:以下是範例。
描述項是由 API 呼叫所建立,而且會包含您想要描述項包含的資源和 Mip 對應等資訊。
驅動程式不會追蹤或保存描述元的參考,應用程式必須確保正確的描述元類型正在使用中,並且資訊是最新的。 這有一個小例外狀況:驅動程式會檢查轉譯目標系結,以確保交換鏈結正常運作。
不需要釋放或解除物件描述元。 驅動程式不會將任何配置附加至描述元的建立。 不過,描述項可能會對應用程式擁有其存留期的其他配置進行編碼參考。 例如,SRV 的描述元必須包含 SRV 所參考之 D3D 資源的虛擬位址(例如紋理)。 應用程式有責任確保在所依賴的基礎 D3D 資源已被銷毀或正在更改狀態(例如被宣告為非常駐)時,不使用 SRV 描述符。
使用描述元的主要方式是將它們放在描述元堆積中,這是為描述項備份記憶體。
描述項句柄
描述符句柄是描述符的唯一地址。 它類似於指標,但不透明,因為它的實作是硬體特定的。 句柄在描述元堆積之間是唯一的,因此,例如,句柄陣列可以參考多個堆積中的描述項。
CPU 句柄適用於需要立即性的操作,例如在複製過程中需要同時識別來源和目的地的情況。 使用后立即使用 (例如,呼叫 ID3D12GraphicsCommandList::OMSetRenderTargets),就可以重複使用,或處置其基礎堆積。
GPU 句柄不適用於立即使用,它們會從命令清單中識別位置,以便在 GPU 運行時間使用。 必須保留它們,直到參考它們的任何命令清單都完全執行為止。
若要為堆積開頭建立描述項句柄,請在建立描述項堆積本身之後,呼叫下列其中一種方法:
- ID3D12DescriptorHeap::GetCPUDescriptorHandleForHeapStart
- ID3D12DescriptorHeap::GetGPUDescriptorHandleForHeapStart
這些方法會傳回下列結構:
當描述項的大小因硬體而異時,若要取得堆積中每個描述項之間的增量,請使用:
對於位移起始位置、複製控制代碼以及傳遞控制代碼至 API 呼叫,這些操作都是安全的。 不要將句柄解參照為有效的CPU指標,也不要分析句柄內的位元。
已新增一些輔助結構,並加入初始化成員,讓管理句柄更容易。
空值描述元
使用 API 呼叫建立描述項時,應用程式會針對描述元定義中的資源指標傳遞 NULL,以達到著色器存取時沒有任何系結的效果。
描述元的其餘部分必須盡可能填入。 例如,在著色器資源檢視(SRV)的情況下,描述元可用來區分其檢視的類型(Texture1D、Texture2D 等等)。 檢視描述元中的數值參數,例如mipmap的數目,都必須設定為對資源有效的值。
在許多情況下,有定義的行為可用來存取未系結的資源,例如會傳回預設值的SRV。 只要著色器存取的類型與描述元類型相容,存取 NULL 描述元時,這些描述元將被尊重。 例如,如果著色器預期 Texture2D SRV 並存取定義為 Texture1D 的 NULL SRV,則行為未定義且可能會導致裝置重設。
總而言之,若要建立 null 描述元,請在使用 CreateShaderResourceView等方法建立檢視時,傳遞 pResource 參數 null
。 對於檢視描述參數 pDesc,請設定資源不為 null 時合適的組態(否則在某些硬體上可能會發生當機)。
不過,根描述元不應設定為 null。
在第 1 層硬體上(請參閱 硬體層,系結的所有描述項(透過描述元數據表)都必須初始化,無論是真正的描述元還是 Null 描述元,即使硬體未存取,否則行為未定義。
在 Tier2 硬體上,這適用於系結 CBV 和 UAV 描述元,但不適用於 SRV 描述元。
在第 3 層硬體上,若從未存取未初始化的描述項,則不會對此有任何限制。
預設描述元
若要為特定檢視建立預設描述項,請將有效的 pResource 參數傳遞至 CreateView 方法(例如 CreateShaderResourceView),但對於 pDesc 參數傳入 NULL。 例如,如果資源包含 14 個mips,則檢視會包含 14 個mips。 默認案例涵蓋資源與檢視最明顯的對應。 這確實要求資源被分配時使用完整格式名稱(例如 DXGI_FORMAT_R8G8B8A8_UNORM_SRGB,而不是 DXGI_FORMAT_R8G8B8A8_TYPELESS)。
默認描述元不能與光線追蹤加速結構檢視搭配使用,因為提供的 pResource 參數必須 NULL,而且位置必須透過 D3D12_RAYTRACING_ACCELERATION_STRUCTURE_SRV傳遞。