WebGPU のデベロッパー向け機能

François Beaufort
François Beaufort

公開日: 2025 年 6 月 3 日

Chrome の WebGPU API 実装には、開発とテスト専用の機能が含まれています。これらの機能は標準の WebGPU 仕様の範囲外であるため、本番環境では使用しないでください。

このドキュメントでは、WebGPU デベロッパー機能を有効にする方法と、その一覧について詳しく説明します。

前提条件

Chrome で WebGPU 開発者機能を有効にする手順は次のとおりです。

  1. chrome://flags/#enable-webgpu-developer-features で「WebGPU デベロッパー機能」フラグを有効にします。
  2. Chrome ブラウザを再起動します。

タイムスタンプ クエリの量子化を無効にする

タイムスタンプ クエリを使用すると、WebGPU アプリケーションはコンピューティング パスとレンダリング パスでの GPU コマンドの実行時間をナノ秒単位で正確に測定できます。これらのクエリは、GPU ワークロードのパフォーマンスと動作を分析するために不可欠です。詳細については、コンピューティング パスとレンダリング パスのタイムスタンプ クエリをご覧ください。

タイミング攻撃の懸念があるため、タイムスタンプ クエリは 100 マイクロ秒の解像度で量子化されます。これにより、精度とセキュリティのバランスが取れています。この量子化は、[WebGPU デベロッパー機能] フラグが有効になっていると自動的に無効になります。

アダプタの詳細情報

使用されているアダプタの詳細を確認するには、GPUAdapterInfo で次の属性を公開します。

  • device 属性(標準化済み)は、ベンダー固有のアダプタ識別子です。
  • description 属性(標準化)は、アダプターの詳細を示す、人が読める文字列です。
  • driver 属性(標準化されていません)は、ドライバを説明する、人が読める形式の文字列です。
  • backend 属性(標準化されていません)は、グラフィック バックエンド("WebGPU""D3D11""D3D12""metal""vulkan""openGL""openGLES""null" など)を示します。
  • type 属性(標準化されていません)は、GPU タイプ("discrete GPU""integrated GPU""CPU""unknown")を識別します。
  • d3dShaderModel 属性(標準化されていません)には、サポートされている最大の D3D シェーダー モデル番号を指定します。たとえば、62 は HLSL SM 6.2 のサポートを示します。
  • vkDriverVersion 属性(標準化されていません)は、ベンダー指定の Vulkan ドライバ バージョンです。
  • powerPreference 属性(標準化されていません)は、GPURequestAdapterOptions の GPUPowerPreference に基づいて "low-power" または "high-performance" です。

アプリの開発中に大量のメモリを割り当てる際のメモリ制限を予測するため、GPUAdapterInfo は、アダプタで使用可能なメモリヒープのサイズやタイプなど、標準化されていない memoryHeaps 情報を公開します。

const adapter = await navigator.gpu.requestAdapter();

for (const { size, properties } of adapter.info.memoryHeaps) {
  console.log(size); // memory heap size in bytes
  if (properties & GPUHeapProperty.DEVICE_LOCAL)  { /* ... */ }
  if (properties & GPUHeapProperty.HOST_VISIBLE)  { /* ... */ }
  if (properties & GPUHeapProperty.HOST_COHERENT) { /* ... */ }
  if (properties & GPUHeapProperty.HOST_UNCACHED) { /* ... */ }
  if (properties & GPUHeapProperty.HOST_CACHED)   { /* ... */ }
}

シェーダー モジュールのコンパイル オプションの厳密な数学

GPUShaderModuleDescriptor には、標準化されていないブール値オプション strictMath が含まれています。このオプションは、シェーダー モジュールのコンパイル時に厳密な数学的な精度を有効または無効にします。このオプションは、Metal と Direct3D でサポートされています。strictMath が有効になっている場合、コンパイラは正確な数学ルールに従います。逆に、この機能を無効にすると、コンパイラは次のようにシェーダーを最適化できます。

  • NaN 値と Infinity 値の可能性を無視します。
  • -0 を +0 として扱う。
  • 除算を、より高速な逆数による乗算に置き換えた。
  • 結合法則と分配法則に基づく演算の並べ替え。
const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();

const code = `
  // Examines the bit pattern of the floating-point number to
  // determine if it represents a NaN according to the IEEE 754 standard.
  fn isNan(x : f32) -> bool {
    bool ones_exp = (bitcast<u32>(x) & 0x7f8) == 0x7f8;
    bool non_zero_sig = (bitcast<u32>(x) & 0x7ffff) != 0;
    return ones_exp && non_zero_sig;
  }
  // ...
`;

// Enable strict math during shader compilation.
const shaderModule = device.createShaderModule({ code, strictMath: true });

ゼロコピーで動画をインポートする

GPUExternalTexture の isZeroCopy 非標準のブール値属性を使用すると、importExternalTexture() でインポートされた動画が、中間コピーを必要とせずに GPU によって直接アクセスされたかどうかを確認できます。

const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();

const video = document.querySelector('video');
const externalTexture = device.importExternalTexture({ source: video });

if (externalTexture.isZeroCopy) {
  console.log('Video frame was accessed directly by the GPU');
}