WebGPU 新功能 (Chrome 144)

François Beaufort
François Beaufort

發布日期:2026 年 1 月 7 日

WGSL subgroup_id 擴充功能

啟用 subgroups 擴充功能後,您就能在工作群組中使用下列新的內建值:subgroup_id

  • subgroup_id:提供目前工作群組中調用子群組的 ID。
  • num_subgroups:回報工作群組中的子群組數量。

先前,如要使用子群組叫用 ID 為記憶體建立索引,您必須重建子群組 ID (通常透過 原子作業),避免記憶體存取作業重疊。現在可以使用 subgroup_id 填入方程式的另一半。由於 D3D 後端目前不支援這項功能,因此會模擬這項功能。建立 local_invocation_index 的等價項目 (如 subgroup_invocation_id + subgroup_size * subgroup_id) 應該很安全。請注意,有時子群組可能不會滿員。

您可以使用 navigator.gpu.wgslLanguageFeatures 偵測這項語言擴充功能。建議在 WGSL 著色器程式碼頂端使用 requires 指令,標示可能無法移植的 requires subgroup_id;。請參閱以下範例和出貨意願

if (!navigator.gpu.wgslLanguageFeatures.has("subgroup_id")) {
  throw new Error(`WGSL subgroup_id and num_subgroups built-in values are not available`);
}

const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has("subgroups")) {
  throw new Error("Subgroups support is not available");
}
const device = await adapter.requestDevice({ requiredFeatures: ["subgroups"] });

const shaderModule = device.createShaderModule({ code: `
  enable subgroups;
  requires subgroup_id;

  @compute @workgroup_size(64, 1, 1)
  fn main(@builtin(subgroup_id) subgroup_id : u32,
          @builtin(num_subgroups) num_subgroups : u32) {
    // TODO: Use subgroup_id and num_subgroups values.
  }`,
});

WGSL uniform_buffer_standard_layout 擴充功能

WGSL 語言擴充功能 uniform_buffer_standard_layout 可讓統一緩衝區使用與儲存緩衝區相同的記憶體配置限制,因此更容易在兩種緩衝區中共用資料結構。也就是說,陣列元素不再需要 16 位元組對齊,巢狀結構偏移也不必填補至 16 位元組的倍數。

您可以使用 navigator.gpu.wgslLanguageFeatures 偵測這項語言擴充功能。建議在 WGSL 著色器程式碼頂端使用 requires 指令,標示可能無法移植的 requires uniform_buffer_standard_layout;。請參閱以下範例和出貨意願

if (!navigator.gpu.wgslLanguageFeatures.has("uniform_buffer_standard_layout")) {
  throw new Error(`WGSL uniform buffer standard layout is not available`);
}

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

const shaderModule = device.createShaderModule({ code: `
  requires uniform_buffer_standard_layout;

  struct S {
      x: f32
  }
  struct Uniforms {
      a: S,
      b: f32
      // b is at offset 4. Without standard layout, alignment rules would
      // force b to be at offset 16 (or a multiple of 16), and you would have
      // to add extra fields or use an @align attribute.
  }

  @group(0) @binding(0) var<uniform> u: Uniforms;

  @fragment fn fs_main() -> @location(0) vec4<f32> {
      return vec4<f32>(u.a.x);
  }`,
});

Linux 上的 WebGPU

Chrome 團隊正謹慎地為 Linux 推出 WebGPU,首先支援 Intel Gen12 以上的 GPU,但暫定計畫將支援範圍擴大至更多裝置 (AMD、NVIDIA)。這項實作採用 WebGPU 使用 Vulkan 的架構,Chromium 的其餘部分則維持使用 OpenGL,藉此運用現有的知名良好程式碼路徑。請參閱問題 442791440

加快 writeBuffer 和 writeTexture 的速度

writeBuffer()writeTexture() 已在 Chrome 中經過最佳化,因此效能提升幅度最高可達前一版本的 2 倍,視傳輸的資料大小而定。這項異動也會影響 Dawn Wire 實作的所有使用者。請參閱問題 441900745

黎明更新

Android GPU 團隊已發布 Android 適用的 WebGPU Kotlin 繫結第一個 Alpha 版,可透過 Jetpack 使用。Android 開發人員可透過 androidx.webgpu 套件,使用 Kotlin 存取現代 GPU API,避開 OpenGL 的舊版問題或 Vulkan 的複雜性,這對生態系統來說是令人振奮的發展!

這僅涵蓋部分重點。請參閱完整的提交清單

WebGPU 最新消息

WebGPU 最新消息」系列涵蓋的所有主題清單。

Chrome 144

Chrome 143

Chrome 142

Chrome 141

Chrome 140

Chrome 139

Chrome 138

Chrome 137

Chrome 136

Chrome 135

Chrome 134

Chrome 133

Chrome 132

Chrome 131

Chrome 130

Chrome 129

Chrome 128

Chrome 127

Chrome 126

Chrome 125

Chrome 124

Chrome 123

Chrome 122

Chrome 121

Chrome 120

Chrome 119

Chrome 118

Chrome 117

Chrome 116

Chrome 115

Chrome 114

Chrome 113