共用方式為


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

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

清除作業可以與其他值一起呼叫,但當值符合傳遞至資源建立的值時,這些作業不會那麼有效率。

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

riid

類型:REFIID

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

REFIIDGUID,可以使用 __uuidof 宏來取得資源的介面。 例如,__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。 與啟動的資源共用物理記憶體的所有資源現在都會變成非使用中,其中包括重疊放置和保留的資源。

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

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

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

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

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

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

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

進階模型

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

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

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

別名屏障的注意事項

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

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

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

要求

要求 價值
目標平臺 窗戶
標頭 d3d12.h
連結庫 D3D12.lib
DLL D3D12.dll

另請參閱

CreateCommittedResource

CreateReservedResource

ID3D12Device

共用堆積