ID3D12Device::CreatePlacedResource 方法 (d3d12.h)
建立放置於特定堆積中的資源。 放置的資源是可用的最輕量資源物件,而且是建立和終結最快的資源物件。
您的應用程式可以重疊堆積區域上的多個 Direct3D 放置和保留資源,以重複使用視訊記憶體。 簡單的記憶體重複使用模型(如 備註中所述)存在,以釐清任何指定時間的重疊資源是否有效。 為了最大化圖形工具支援,不支持簡單的模型數據繼承;不支援更精細的磚和子資源失效。 只會發生完整重疊的資源失效。
語法
HRESULT CreatePlacedResource(
ID3D12Heap *pHeap,
UINT64 HeapOffset,
const D3D12_RESOURCE_DESC *pDesc,
D3D12_RESOURCE_STATES InitialState,
const D3D12_CLEAR_VALUE *pOptimizedClearValue,
REFIID riid,
void **ppvResource
);
參數
pHeap
類型:[in] ID3D12Heap*
ID3D12Heap 介面的指標,表示資源所在的堆積。
HeapOffset
類型:UINT64
資源的位移,以位元組為單位。 HeapOffset 必須是資源的倍數,而且 HeapOffset 加上資源大小必須小於或等於堆積大小。 GetResourceAllocationInfo 必須用來瞭解紋理資源的大小。
pDesc
類型:[in] const D3D12_RESOURCE_DESC*
描述資源之 D3D12_RESOURCE_DESC 結構的指標。
InitialState
資源的初始狀態,作為 D3D12_RESOURCE_STATES 列舉常數的位 OR'd 組合。
當資源與 D3D12_HEAP_TYPE_UPLOAD 堆積一起建立時,InitialState 必須 D3D12_RESOURCE_STATE_GENERIC_READ。 當資源與 D3D12_HEAP_TYPE_READBACK 堆積一起建立時,InitialState 必須 D3D12_RESOURCE_STATE_COPY_DEST。
pOptimizedClearValue
類型:[in,選擇性] const D3D12_CLEAR_VALUE*
指定描述清楚色彩之預設值的 D3D12_CLEAR_VALUE。
pOptimizedClearValue 指定最理想的清除作業值。 當建立的資源是具有 D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET 或 D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL 旗標的紋理時,您的應用程式應該選擇最常使用 呼叫清除作業的值。
清除作業可以與其他值一起呼叫,但當值符合傳遞至資源建立的值時,這些作業不會那麼有效率。
pOptimizedClearValue 搭配 D3D12_RESOURCE_DIMENSION_BUFFER使用時必須是 NULL。
riid
類型:REFIID
資源介面的全域唯一標識碼 (GUID)。 這是輸入參數。
REFIID或 GUID,可以使用 __uuidof
宏來取得資源的介面。 例如,__uuidof(ID3D12Resource)
取得資源的介面 GUID。 雖然 riid 通常是,ID3D12Resource的 GUID,但它可能是任何介面的 GUID。 如果資源物件不支援此 GUID的介面,則建立會失敗並產生 E_NOINTERFACE。
ppvResource
類型:[out,選擇性] void**
接收資源指標的記憶體區塊指標。
ppvResource 可以是 NULL,以啟用功能測試。 當 ppvResource
傳回值
類型:HRESULT
如果記憶體不足而無法建立資源,這個方法會傳回 E_OUTOFMEMORY。 如需其他可能的傳回值,請參閱 Direct3D 12 傳回碼。
言論
CreatePlacedResource 類似於將保留的資源完全對應至堆積內的位移;但與堆積相關聯的虛擬位址空間也可能重複使用。
放置的資源比認可資源更輕量地建立和終結。 這是因為這些作業期間不會建立任何堆積,也不會終結。 此外,放置的資源可讓更輕量的技術重複使用記憶體,而不是資源建立和破壞,也就是透過別名和鋸齒屏障重複使用。 多個放置的資源可能會同時在相同的堆積上彼此重疊,但一次只能使用單一重疊的資源。
有兩個放置的資源使用語意:簡單模型和進階模型。 我們建議您選擇簡單的模型(它會將圖形工具支援最大化到各種 GPU 生態系統),除非您發現您需要應用程式的進階模型。
簡單模型
在此模型中,您可以將放置的資源視為兩種狀態之一:作用中或非使用中。 GPU 無法從非使用中資源讀取或寫入。 放置的資源會以非使用中狀態建立。
若要在命令清單中啟用具有別名屏障的資源,您的應用程式必須在 D3D12_RESOURCE_ALIASING_BARRIER::p ResourceAfter中傳遞資源。 pResourceBefore 在啟用期間可以保留 NULL。 與啟動的資源共用物理記憶體的所有資源現在都會變成非使用中,其中包括重疊放置和保留的資源。
應將別名屏障分組並提交在一起,以將效率最大化。
啟用之後,必須進一步初始化具有轉譯目標或深度樣板旗標的資源。 請參閱下列必要資源初始化的附註。
必要資源初始化的注意事項
某些資源類型仍然需要初始化。 具有轉譯目標或深度樣板旗標的資源,都必須使用清除作業或完整子資源復本的集合來初始化。 如果使用別名屏障來表示兩個別名資源之間的轉換,則必須在別名屏障之後進行初始化。 每當在簡單模型中啟用資源時,仍然需要此初始化。
使用轉譯目標或深度樣板旗標的放置和保留資源,必須先使用下列其中一項作業初始化,才能支援其他作業。
- 清除 作業;例如,ClearRenderTargetView 或 ClearDepthStencilView。
- DiscardResource 作業。
- 複製 作業;例如 CopyBufferRegion、CopyTextureRegion或 CopyResource。
應用程式應該偏好最明確的作業,導致修改的紋素數量最少。 請考慮下列範例。
- 使用深度緩衝區來解決圖元可見性通常需要每個深度紋素從 1.0 或 0 開始。 因此,Clear 作業應該是別名深度緩衝區初始化最有效率的選項。
- 應用程式可以使用別名轉譯目標作為音調對應的目的地。 由於應用程式會在音調對應期間在每個圖元上轉譯,因此 DiscardResource 應該是初始化最有效率的選項。
進階模型
在此模型中,您可以忽略作用中/非使用中狀態抽象概念。 相反地,您必須接受這些較低層級的規則。
- 別名屏障必須位於相同物理記憶體的兩個不同的 GPU 資源存取之間,只要這些存取位於相同 ExecuteCommandLists 呼叫中。
- 特定類型別名資源的第一個轉譯作業仍然必須是初始化,就像簡單模型一樣。
初始化作業必須發生在整個子資源或 64KB 數據粒度上。 所有資源類型都支援整個子資源初始化。 針對具有64KB_UNDEFINED_SWIZZLE或64KB_STANDARD_SWIZZLE紋理配置的緩衝區和紋理,支援以 64KB 位移對齊的 64KB 初始化粒度(請參閱 D3D12_TEXTURE_LAYOUT)。
別名屏障的注意事項
別名屏障可為 pResourceAfter 和
對於 D3D12 進階使用模型,ExecuteCommandLists 的同步處理定義相當於別名屏障。 因此,應用程式可能會在重複使用物理記憶體之間插入別名屏障,或確保實體記憶體的兩個別名用法會在兩個不同的呼叫中發生,ExecuteCommandLists。
停用的數量會根據資源屬性而有所不同。 具有未定義記憶體配置的紋理是最糟糕的情況,因為整個紋理必須以不可部分完成的方式停用。 針對具有已定義版面配置的兩個重疊資源,停用只會導致資源重疊的對齊區域。 數據繼承甚至可以妥善定義。 如需詳細資訊,請參閱 記憶體別名和資料繼承。
要求
要求 | 價值 |
---|---|
目標平臺 | 窗戶 |
標頭 | d3d12.h |
連結庫 | D3D12.lib |
DLL | D3D12.dll |