D3D11_USAGE
列挙型メンバー 4
| 名前 | 10進 | 16進 | 説明 |
|---|---|---|---|
| D3D11_USAGE_DEFAULT | 0 | 0x0 | GPU による読み取りと書き込みのアクセスを必要とするリソースです。最も一般的に選択される用途と考えられます。 |
| D3D11_USAGE_IMMUTABLE | 1 | 0x1 | GPU による読み取りのみが可能なリソースです。GPU から書き込むことはできず、CPU からはまったくアクセスできません。この種類のリソースは作成後に変更できないため、作成時に初期化する必要があります。 |
| D3D11_USAGE_DYNAMIC | 2 | 0x2 | GPU (読み取り専用) と CPU (書き込み専用) の両方からアクセスできるリソースです。動的リソースは、1 フレームにつき少なくとも 1 回 CPU から更新されるリソースに適した選択肢です。動的リソースを更新するには、Map メソッドを使用します。 動的リソースの使用方法については、方法: 動的リソースを使用するを参照してください。 |
| D3D11_USAGE_STAGING | 3 | 0x3 | GPU から CPU へのデータ転送 (コピー) をサポートするリソースです。 |
公式ドキュメント
レンダリング時に想定されるリソースの用途を識別します。この用途は、リソースが CPU またはグラフィックス プロセッシング ユニット (GPU) からアクセス可能かどうかを直接反映します。
解説(Remarks)
アプリケーションは、リソースをどのように使用する予定であるか (その用途) をリソースの記述で指定します。リソースを作成するための構造体には、D3D11_TEXTURE1D_DESC、D3D11_TEXTURE2D_DESC、D3D11_TEXTURE3D_DESC、D3D11_BUFFER_DESC など、いくつかのものがあります。
|
Direct3D 9 と Direct3D 10/11 の相違点:
Direct3D 9 では、リソースの作成時に、そのリソースをどの種類のメモリーに作成するかを (D3DPOOL を使用して) 指定します。機能性とパフォーマンスの最適な組み合わせが得られるメモリー プールを判断するのは、アプリケーションの役割でした。 Direct3D 10/11 では、アプリケーションがリソースを作成するメモリーの種類 (プール) を指定することはなくなりました。代わりに、リソースの想定される用途を指定し、最良のパフォーマンスが得られるメモリーの種類の選択はランタイム (ドライバーおよびメモリー マネージャーと連携して動作します) に任せます。 |
リソースの用途に関する制限
各用途は、CPU からのアクセスしやすさと GPU からのアクセスしやすさとの間のトレードオフを決定します。一般に、これら 2 つのプロセッサーの一方に対する高性能なアクセスは、もう一方に対するアクセス性能の低下を意味します。その両極端に位置するのが D3D11_USAGE_DEFAULT と D3D11_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_OVERWRITE と D3D11_MAP_WRITE_DISCARD のシーケンスを使用します。このシーケンスの詳細については、D3D11_MAP_WRITE_DISCARD と D3D11_MAP_WRITE_NO_OVERWRITE の一般的な使用方法を参照してください。
D3D11_USAGE_IMMUTABLE の用途はもう 1 つの特別なケースであり、リソースの作成時に GPU がデータを一度だけ生成します。D3D11_USAGE_IMMUTABLE は、通常は何らかのファイル形式からメモリーに読み込まれるテクスチャーなどのデータに適しています。そのため、D3D11_USAGE_IMMUTABLE でテクスチャーを作成すると、GPU はそのテクスチャーを直接メモリーに読み込みます。
CPU または GPU からリソースにどのようにアクセスする必要があるかを最もよく表す用途を、次の表を使用して選択してください。当然ながら、パフォーマンス上のトレードオフが伴います。
| リソースの用途 | Default | Dynamic | Immutable | Staging |
|---|---|---|---|---|
| GPU による読み取り | 可 | 可 | 可 | 可¹ |
| GPU による書き込み | 可 | 可¹ | ||
| CPU による読み取り | 可¹ | |||
| CPU による書き込み | 可 | 可¹ |
1 - D3D11_USAGE_STAGING の用途を持つリソースに対する GPU の読み取りまたは書き込みは、コピー操作に限定されます。これらのコピー操作には ID3D11DeviceContext::CopySubresourceRegion および ID3D11DeviceContext::CopyResource を使用します。また、深度ステンシル形式やマルチサンプルのレイアウトは特定の GPU 設計の実装の詳細であるため、オペレーティング システムは一般にこれらの形式やレイアウトを CPU に公開できません。したがって、ステージング リソースを深度ステンシル バッファーやマルチサンプルのレンダー ターゲットにすることはできません。
リソースのバインド オプション
パフォーマンスを最大化するため、すべてのリソース用途オプションをパイプラインの入力リソースまたは出力リソースとして使用できるわけではありません。この表は、その制限を示しています。| リソースをバインドできる対象 | Default | Dynamic | Immutable | Staging |
|---|---|---|---|---|
| ステージへの入力 | 可² | 可³ | 可 | |
| ステージからの出力 | 可² |
- 2 - 異なるビューを使用して入力と出力の両方としてバインドする場合、各ビューは異なるサブリソースを使用しなければなりません。
- 3 - リソースは単一のサブリソースでのみ作成できます。リソースをテクスチャー配列にすることはできません。リソースをミップマップ チェーンにすることはできません。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
各言語での定義
列挙メンバーの定義。HSP タブは #define global(値は16進)。
typedef enum D3D11_USAGE : int {
D3D11_USAGE_DEFAULT = 0,
D3D11_USAGE_IMMUTABLE = 1,
D3D11_USAGE_DYNAMIC = 2,
D3D11_USAGE_STAGING = 3
} D3D11_USAGE;public enum D3D11_USAGE : int
{
D3D11_USAGE_DEFAULT = 0,
D3D11_USAGE_IMMUTABLE = 1,
D3D11_USAGE_DYNAMIC = 2,
D3D11_USAGE_STAGING = 3,
}Public Enum D3D11_USAGE As Integer
D3D11_USAGE_DEFAULT = 0
D3D11_USAGE_IMMUTABLE = 1
D3D11_USAGE_DYNAMIC = 2
D3D11_USAGE_STAGING = 3
End Enumimport enum
class D3D11_USAGE(enum.IntEnum):
D3D11_USAGE_DEFAULT = 0
D3D11_USAGE_IMMUTABLE = 1
D3D11_USAGE_DYNAMIC = 2
D3D11_USAGE_STAGING = 3// D3D11_USAGE
pub const D3D11_USAGE_DEFAULT: i32 = 0;
pub const D3D11_USAGE_IMMUTABLE: i32 = 1;
pub const D3D11_USAGE_DYNAMIC: i32 = 2;
pub const D3D11_USAGE_STAGING: i32 = 3;// D3D11_USAGE
const (
D3D11_USAGE_DEFAULT int32 = 0
D3D11_USAGE_IMMUTABLE int32 = 1
D3D11_USAGE_DYNAMIC int32 = 2
D3D11_USAGE_STAGING int32 = 3
)const
D3D11_USAGE_DEFAULT = 0;
D3D11_USAGE_IMMUTABLE = 1;
D3D11_USAGE_DYNAMIC = 2;
D3D11_USAGE_STAGING = 3;// D3D11_USAGE
pub const D3D11_USAGE_DEFAULT: i32 = 0;
pub const D3D11_USAGE_IMMUTABLE: i32 = 1;
pub const D3D11_USAGE_DYNAMIC: i32 = 2;
pub const D3D11_USAGE_STAGING: i32 = 3;const
D3D11_USAGE_DEFAULT* = 0
D3D11_USAGE_IMMUTABLE* = 1
D3D11_USAGE_DYNAMIC* = 2
D3D11_USAGE_STAGING* = 3enum D3D11_USAGE : int {
D3D11_USAGE_DEFAULT = 0,
D3D11_USAGE_IMMUTABLE = 1,
D3D11_USAGE_DYNAMIC = 2,
D3D11_USAGE_STAGING = 3,
}#define global D3D11_USAGE_DEFAULT 0x0
#define global D3D11_USAGE_IMMUTABLE 0x1
#define global D3D11_USAGE_DYNAMIC 0x2
#define global D3D11_USAGE_STAGING 0x3