D3D11_USAGE列挙 (d3d11.h)

レンダリング中に予想されるリソースの使用を識別します。 使用率は、リソースに CPU やグラフィックス処理装置 (GPU) がアクセスできるかどうかを直接反映します。

構文

typedef enum D3D11_USAGE {
  D3D11_USAGE_DEFAULT = 0,
  D3D11_USAGE_IMMUTABLE = 1,
  D3D11_USAGE_DYNAMIC = 2,
  D3D11_USAGE_STAGING = 3
} ;

定数

 
D3D11_USAGE_DEFAULT
値: 0
GPU による読み取りと書き込みのアクセスを必要とするリソース。 これは、最も一般的な使用の選択肢である可能性があります。
D3D11_USAGE_IMMUTABLE
値: 1
GPU でのみ読み取ることができるリソース。 これは GPU によって書き込まれず、CPU によってまったくアクセスできません。 この種類のリソースは作成後に変更できないため、作成時に初期化する必要があります。
D3D11_USAGE_DYNAMIC
値: 2
GPU (読み取り専用) と CPU (書き込み専用) の両方からアクセスできるリソース。 動的リソースは、フレームごとに少なくとも 1 回 CPU によって更新されるリソースに適しています。 動的リソースを更新するには、 Map メソッドを使用します。

動的リソースの使用方法については、「 方法: 動的リソースを使用する」を参照してください。
D3D11_USAGE_STAGING
値: 3
GPU から CPU へのデータ転送 (コピー) をサポートするリソース。

注釈

アプリケーションは、リソースの説明でリソースの使用方法 (その使用方法) を識別します。 リソースを作成するには、D3D11_TEXTURE1D_DESC、D3D11_TEXTURE2D_DESCD3D11_TEXTURE3D_DESCD3D11_BUFFER_DESCなど、いくつかの構造があります。

Direct3D 9 と Direct3D 10/11 の違い:

Direct3D 9 では、リソース作成時にリソースを作成するメモリの種類を指定します (D3DPOOLを使用)。 機能とパフォーマンスの最適な組み合わせを提供するメモリ プールを決定するのは、アプリケーションの仕事でした。

Direct3D 10/11 では、リソースを作成するメモリの種類 (プール) がアプリケーションで指定されなくなりました。 代わりに、リソースの目的の使用方法を指定し、(ドライバーとメモリ マネージャーと連携して) ランタイムに最適なパフォーマンスを実現するメモリの種類を選択させます。

 

リソースの使用制限

各使用によって、CPU のアクセシビリティと GPU のアクセシビリティのトレードオフが決まります。 一般に、これら 2 つのプロセッサの 1 つに対するパフォーマンスの高いアクセスは、もう一方のプロセッサのパフォーマンスが低いことを意味します。 どちらの極端にも、 D3D11_USAGE_DEFAULTD3D11_USAGE_STAGING の使用があります。 D3D11_USAGE_DEFAULT は、ほぼ完全に GPU へのアクセスを制限します。 D3D11_USAGE_STAGING は、アクセスをほぼ完全に CPU に制限し、GPU と CPU の間のリソースのデータ転送 (コピー) のみを許可します。 これらのコピー操作は 、ID3D11DeviceContext::CopySubresourceRegion メソッドと ID3D11DeviceContext::CopyResource メソッドを使用して実行できます。 また、これらのコピー方法を使用して、同じ使用状況の 2 つのリソース間でデータをコピーすることもできます。 また、ID3D11DeviceContext::UpdateSubresource メソッドを使用して、CPU 提供のポインターから任意のリソースに直接メモリをコピーすることもできます。最も便利な方法は、D3D11_USAGE_DEFAULTを持つリソースです。

D3D11_USAGE_DYNAMIC 使用は、CPU がそのデータをオンザフライで生成し、そのデータを高頻度で送信するときに、CPU から GPU へのデータフローを最適化する特別なケースです。 D3D11_USAGE_DYNAMIC は、通常、頂点データを含むリソースと定数バッファーで使用されます。 これらのリソースにデータを書き込むには、 ID3D11DeviceContext::Map メソッドと ID3D11DeviceContext::Unmap メソッドを使用します。 頂点データなど、連続して使用されるデータに対して最高のパフォーマンスを実現するには、 D3D11_MAP_WRITE_NO_OVERWRITED3D11_MAP_WRITE_DISCARD シーケンスを使用します。 このシーケンスの詳細については、「 D3D11_MAP_WRITE_NO_OVERWRITEでのD3D11_MAP_WRITE_DISCARDの一般的な使用方法」を参照してください。

D3D11_USAGE_IMMUTABLE 使用は、リソースの作成時に GPU がデータを 1 回だけ生成するもう 1 つの特殊なケースです。 D3D11_USAGE_IMMUTABLE はテクスチャなどのデータに適しています。このようなデータは通常、何らかのファイル形式からメモリに読み込まれるためです。 そのため、 D3D11_USAGE_IMMUTABLEを使用してテクスチャを作成すると、GPU はそのテクスチャを直接メモリに読み取ります。

次の表を使用して、CPU または GPU によってリソースにアクセスする方法を最もよく説明する使用量を選択します。 もちろん、パフォーマンスのトレードオフがあります。

Resource Usage Default 動的 変更不可 ステージング
GPU-Read はい はい はい yes¹
GPU-Write はい yes¹
CPU-Read yes¹
CPU-Write はい yes¹
 

1 - D3D11_USAGE_STAGING の使用量を持つリソースの GPU 読み取りまたは書き込みは、コピー操作に制限されます。 これらのコピー操作には 、ID3D11DeviceContext::CopySubresourceRegionID3D11DeviceContext::CopyResource を使用します。 また、深度ステンシル形式とマルチサンプル レイアウトは特定の GPU 設計の実装の詳細であるため、オペレーティング システムではこれらの形式とレイアウトを一般に CPU に公開できません。 したがって、ステージング リソースを深度ステンシル バッファーまたはマルチサンプリング レンダー ターゲットにすることはできません。

メモ技術的には、ID3D11DeviceContext::UpdateSubresource を使用して、D3D11_USAGE_IMMUTABLE以外の使用状況を含むリソースにコピーできます。 ただし、 ID3D11DeviceContext::UpdateSubresource を使用して、 D3D11_USAGE_DEFAULTを使用してリソースのみを更新することをお勧めします。 ID3D11DeviceContext::MapID3D11DeviceContext::Unmap を使用してリソースをD3D11_USAGE_DYNAMICで更新することをお勧めします。これは、D3D11_USAGE_DYNAMICリソースの特定の目的であるため、最も最適化されたパスであるためです。
 
リソースD3D11_USAGE_DYNAMIC特定のハードウェア機能が使用されることに注意してください。 そのため、慎重に使用してください。 ディスプレイ ドライバーは、通常、CPU の書き込みを優先し、CPU 読み取 を妨げるキャッシュ アルゴリズムを使用して、D3D11_USAGE_DYNAMIC リソースにメモリを割り当てます。 さらに、 D3D11_USAGE_DYNAMIC リソースの 背後にあるメモリは、 ID3D11DeviceContext::Map への連続する呼び出しでも同じではない可能性があります。 そのため、 D3D11_USAGE_DYNAMIC リソースからの 高パフォーマンスまたは一貫性のある CPU 読み取りを想定しないでください。
 
ID3D11DeviceContext::CopyStructureCount は、GPU から CPU へのコピーの特殊なケースです。 ID3D11DeviceContext::CopyStructureCount は、バッファーの順序なしのアクセス ビュー (UAV) でのみ使用します。
 

リソース バインド オプション

パフォーマンスを最大化するために、すべてのリソース使用オプションをパイプラインへの入力リソースまたは出力リソースとして使用できるわけではありません。 次の表に、これらの制限事項を示します。
リソースは としてバインドできます Default 動的 変更不可 ステージング
ステージへの入力 yes² はい 2 はい
ステージからの出力 yes²
 
  • 2 - 異なるビューを使用して入力と出力としてバインドされている場合、各ビューで異なるサブリソースを使用する必要があります。
  • 3 - リソースは、1 つのサブリソースでのみ作成できます。 リソースをテクスチャ配列にすることはできません。 リソースをミップマップ チェーンにすることはできません。

要件

要件
Header d3d11.h

こちらもご覧ください

リソース列挙