描述項概觀
描述項是由 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 指標一樣,也不會分析控制碼內的位。
已新增一些協助程式結構,並加入初始化成員,讓管理控點更容易。
Null 描述元
使用 API 呼叫建立描述項時,應用程式會針對描述元定義中的資源指標傳遞 Null,以達到著色器存取時沒有任何系結的效果。
描述元的其餘部分必須盡可能填入。 例如,在著色器資源檢視(SRV)的情況下,描述元可用來區分其檢視的類型(Texture1D、Texture2D 等等)。 檢視描述元中的數值參數,例如 mipmap 的數目,都必須設定為對資源有效的值。
在許多情況下,有定義的行為可用來存取未系結的資源,例如會傳回預設值的 SRV。 只要著色器存取的類型與描述元類型相容,存取 Null 描述元時,就會接受這些描述元。 例如,如果著色器預期 Texture2D SRV 並存取定義為 Texture1D 的 Null SRV,則行為未定義且可能會導致裝置重設。
總而言之,若要建立 Null 描述元,請在使用 CreateShaderResourceView 等 方法建立檢視時,傳遞 null
pResource 參數。 若為檢視描述參數 pDesc ,請設定如果資源不是 Null 時運作的組態(否則可能會在某些硬體上發生當機)。
不過,根描述元不應設定為 null。
在第 1 層硬體上(請參閱 硬體層 ,系結的所有描述元(透過描述中繼資料表)都必須初始化,無論是真正的描述元還是 Null 描述元,即使硬體未存取,否則行為是未定義的。
在 Tier2 硬體上,這適用于系結 CBV 和 UAV 描述元,但不適用於 SRV 描述元。
在第 3 層硬體上,若從未存取未初始化的描述項,則不會對此有任何限制。
預設描述元
若要建立特定檢視的預設描述元,請傳入有效的 pResource 參數至 create 檢視方法(例如 CreateShaderResourceView ),但傳入 pDesc 參數的 Null 。 例如,如果資源包含 14 mips,則檢視會包含 14 mips。 預設案例涵蓋資源與檢視最明顯的對應。 這確實需要配置資源的完整格式名稱(例如 DXGI_FORMAT_R8G8B8A8_UNORM_SRGB 而不是 DXGI_FORMAT_R8G8B8A8_TYPELESS )。
預設描述元無法與光線追蹤加速結構檢視搭配使用,因為提供的 pResource 參數必須是 Null ,而且位置必須透過 D3D12_RAYTRACING_ACCELERATION_STRUCTURE_SRV 傳遞。