共用方式為


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

資源的初始狀態,做為 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_TARGETD3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL 旗標的紋理時,您的應用程式應該選擇最常呼叫清除作業的值。

清除作業可以使用其他值呼叫,但這些作業不會與值符合傳入資源建立的值一樣有效率。

pOptimizedClearValue 在搭配 D3D12_RESOURCE_DIMENSION_BUFFER使用時必須是 NULL。

riid

類型: REFIID

資源介面的全域唯一標識碼 (GUID) 。 這是輸入參數。

您可以使用 宏來取得__uuidof資源的介面 REFIIDGUID。 例如, __uuidof(ID3D12Resource) 取得資源的介面 GUID 。 雖然 riid 通常是 ID3D12ResourceGUID ,但它可能是任何介面的任何 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。 與啟動的資源共用物理記憶體的所有資源現在都會變成非使用中,其中包括重疊放置和保留的資源。

別名屏障應分組並提交在一起,以最大化效率。

啟用之後,必須進一步初始化具有轉譯目標或深度樣板旗標的資源。 請參閱下方必要資源初始化的附註。

必要資源初始化的注意事項

某些資源類型仍然需要初始化。 具有轉譯目標或深度樣板旗標的資源,必須使用清除作業或完整子資源復本的集合來初始化。 如果使用別名屏障來表示兩個別名資源之間的轉換,初始化必須在別名屏障之後發生。 每當在簡單模型中啟動資源時,仍然需要此初始化。

使用轉譯目標或深度樣板旗標放置和保留的資源,必須先使用下列其中一項作業初始化,才能支援其他作業。

應用程式應該偏好最明確的作業,導致修改最少的紋素數量。 請思考一下下列範例。

  • 使用深度緩衝區來解決圖元可見性通常需要每個深度紋素從 1.0 或 0 開始。 因此, 清除 作業應該是別名深度緩衝區初始化的最有效率選項。
  • 應用程式可以使用別名轉譯目標作為音調對應的目的地。 由於應用程式會在音調對應期間在每個圖元上轉譯, DiscardResource 應該是最有效率的初始化選項。

進階模型

在此模型中,您可以忽略作用中/非使用中狀態抽象概念。 相反地,您必須接受這些較低層級的規則。

  • 別名屏障必須位於相同物理記憶體的兩個不同的 GPU 資源存取之間,只要這些存取位於相同的 ExecuteCommandLists 呼叫內即可。
  • 特定類型別名資源的第一個轉譯作業仍然必須是初始化,就像簡單模型一樣。

初始化作業必須發生在整個子資源或 64KB 數據粒度上。 所有資源類型都支援整個子資源初始化。 64KB_UNDEFINED_SWIZZLE或64KB_STANDARD_SWIZZLE紋理配置 (參考 D3D12_TEXTURE_LAYOUT) 的 緩衝區和紋理,支援對齊 64 KB 的 64KB 初始化數據粒度。

別名屏障的注意事項

別名屏障可為 pResourceAfterpResourceBefore 設定 NULL。 ExecuteCommandLists 和別名屏障的記憶體整合定義相同,因此當存取位於兩個不同的 ExecuteCommandLists 調用時,對相同物理記憶體的兩個別名存取不需要別名屏障。

針對 D3D12 進階使用模型, ExecuteCommandLists 的同步處理定義相當於別名屏障。 因此,應用程式可能會在重複使用物理記憶體之間插入別名屏障,或確保實體記憶體的兩個別名用法發生在 ExecuteCommandLists 的兩個個別呼叫中。

停用的數量會根據資源屬性而有所不同。 具有未定義記憶體配置的紋理是最差的情況,因為整個紋理必須以不可部分完成的方式停用。 針對具有已定義版面配置的兩個重疊資源,停用只會造成資源重疊的對齊區域。 數據繼承甚至可以妥善定義。 如需詳細資訊,請參閱 記憶體別名和數據繼承

規格需求

需求
目標平台 Windows
標頭 d3d12.h
程式庫 D3D12.lib
Dll D3D12.dll

另請參閱

CreateCommittedResource

CreateReservedResource

ID3D12Device

共用堆積