> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# CreatePlacedResource

> ID3D12Device::CreatePlacedResource は、XBOX Direct3D 12 で特定のヒープに配置された軽量リソース (作成が最も高速なリソース タイプ) を作成します。

特定のヒープに配置されるリソースを作成します。配置済みリソースは、利用可能な最も軽量なリソース オブジェクトであり、作成および破棄が最も高速です。

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

## 構文

```cpp theme={null}
HRESULT CreatePlacedResource(
    ID3D12Heap  pHeap,
    UINT64 HeapOffset,
    const D3D12_RESOURCE_DESC  pDesc,
    D3D12_RESOURCE_STATES InitialState,
    const D3D12_CLEAR_VALUE  pOptimizedClearValue,
    const IID & riid,
    void  ppvResource
)
```

### パラメーター

*pHeap*<br />型: ID3D12Heap \*

リソースが配置されるヒープを表す **ID3D12Heap** インターフェイスへのポインター。

*HeapOffset*<br />型: UINT64

リソースへのオフセット (バイト単位)。*HeapOffset* はリソースのアライメントの倍数である必要があり、*HeapOffset* とリソース サイズの合計はヒープ サイズ以下である必要があります。テクスチャ リソースのサイズを理解するには、[**GetResourceAllocationInfo**](/reference/graphics/d3d12/interfaces/id3d12device/methods/id3d12device_getresourceallocationinfo_public) を使用する必要があります。

*pDesc*<br />型: const D3D12\_RESOURCE\_DESC \*

リソースを記述する **D3D12\_RESOURCE\_DESC** 構造体へのポインター。

*InitialState*<br />型: 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*<br />型: 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*<br />型: const IID &

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

リソースのインターフェイスの **REFIID** または **GUID** は、`__uuidof` マクロを使用して取得できます。たとえば、`__uuidof(ID3D12Resource)` は、リソースのインターフェイスの **GUID** を取得します。**riid** は最も一般的には [**ID3D12Resource**](/reference/graphics/d3d12_xs/interfaces/ID3D12Resource/id3d12resource_xs) の GUID ですが、任意のインターフェイスの **GUID** である可能性があります。リソース オブジェクトがこの **GUID** のインターフェイスをサポートしていない場合、作成は **E\_NOINTERFACE** で失敗します。

*ppvResource*<br />型: void \*\*

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

### 戻り値

型: HRESULT

リソースを作成するのに十分なメモリがない場合、このメソッドは **E\_OUTOFMEMORY** を返します。その他の戻り値については、[Direct3D 12 の戻りコード](https://learn.microsoft.com/en-us/windows/win32/direct3d12/d3d12-graphics-reference-returnvalues) を参照してください。

## 解説

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

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

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

### シンプル モデル

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

コマンド リスト上のエイリアシング バリアでリソースをアクティブにするには、アプリケーションは [**D3D12\_RESOURCE\_ALIASING\_BARRIER::pResourceAfter**](/reference/graphics/d3d12/structs/d3d12_resource_aliasing_barrier_public) にリソースを渡す必要があります。**pResourceBefore** はアクティブ化中に NULL のままにできます。アクティブ化されたリソースと物理メモリを共有するすべてのリソースは非アクティブになります。これには、オーバーラップする配置済みリソースおよび予約済みリソースが含まれます。

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

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

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

特定のリソース タイプは、依然として初期化が必要です。レンダー ターゲットまたは深度ステンシル フラグを持つリソースは、クリア操作または完全なサブリソース コピーの集合のいずれかで初期化する必要があります。エイリアシング バリアが 2 つのエイリアス化されたリソース間の遷移を示すために使用された場合、初期化はエイリアシング バリアの後に行う必要があります。この初期化は、シンプル モデルでリソースがアクティブ化されたであろう場合には引き続き必要です。

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

* *Clear* 操作。例: [ClearRenderTargetView](/reference/graphics/d3d12_xs/interfaces/ID3D12GraphicsCommandList/methods/id3d12graphicscommandlist_clearrendertargetview_xs) または [ClearDepthStencilView](/reference/graphics/d3d12/interfaces/id3d12graphicscommandlist/methods/id3d12graphicscommandlist_cleardepthstencilview_public)。
* [DiscardResource](/reference/graphics/d3d12/interfaces/id3d12graphicscommandlist/methods/id3d12graphicscommandlist_discardresource_public) 操作。
* *Copy* 操作。例: [CopyBufferRegion](/reference/graphics/d3d12/interfaces/id3d12graphicscommandlist/methods/id3d12graphicscommandlist_copybufferregion_public)、[CopyTextureRegion](/reference/graphics/d3d12/interfaces/id3d12graphicscommandlist/methods/id3d12graphicscommandlist_copytextureregion_public)、または [CopyResource](https://learn.microsoft.com/en-us/windows/win32/api/d3d12/nf-d3d12-id3d12graphicscommandlist-copyresource)。

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

* 深度バッファーを使用してピクセルの可視性を解決するには、通常、各深度テクセルを 1.0 または 0 から開始する必要があります。したがって、エイリアス化された深度バッファーの初期化には、*Clear* 操作が最も効率的な選択肢となります。
* アプリケーションは、トーン マッピングの宛先としてエイリアス化されたレンダー ターゲットを使用する場合があります。アプリケーションはトーン マッピング中にすべてのピクセルを描画するため、初期化には [DiscardResource](/reference/graphics/d3d12/interfaces/id3d12graphicscommandlist/methods/id3d12graphicscommandlist_discardresource_public) が最も効率的な選択肢となります。

### 高度なモデル

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

* 同じ物理メモリの 2 つの異なる GPU リソース アクセスの間には、それらのアクセスが同じ [ExecuteCommandLists](/reference/graphics/d3d12_x/interfaces/id3d12commandqueue/methods/id3d12commandqueue_executecommandlists) 呼び出し内にある限り、エイリアシング バリアが必要です。
* 特定のタイプのエイリアス化されたリソースへの最初のレンダリング操作は、シンプル モデルと同様に、依然として初期化である必要があります。

初期化操作は、サブリソース全体または 64KB 単位で行う必要があります。サブリソース全体の初期化は、すべてのリソース タイプでサポートされています。64KB オフセットで整列された 64KB の初期化単位は、64KB\_UNDEFINED\_SWIZZLE または 64KB\_STANDARD\_SWIZZLE テクスチャ レイアウトを持つバッファーおよびテクスチャでサポートされます ([D3D12\_TEXTURE\_LAYOUT](/reference/graphics/d3d12_x/enums/d3d12_texture_layout) を参照)。

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

エイリアシング バリアは、*pResourceAfter* と *pResourceBefore* の両方に NULL を設定できます。[**ExecuteCommandLists**](/reference/graphics/d3d12_x/interfaces/id3d12commandqueue/methods/id3d12commandqueue_executecommandlists) とエイリアシング バリアのメモリ コヒーレンスの定義は同じであるため、アクセスが 2 つの異なる **ExecuteCommandLists** 呼び出しにある場合、同じ物理メモリへの 2 つのエイリアス化されたアクセスにはエイリアシング バリアは不要です。

D3D12 の高度な使用モデルでは、[**ExecuteCommandLists**](/reference/graphics/d3d12_x/interfaces/id3d12commandqueue/methods/id3d12commandqueue_executecommandlists) の同期定義はエイリアシング バリアと同等です。したがって、アプリケーションは物理メモリの再利用の間にエイリアシング バリアを挿入するか、物理メモリの 2 つのエイリアス化された使用が 2 つの別々の **ExecuteCommandLists** 呼び出しで発生することを保証できます。

非アクティブ化の量はリソースのプロパティによって異なります。テクスチャ全体をアトミックに非アクティブ化する必要があるため、未定義のメモリ レイアウトを持つテクスチャは最悪のケースです。定義済みレイアウトを持つ 2 つのオーバーラップするリソースの場合、非アクティブ化はリソースのオーバーラップする整列された領域のみをもたらすことができます。データ継承も明確に定義できます。詳細については、[メモリ エイリアシングとデータ継承](https://learn.microsoft.com/en-us/windows/win32/direct3d12/memory-aliasing-and-data-inheritance) を参照してください。

## 要件

**ヘッダー:** d3d12\_xs.h または d3d12\_x.h<br />**ライブラリ:** d3d12\_xs.lib または d3d12\_x.lib<br />**サポートされているプラットフォーム**: XBOX Series 本体および XBOX One ファミリ

## 関連項目

[CreateCommittedResource](/reference/graphics/d3d12/interfaces/id3d12device/methods/id3d12device_createcommittedresource_public)

[CreateReservedResource](/reference/graphics/d3d12/interfaces/id3d12device/methods/id3d12device_createreservedresource_public)

[ID3D12Device](/reference/graphics/d3d12_x/interfaces/id3d12device/id3d12device)

[共有ヒープ](https://learn.microsoft.com/en-us/windows/win32/direct3d12/shared-heaps)


## Related topics

- [CreatePlacedResource2 (XBOX Series consoles)](/ja-jp/reference/graphics/d3d12/interfaces/id3d12device10/methods/id3d12device10_createplacedresource2_public.md)
- [CreateReservedResource](/ja-jp/reference/graphics/d3d12/interfaces/id3d12device/methods/id3d12device_createreservedresource_public.md)
- [CreateCommittedResource](/ja-jp/reference/graphics/d3d12/interfaces/id3d12device/methods/id3d12device_createcommittedresource_public.md)
- [CreateReservedResource2 (XBOX Series consoles)](/ja-jp/reference/graphics/d3d12/interfaces/id3d12device10/methods/id3d12device10_createreservedresource2_public.md)
- [CreateReservedResource1 (XBOX Series 本体)](/ja-jp/reference/graphics/d3d12/interfaces/id3d12device4/methods/id3d12device4_createreservedresource1_public.md)
