Win32 API 日本語リファレンス
ホームGraphics.Direct3D11 › D3D11_USAGE

D3D11_USAGE

列挙型
基底型i4

メンバー 4

名前10進16進説明
D3D11_USAGE_DEFAULT00x0GPU による読み取りと書き込みのアクセスを必要とするリソースです。最も一般的に選択される用途と考えられます。
D3D11_USAGE_IMMUTABLE10x1GPU による読み取りのみが可能なリソースです。GPU から書き込むことはできず、CPU からはまったくアクセスできません。この種類のリソースは作成後に変更できないため、作成時に初期化する必要があります。
D3D11_USAGE_DYNAMIC20x2

GPU (読み取り専用) と CPU (書き込み専用) の両方からアクセスできるリソースです。動的リソースは、1 フレームにつき少なくとも 1 回 CPU から更新されるリソースに適した選択肢です。動的リソースを更新するには、Map メソッドを使用します。

動的リソースの使用方法については、方法: 動的リソースを使用するを参照してください。

D3D11_USAGE_STAGING30x3GPU から CPU へのデータ転送 (コピー) をサポートするリソースです。

公式ドキュメント

レンダリング時に想定されるリソースの用途を識別します。この用途は、リソースが CPU またはグラフィックス プロセッシング ユニット (GPU) からアクセス可能かどうかを直接反映します。

解説(Remarks)

アプリケーションは、リソースをどのように使用する予定であるか (その用途) をリソースの記述で指定します。リソースを作成するための構造体には、D3D11_TEXTURE1D_DESCD3D11_TEXTURE2D_DESCD3D11_TEXTURE3D_DESCD3D11_BUFFER_DESC など、いくつかのものがあります。

Direct3D 9 と Direct3D 10/11 の相違点:

Direct3D 9 では、リソースの作成時に、そのリソースをどの種類のメモリーに作成するかを (D3DPOOL を使用して) 指定します。機能性とパフォーマンスの最適な組み合わせが得られるメモリー プールを判断するのは、アプリケーションの役割でした。

Direct3D 10/11 では、アプリケーションがリソースを作成するメモリーの種類 (プール) を指定することはなくなりました。代わりに、リソースの想定される用途を指定し、最良のパフォーマンスが得られるメモリーの種類の選択はランタイム (ドライバーおよびメモリー マネージャーと連携して動作します) に任せます。

リソースの用途に関する制限

各用途は、CPU からのアクセスしやすさと GPU からのアクセスしやすさとの間のトレードオフを決定します。一般に、これら 2 つのプロセッサーの一方に対する高性能なアクセスは、もう一方に対するアクセス性能の低下を意味します。その両極端に位置するのが 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_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 に公開できません。したがって、ステージング リソースを深度ステンシル バッファーやマルチサンプルのレンダー ターゲットにすることはできません。

メモ 技術的には、ID3D11DeviceContext::UpdateSubresource を使用して、D3D11_USAGE_IMMUTABLE 以外の任意の用途のリソースへコピーできます。ただし、ID3D11DeviceContext::UpdateSubresourceD3D11_USAGE_DEFAULT のリソースの更新にのみ使用することをお勧めします。D3D11_USAGE_DYNAMIC のリソースの更新には ID3D11DeviceContext::Map および ID3D11DeviceContext::Unmap を使用することをお勧めします。これが 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 Dynamic Immutable Staging
ステージへの入力 可² 可³
ステージからの出力 可²
出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
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 Enum
import 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* = 3
enum 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