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 の組み合わせとしてのリソースの初期状態。

リソースを D3D12_HEAP_TYPE_UPLOAD ヒープと共に作成する場合は、InitialState D3D12_RESOURCE_STATE_GENERIC_READする必要があります。 リソースを D3D12_HEAP_TYPE_READBACK ヒープと共に作成する場合は、InitialState D3D12_RESOURCE_STATE_COPY_DESTする必要があります。

pOptimizedClearValue

型: [in, optional] const 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

型: REFIID

リソース インターフェイスのグローバル一意識別子 (GUID)。 これは入力パラメーターです。

リソースへのインターフェイスの REFIID(GUID) は、__uuidof マクロを使用して取得できます。 たとえば、__uuidof(ID3D12Resource) は、インターフェイスの GUID をリソースに取得します。 riid は、最も一般的には、ID3D12Resourceの GUID ですが、任意のインターフェイスの任意の GUID にすることができます。 リソース オブジェクトがこの GUIDのインターフェイスをサポートしていない場合は、E_NOINTERFACEで作成が失敗します。

ppvResource

型: [out, optional] void**

リソースへのポインターを受け取るメモリ ブロックへのポインター。 ppvResource は NULL にして、機能テストを有効にすることができます。 ppvResource NULL の場合、pResourceDesc とその他のパラメーター 有効な場合、オブジェクトは作成されません。S_FALSEが返されます。

戻り値

型: HRESULT

このメソッドは、リソースを作成するのに十分なメモリがない場合に E_OUTOFMEMORY を返します。 その他 戻り値については、Direct3D 12 リターン コード を参照してください。

備考

CreatePlacedResource は、予約済みリソースをヒープ内のオフセットに完全にマッピングするのと似ています。ただし、ヒープに関連付けられている仮想アドレス空間も再利用できます。

配置されたリソースは、コミットされたリソースよりも作成と破棄の重みが軽くなります。 これは、これらの操作中にヒープが作成も破棄もされないためです。 さらに、配置されたリソースを使用すると、リソースの作成と破棄よりもメモリを再利用するさらに軽量な手法が可能になります。つまり、エイリアシングやエイリアシング バリアを使用して再利用できます。 複数の配置されたリソースが同じヒープ上で同時に重なることがありますが、一度に使用できる重複するリソースは 1 つだけです。

配置されたリソース使用状況セマンティクスには、単純なモデルと高度なモデルの 2 つがあります。 アプリの高度なモデルが必要な場合を除き、単純なモデルを選択することをお勧めします (GPU の多様なエコシステム全体でグラフィックス ツールのサポートを最大化します)。

単純なモデル

このモデルでは、配置されたリソースがアクティブまたは非アクティブの 2 つの状態のいずれかであると考えることができます。 GPU が非アクティブなリソースから読み取りまたは書き込みを行うのは無効です。 配置されたリソースは、非アクティブな状態で作成されます。

コマンド リストでエイリアス バリアを使用してリソースをアクティブ化するには、アプリケーションでリソースを D3D12_RESOURCE_ALIASING_BARRIER::p ResourceAfter渡す必要があります。 pResourceBefore は、アクティブ化中に NULL のままにすることができます。 アクティブ化されたリソースと物理メモリを共有するすべてのリソースが非アクティブになり、配置されたリソースと予約されたリソースの重複が含まれます。

効率を最大化するには、エイリアシング バリアをグループ化して一緒に送信する必要があります。

アクティブ化後、レンダー ターゲットまたは深度ステンシル フラグを持つリソースをさらに初期化する必要があります。 以下の必要なリソース初期化に関する注意事項を参照してください。

必要なリソースの初期化に関する注意事項

一部のリソースの種類では、初期化が必要です。 レンダー ターゲットまたは深度ステンシル フラグを持つリソースは、クリア操作または完全なサブリソース コピーのコレクションを使用して初期化する必要があります。 エイリアス バリアを使用して 2 つのエイリアス化されたリソース間の遷移を示す場合は、エイリアス バリアの後に初期化を行う必要があります。 この初期化は、単純なモデルでリソースがアクティブ化されるたびに必要です。

他の操作がサポートされる前に、レンダー ターゲットまたは深度ステンシル フラグを持つ配置済みリソースと予約済みリソースを次のいずれかの操作で初期化する必要があります。

  • クリア 操作。たとえば、ClearRenderTargetView 、ClearDepthStencilViewします。
  • DiscardResource 操作。
  • コピー 操作。たとえば、CopyBufferRegion、CopyTextureRegion、または CopyResourceします。

アプリケーションでは、変更されるテクセルの量が最も少ない、最も明示的な操作を優先する必要があります。 次の例を考えてみましょう。

  • 深度バッファーを使用してピクセルの可視性を解決するには、通常、各深度テクセルが 1.0 または 0 から始まる必要があります。 したがって、クリア 操作は、エイリアス化された深度バッファーの初期化に最も効率的なオプションである必要があります。
  • アプリケーションでは、トーン マッピングの宛先としてエイリアス化されたレンダー ターゲットを使用できます。 アプリケーションはトーン マッピング中にすべてのピクセルにレンダリングされるため、DiscardResource は初期化に最も効率的なオプションである必要があります。

高度なモデル

このモデルでは、アクティブ/非アクティブ状態の抽象化を無視できます。 代わりに、これらの下位レベルの規則を遵守する必要があります。

  • エイリアス バリアは、同じ物理メモリの 2 つの異なる GPU リソース アクセス間に存在する必要があります。これらのアクセスが同じ ExecuteCommandLists 呼び出し内にある限りです。
  • 特定の種類のエイリアスリソースに対する最初のレンダリング操作は、単純なモデルと同様に初期化である必要があります。

初期化操作は、サブリソース全体または 64 KB の細分性で行う必要があります。 サブリソースの初期化全体が、すべてのリソースの種類でサポートされています。 64 KB のオフセットに配置された 64 KB の初期化粒度は、64KB_UNDEFINED_SWIZZLEまたは64KB_STANDARD_SWIZZLEテクスチャ レイアウトを使用したバッファーとテクスチャに対してサポートされています (D3D12_TEXTURE_LAYOUTを参照)。

エイリアシング バリアに関する注意事項

エイリアス バリアは、pResourceAfter と pResourceBeforeの両方に NULL を設定できます。 ExecuteCommandLists とエイリアス バリアのメモリコヒーレンス定義は同じであり、同じ物理メモリへの 2 つのエイリアス化されたアクセスが、ExecuteCommandLists 呼び出しの 2 つの異なる に存在する場合、エイリアスバリアは必要ありません。

D3D12 の高度な使用モデルの場合、ExecuteCommandLists の同期定義は、エイリアシング バリアと同じです。 そのため、アプリケーションは、物理メモリの再利用の間にエイリアシング バリアを挿入するか、ExecuteCommandListsを する 2 つの個別の呼び出しで物理メモリのエイリアス化された 2 つの使用法が発生することを確認できます。

非アクティブ化の量は、リソースのプロパティによって異なります。 未定義のメモリ レイアウトを持つテクスチャは、テクスチャ全体をアトミックに非アクティブ化する必要があり、最悪のケースです。 レイアウトが定義された 2 つの重複するリソースの場合、非アクティブ化により、リソースの整列領域が重複する可能性があります。 データの継承は、明確に定義することもできます。 詳細については、「メモリエイリアスとデータ継承を参照してください。

必要条件

要件 価値
ターゲット プラットフォーム の ウィンドウズ
ヘッダー d3d12.h
ライブラリ D3D12.lib
DLL D3D12.dll

関連項目

CreateCommittedResource の

CreateReservedResource の

ID3D12Device

共有ヒープ の