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

D3D11_MAP

列挙型
基底型i4

メンバー 5

名前10進16進説明
D3D11_MAP_READ10x1リソースは読み取り用にマップされます。リソースは読み取りアクセスを指定して作成されている必要があります (D3D11_CPU_ACCESS_READ を参照)。
D3D11_MAP_WRITE20x2リソースは書き込み用にマップされます。リソースは書き込みアクセスを指定して作成されている必要があります (D3D11_CPU_ACCESS_WRITE を参照)。
D3D11_MAP_READ_WRITE30x3リソースは読み取りおよび書き込み用にマップされます。リソースは読み取りアクセスと書き込みアクセスを指定して作成されている必要があります (D3D11_CPU_ACCESS_READ および D3D11_CPU_ACCESS_WRITE を参照)。
D3D11_MAP_WRITE_DISCARD40x4リソースは書き込み用にマップされます。リソースの以前の内容は未定義になります。リソースは書き込みアクセスと動的な使用法を指定して作成されている必要があります (D3D11_CPU_ACCESS_WRITE および D3D11_USAGE_DYNAMIC を参照)。
D3D11_MAP_WRITE_NO_OVERWRITE50x5

リソースは書き込み用にマップされます。リソースの既存の内容を上書きすることはできません (「解説」を参照)。このフラグは頂点バッファーおよびインデックスバッファーでのみ有効です。リソースは書き込みアクセスを指定して作成されている必要があります (D3D11_CPU_ACCESS_WRITE を参照)。D3D11_BIND_CONSTANT_BUFFER フラグを指定して作成されたリソースには使用できません。

メモ Windows 8 以降で利用できる Direct3D 11.1 ランタイムでは、動的な定数バッファーおよび動的なバッファーのシェーダーリソースビュー (SRV) を D3D11_MAP_WRITE_NO_OVERWRITE でマップできます。Direct3D 11 以前のランタイムでは、マップできる対象は頂点バッファーまたはインデックスバッファーに限られていました。Direct3D デバイスがこれらの機能をサポートしているかどうかを判断するには、D3D11_FEATURE_D3D11_OPTIONS を指定して ID3D11Device::CheckFeatureSupport を呼び出します。CheckFeatureSupport は、デバイスの機能を D3D11_FEATURE_DATA_D3D11_OPTIONS 構造体のメンバーに格納します。ここで関連するメンバーは MapNoOverwriteOnDynamicConstantBufferMapNoOverwriteOnDynamicBufferSRV です。

公式ドキュメント

CPU による読み取りおよび書き込みのためにアクセスするリソースを識別します。アプリケーションはこれらのフラグを 1 つ以上組み合わせて使用できます。

解説(Remarks)

この列挙型は ID3D11DeviceContext::Map で使用されます。

D3D11_MAP_WRITE_NO_OVERWRITE の意味

D3D11_MAP_WRITE_NO_OVERWRITE は、入力アセンブラー (IA) ステージが使用しているデータには書き込まないことをアプリケーションが約束することを意味します。その代わりに GPU は、同じバッファーの他の部分への書き込みをアプリケーションに許可します。アプリケーションは、IA ステージが使用中のデータを上書きしないようにする必要があります。

例として、次の図に示すバッファーを考えます。頂点 4 ~ 6 を使用する Draw 呼び出しが発行されている場合、このバッファーに対して Map を呼び出すアプリケーションは、その Draw 呼び出しがレンダリング中にアクセスする頂点に書き込まないようにする必要があります。

利用状況の異なる頂点を含むバッファーの図 ただし、これを保証するのは難しい場合があります。GPU が現在処理しているフレームは、CPU より数フレーム遅れていることが多いためです。2 ~ 5 フレーム前に行われた呼び出しによってリソースのどの部分が使用されているかを追跡するのは困難で、間違いも起こりやすくなります。このため、D3D11_MAP_WRITE_NO_OVERWRITE を使用する場合は、リソースのうち未初期化の部分にのみ書き込むことをお勧めします。

D3D11_MAP_WRITE_DISCARDD3D11_MAP_WRITE_NO_OVERWRITE の一般的な使用方法

D3D11_MAP_WRITE_DISCARDD3D11_MAP_WRITE_NO_OVERWRITE は、通常、動的なインデックスバッファー / 頂点バッファーと組み合わせて使用します。D3D11_MAP_WRITE_DISCARD は動的なテクスチャーにも使用できます。ただし、D3D11_MAP_WRITE_NO_OVERWRITE を動的なテクスチャーに使用することはできません。

これら 2 つのフラグの一般的な用途としては、カメラの現在位置から見えるジオメトリを動的なインデックスバッファー / 頂点バッファーに書き込む処理が挙げられます。あるフレームで最初にデータをバッファーへ入力するときは、D3D11_MAP_WRITE_DISCARD を指定して Map を呼び出します。これによりバッファーの以前の内容は無効になります。その後、利用可能なすべてのデータをバッファーに書き込みます。

同じフレーム内での以降のバッファーへの書き込みには、D3D11_MAP_WRITE_NO_OVERWRITE を使用します。前述の制約が守られている限り、GPU が使用している可能性のあるリソースに CPU がアクセスできるようになります。

出典・ライセンス: 上記「公式ドキュメント」の内容は 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_MAP : int {
    D3D11_MAP_READ = 1,
    D3D11_MAP_WRITE = 2,
    D3D11_MAP_READ_WRITE = 3,
    D3D11_MAP_WRITE_DISCARD = 4,
    D3D11_MAP_WRITE_NO_OVERWRITE = 5
} D3D11_MAP;
public enum D3D11_MAP : int
{
    D3D11_MAP_READ = 1,
    D3D11_MAP_WRITE = 2,
    D3D11_MAP_READ_WRITE = 3,
    D3D11_MAP_WRITE_DISCARD = 4,
    D3D11_MAP_WRITE_NO_OVERWRITE = 5,
}
Public Enum D3D11_MAP As Integer
    D3D11_MAP_READ = 1
    D3D11_MAP_WRITE = 2
    D3D11_MAP_READ_WRITE = 3
    D3D11_MAP_WRITE_DISCARD = 4
    D3D11_MAP_WRITE_NO_OVERWRITE = 5
End Enum
import enum

class D3D11_MAP(enum.IntEnum):
    D3D11_MAP_READ = 1
    D3D11_MAP_WRITE = 2
    D3D11_MAP_READ_WRITE = 3
    D3D11_MAP_WRITE_DISCARD = 4
    D3D11_MAP_WRITE_NO_OVERWRITE = 5
// D3D11_MAP
pub const D3D11_MAP_READ: i32 = 1;
pub const D3D11_MAP_WRITE: i32 = 2;
pub const D3D11_MAP_READ_WRITE: i32 = 3;
pub const D3D11_MAP_WRITE_DISCARD: i32 = 4;
pub const D3D11_MAP_WRITE_NO_OVERWRITE: i32 = 5;
// D3D11_MAP
const (
	D3D11_MAP_READ int32 = 1
	D3D11_MAP_WRITE int32 = 2
	D3D11_MAP_READ_WRITE int32 = 3
	D3D11_MAP_WRITE_DISCARD int32 = 4
	D3D11_MAP_WRITE_NO_OVERWRITE int32 = 5
)
const
  D3D11_MAP_READ = 1;
  D3D11_MAP_WRITE = 2;
  D3D11_MAP_READ_WRITE = 3;
  D3D11_MAP_WRITE_DISCARD = 4;
  D3D11_MAP_WRITE_NO_OVERWRITE = 5;
// D3D11_MAP
pub const D3D11_MAP_READ: i32 = 1;
pub const D3D11_MAP_WRITE: i32 = 2;
pub const D3D11_MAP_READ_WRITE: i32 = 3;
pub const D3D11_MAP_WRITE_DISCARD: i32 = 4;
pub const D3D11_MAP_WRITE_NO_OVERWRITE: i32 = 5;
const
  D3D11_MAP_READ* = 1
  D3D11_MAP_WRITE* = 2
  D3D11_MAP_READ_WRITE* = 3
  D3D11_MAP_WRITE_DISCARD* = 4
  D3D11_MAP_WRITE_NO_OVERWRITE* = 5
enum D3D11_MAP : int {
    D3D11_MAP_READ = 1,
    D3D11_MAP_WRITE = 2,
    D3D11_MAP_READ_WRITE = 3,
    D3D11_MAP_WRITE_DISCARD = 4,
    D3D11_MAP_WRITE_NO_OVERWRITE = 5,
}
#define global D3D11_MAP_READ               0x1
#define global D3D11_MAP_WRITE              0x2
#define global D3D11_MAP_READ_WRITE         0x3
#define global D3D11_MAP_WRITE_DISCARD      0x4
#define global D3D11_MAP_WRITE_NO_OVERWRITE 0x5