Bitwise flags (ビットフラグ)

ビットフラグは変数 (通常はシンプルな整数値) の集合で、メソッドやその他のコードの構造において、特定の使用法や機能を有効にしたり無効にしたりするのに使用できるものです。ビットレベルで操作を行うので、これを高速に効率よくできます。一般的に、同じグループ内の関連するフラグには単一の値 (たとえば、十六進数) の中の異なるビット位置を表す相補的な値が割り当てられるので、単一の値で複数のフラグ設定を表すことができます。

たとえば、WebGPU API では、GPUDevice.createBuffer() メソッドで GPUBuffer オブジェクトを作成します。このメソッドを呼び出す際、ディスクリプターで、バッファーで許される異なる使用法を有効化する 1 個または複数のフラグが入った usage プロパティを定義します。

js
usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.MAP_WRITE;

これらの値は同じ名前空間内で定義されており、それぞれに十六進数の値があります。

使用法フラグ 十六進表現 十進数で相当する値
GPUBufferUsage.MAP_READ 0x0001 1
GPUBufferUsage.MAP_WRITE 0x0002 2
GPUBufferUsage.COPY_SRC 0x0004 4
GPUBufferUsage.COPY_DST 0x0008 8
GPUBufferUsage.INDEX 0x0010 16
GPUBufferUsage.VERTEX 0x0020 32
GPUBufferUsage.UNIFORM 0x0040 64
GPUBufferUsage.STORAGE 0x0080 128
GPUBufferUsage.INDIRECT 0x0100 256
GPUBufferUsage.QUERY_RESOLVE 0x0200 512

GPUBuffer.usage プロパティから値を読み出すと、1 個の十進数が返され、これは異なる使用法フラグに対応する異なる十進数の値の和です。上記の例に戻ると、ここで指定した使用法で作成した GPUBufferGPUBuffer.usage から値を読み出すと、以下が返るでしょう。

  • GPUBufferUsage.COPY_SRC に対応する十進数の 4 に
  • GPUBufferUsage.MAP_WRITE に対応する十進数の 2 を加え
  • 結果は 6

値は異なるフラグから選ばれているため、それぞれの値の組み合わせは一意であり、プログラムは単一の値からどのフラグが設定されているかをすぐに知ることができます。さらに、ビット論理積演算子を用いて合成された値の中でフラグが設定されているかを簡単にチェックできます。

js
if (buffer.usage & GPUBufferUsage.MAP_WRITE) {
  // バッファーに使用法 MAP_WRITE がある
}

関連情報