Skip to main content
特定のヒープに配置されるリソースを作成します。配置済みリソースは、利用可能な最も軽量なリソース オブジェクトであり、作成および破棄が最も高速です。 アプリケーションは、ヒープ領域上の複数の Direct3D 配置済みリソースおよび予約済みリソースをオーバーラップさせることで、ビデオ メモリを再利用できます。シンプルなメモリ再利用モデル (解説 で説明) は、任意の時点でどのオーバーラップするリソースが有効かを明確にするために存在します。グラフィックス ツールのサポートを最大化するために、シンプル モデルではデータ継承はサポートされておらず、より細かいタイルおよびサブリソースの無効化はサポートされていません。オーバーラップするリソース全体の無効化のみが発生します。

構文

パラメーター

pHeap
型: ID3D12Heap *
リソースが配置されるヒープを表す ID3D12Heap インターフェイスへのポインター。 HeapOffset
型: UINT64
リソースへのオフセット (バイト単位)。HeapOffset はリソースのアライメントの倍数である必要があり、HeapOffset とリソース サイズの合計はヒープ サイズ以下である必要があります。テクスチャ リソースのサイズを理解するには、GetResourceAllocationInfo を使用する必要があります。 pDesc
型: const D3D12_RESOURCE_DESC *
リソースを記述する D3D12_RESOURCE_DESC 構造体へのポインター。 InitialState
型: D3D12_RESOURCE_STATES
リソースの初期状態。D3D12_RESOURCE_STATES 列挙型定数のビットごとの OR 演算による組み合わせ。 D3D12_HEAP_TYPE_UPLOAD ヒープと共にリソースを作成する場合、InitialStateD3D12_RESOURCE_STATE_GENERIC_READ である必要があります。D3D12_HEAP_TYPE_READBACK ヒープと共にリソースを作成する場合、InitialStateD3D12_RESOURCE_STATE_COPY_DEST である必要があります。 pOptimizedClearValue
型: 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
型: const IID &
リソース インターフェイスのグローバル一意識別子 (GUID)。これは入力パラメーターです。 リソースのインターフェイスの REFIID または GUID は、__uuidof マクロを使用して取得できます。たとえば、__uuidof(ID3D12Resource) は、リソースのインターフェイスの GUID を取得します。riid は最も一般的には ID3D12Resource の GUID ですが、任意のインターフェイスの GUID である可能性があります。リソース オブジェクトがこの GUID のインターフェイスをサポートしていない場合、作成は E_NOINTERFACE で失敗します。 ppvResource
型: void **
リソースへのポインターを受け取るメモリ ブロックへのポインター。ppvResource を NULL にして機能テストを有効にできます。ppvResource が NULL の場合、オブジェクトは作成されず、pResourceDesc およびその他のパラメーターが有効な場合は S_FALSE が返されます。

戻り値

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

解説

CreatePlacedResource は、ヒープ内のオフセットに予約済みリソースを完全にマッピングすることに似ていますが、ヒープに関連付けられた仮想アドレス空間も再利用できます。 配置済みリソースは、コミット済みリソースよりも作成と破棄が軽量です。これは、それらの操作中にヒープが作成も破棄もされないためです。さらに、配置済みリソースにより、リソースの作成と破棄よりも軽量な、メモリを再利用する手法が可能になります。つまり、エイリアシングとエイリアシング バリアによる再利用です。複数の配置済みリソースが同じヒープ上で同時にオーバーラップすることができますが、一度に使用できるオーバーラップするリソースは 1 つだけです。 配置済みリソースの使用セマンティクスには、シンプル モデルと高度なモデルの 2 つがあります。アプリで高度なモデルが必要であることが判明するまでは、シンプル モデル (多様な GPU エコシステム全体でグラフィックス ツールのサポートを最大化する) を選択することをお勧めします。

シンプル モデル

このモデルでは、配置済みリソースは、アクティブまたは非アクティブの 2 つの状態のいずれかにあると考えられます。GPU が非アクティブなリソースから読み書きを行うことは無効です。配置済みリソースは非アクティブ状態で作成されます。 コマンド リスト上のエイリアシング バリアでリソースをアクティブにするには、アプリケーションは D3D12_RESOURCE_ALIASING_BARRIER::pResourceAfter にリソースを渡す必要があります。pResourceBefore はアクティブ化中に NULL のままにできます。アクティブ化されたリソースと物理メモリを共有するすべてのリソースは非アクティブになります。これには、オーバーラップする配置済みリソースおよび予約済みリソースが含まれます。 効率を最大化するために、エイリアシング バリアはグループ化してまとめて送信する必要があります。 アクティブ化後、レンダー ターゲットまたは深度ステンシル フラグを持つリソースは、さらに初期化する必要があります。必要なリソースの初期化に関する以下の注意事項を参照してください。

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

特定のリソース タイプは、依然として初期化が必要です。レンダー ターゲットまたは深度ステンシル フラグを持つリソースは、クリア操作または完全なサブリソース コピーの集合のいずれかで初期化する必要があります。エイリアシング バリアが 2 つのエイリアス化されたリソース間の遷移を示すために使用された場合、初期化はエイリアシング バリアの後に行う必要があります。この初期化は、シンプル モデルでリソースがアクティブ化されたであろう場合には引き続き必要です。 レンダー ターゲットまたは深度ステンシル フラグを持つ配置済みリソースおよび予約済みリソースは、他の操作がサポートされる前に、次のいずれかの操作で初期化する必要があります。 アプリケーションは、変更されるテクセルの量が最も少なくなる、最も明示的な操作を優先する必要があります。次の例を検討してください。
  • 深度バッファーを使用してピクセルの可視性を解決するには、通常、各深度テクセルを 1.0 または 0 から開始する必要があります。したがって、エイリアス化された深度バッファーの初期化には、Clear 操作が最も効率的な選択肢となります。
  • アプリケーションは、トーン マッピングの宛先としてエイリアス化されたレンダー ターゲットを使用する場合があります。アプリケーションはトーン マッピング中にすべてのピクセルを描画するため、初期化には DiscardResource が最も効率的な選択肢となります。

高度なモデル

このモデルでは、アクティブ/非アクティブの状態の抽象化を無視できます。代わりに、これらの下位レベルのルールを守る必要があります。
  • 同じ物理メモリの 2 つの異なる GPU リソース アクセスの間には、それらのアクセスが同じ ExecuteCommandLists 呼び出し内にある限り、エイリアシング バリアが必要です。
  • 特定のタイプのエイリアス化されたリソースへの最初のレンダリング操作は、シンプル モデルと同様に、依然として初期化である必要があります。
初期化操作は、サブリソース全体または 64KB 単位で行う必要があります。サブリソース全体の初期化は、すべてのリソース タイプでサポートされています。64KB オフセットで整列された 64KB の初期化単位は、64KB_UNDEFINED_SWIZZLE または 64KB_STANDARD_SWIZZLE テクスチャ レイアウトを持つバッファーおよびテクスチャでサポートされます (D3D12_TEXTURE_LAYOUT を参照)。

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

エイリアシング バリアは、pResourceAfterpResourceBefore の両方に NULL を設定できます。ExecuteCommandLists とエイリアシング バリアのメモリ コヒーレンスの定義は同じであるため、アクセスが 2 つの異なる ExecuteCommandLists 呼び出しにある場合、同じ物理メモリへの 2 つのエイリアス化されたアクセスにはエイリアシング バリアは不要です。 D3D12 の高度な使用モデルでは、ExecuteCommandLists の同期定義はエイリアシング バリアと同等です。したがって、アプリケーションは物理メモリの再利用の間にエイリアシング バリアを挿入するか、物理メモリの 2 つのエイリアス化された使用が 2 つの別々の ExecuteCommandLists 呼び出しで発生することを保証できます。 非アクティブ化の量はリソースのプロパティによって異なります。テクスチャ全体をアトミックに非アクティブ化する必要があるため、未定義のメモリ レイアウトを持つテクスチャは最悪のケースです。定義済みレイアウトを持つ 2 つのオーバーラップするリソースの場合、非アクティブ化はリソースのオーバーラップする整列された領域のみをもたらすことができます。データ継承も明確に定義できます。詳細については、メモリ エイリアシングとデータ継承 を参照してください。

要件

ヘッダー: d3d12_xs.h または d3d12_x.h
ライブラリ: d3d12_xs.lib または d3d12_x.lib
サポートされているプラットフォーム: XBOX Series 本体および XBOX One ファミリ

関連項目

CreateCommittedResource CreateReservedResource ID3D12Device 共有ヒープ
最終更新日 2026年8月24日