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
Type: [in] const D3D12_RESOURCE_DESC*
描述資源之D3D12_RESOURCE_DESC結構的指標。
InitialState
資源的初始狀態,做為 D3D12_RESOURCE_STATES 列舉常數的位 OR'd 組合。
當資源與D3D12_HEAP_TYPE_UPLOAD堆積一起建立時,必須D3D12_RESOURCE_STATE_GENERIC_READInitialState。 當資源與 D3D12_HEAP_TYPE_READBACK 堆積一起建立時, InitialState 必須 D3D12_RESOURCE_STATE_COPY_DEST。
pOptimizedClearValue
Type: [in, optional] 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) 。 這是輸入參數。
您可以使用 宏來取得__uuidof
資源的介面 REFIID 或 GUID。 例如, __uuidof(ID3D12Resource)
取得資源的介面 GUID 。 雖然 riid 通常是 ID3D12Resource 的 GUID ,但它可能是任何介面的任何 GUID。 如果資源物件不支援此 GUID 的介面,則建立會失敗並 E_NOINTERFACE。
ppvResource
類型:[out, 選擇性] void**
記憶體區塊的指標,可接收資源的指標。 ppvResource 可以是 NULL,以啟用功能測試。 當 ppvResource 為 NULL 時,將不會建立任何物件,而且當 pResourceDesc 和其他參數有效時,將會傳回S_FALSE。
傳回值
類型: 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 開始。 因此, 清除 作業應該是別名深度緩衝區初始化的最有效率選項。
- 應用程式可以使用別名轉譯目標作為音調對應的目的地。 由於應用程式會在音調對應期間在每個圖元上轉譯, DiscardResource 應該是最有效率的初始化選項。
進階模型
在此模型中,您可以忽略作用中/非使用中狀態抽象概念。 相反地,您必須接受這些較低層級的規則。
- 別名屏障必須位於相同物理記憶體的兩個不同的 GPU 資源存取之間,只要這些存取位於相同的 ExecuteCommandLists 呼叫內即可。
- 特定類型別名資源的第一個轉譯作業仍然必須是初始化,就像簡單模型一樣。
初始化作業必須發生在整個子資源或 64KB 數據粒度上。 所有資源類型都支援整個子資源初始化。 64KB_UNDEFINED_SWIZZLE或64KB_STANDARD_SWIZZLE紋理配置 (參考 D3D12_TEXTURE_LAYOUT) 的 緩衝區和紋理,支援對齊 64 KB 的 64KB 初始化數據粒度。
別名屏障的注意事項
別名屏障可為 pResourceAfter 和 pResourceBefore 設定 NULL。 ExecuteCommandLists 和別名屏障的記憶體整合定義相同,因此當存取位於兩個不同的 ExecuteCommandLists 調用時,對相同物理記憶體的兩個別名存取不需要別名屏障。
針對 D3D12 進階使用模型, ExecuteCommandLists 的同步處理定義相當於別名屏障。 因此,應用程式可能會在重複使用物理記憶體之間插入別名屏障,或確保實體記憶體的兩個別名用法發生在 ExecuteCommandLists 的兩個個別呼叫中。
停用的數量會根據資源屬性而有所不同。 具有未定義記憶體配置的紋理是最差的情況,因為整個紋理必須以不可部分完成的方式停用。 針對具有已定義版面配置的兩個重疊資源,停用只會造成資源重疊的對齊區域。 數據繼承甚至可以妥善定義。 如需詳細資訊,請參閱 記憶體別名和數據繼承。
規格需求
需求 | 值 |
---|---|
目標平台 | Windows |
標頭 | d3d12.h |
程式庫 | D3D12.lib |
Dll | D3D12.dll |
另請參閱
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應