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