What's WebGPU 的新功能 (Chrometain128)

François Beaufort
François Beaufort

嘗試使用子群組

子群組功能可啟用 SIMD 等級的平行運算,讓群組中的執行緒進行通訊及執行集體數學運算 (例如計算 16 個數字的總和)。這可提供非常有效率的跨執行緒資料共用方式。

chrome://flags/#enable-unsafe-webgpu 的「Unsafe WebGPU Support」標記後方,提供子群組提案的簡易實作方式,可用於本機測試。

您也可以申請原生試用版,在網站上試用子集區塊,並邀請真實使用者參與。如要瞭解如何準備網站以使用原始伺服器試用功能,請參閱「開始使用原始伺服器試用功能」一文。來源試用版將從 Chrome 128 開始,並於 Chrome 131 結束 (2025 年 2 月 19 日)。請參閱「意圖實驗」一文。

GPUAdapter 支援 "subgroups" 功能時,請要求使用這項功能的 GPUDevice,以便在 WGSL 中取得子群組支援,並檢查其 minSubgroupSizemaxSubgroupSize 限制。

您也需要使用 enable subgroups; 在 WGSL 程式碼中明確啟用此擴充功能。啟用後,您就能使用下列新增功能:

  • subgroup_invocation_id:子群組中執行緒索引的內建值。
  • subgroup_size:子群組大小存取權的內建值。
  • subgroupBallot(value):傳回一組位元欄位,其中與 subgroup_invocation_id 相對應的位元為 1 (如果 value 對該有效叫用為 true),否則為 0。
  • subgroupBroadcast(value, id):將呼叫中 valuesubgroup_invocation_id 廣播給子群組中的所有呼叫,以便與 id 相符。注意:id 必須是編譯時間常數。

我們日後會新增更多內建函式,例如 subgroupAddsubgroupAllsubgroupElectsubgroupShuffle。請參閱問題 354738715

如要在子群組作業中允許 f16,請使用 "subgroups""subgroups-f16""shader-f16" 功能要求 GPUDevice,然後在 WGSL 程式碼中使用 enable f16, subgroups, subgroups_f16; 啟用該功能。

以下程式碼片段可讓您著手調整,並發掘子群組的潛力。

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

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

  var<workgroup> wgmem : u32;

  @group(0) @binding(0)
  var<storage, read> inputs : array<u32>;

  @group(0) @binding(1)
  var<storage, read_write> output : array<u32>;

  @compute @workgroup_size(64)
  fn main(@builtin(subgroup_size) subgroupSize : u32,
          @builtin(subgroup_invocation_id) id : u32,
          @builtin(local_invocation_index) lid : u32) {
    // One thread per workgroup writes the value to workgroup memory.
    if (lid == 0) {
      wgmem = inputs[lid];
    }
    workgroupBarrier();
    var v = 0u;

    // One thread per subgroup reads the value from workgroup memory
    // and shares that value with every other thread in the subgroup
    // to reduce local memory bandwidth.
    if (id == 0) {
      v = wgmem;
    }
    v = subgroupBroadcast(v, 0);
    output[lid] = v;
  }`,
});

// Send the appropriate commands to the GPU...

不再支援為線條和點設定深度偏差

WebGPU 規格變更:如果算繪管線的拓樸為線或點類型,將 depthBiasdepthBiasSlopeScaledepthBiasClamp 設為非零值會導致驗證錯誤。為讓開發人員有充足的時間更新程式碼,開發人員工具主控台會顯示有關這項即將進行驗證的警告,並在這種情況下強制將值設為 0。請參閱問題 352567424

在 preventDefault 中隱藏未擷取的錯誤開發人員工具警告

如果已註冊 uncapturederror 的事件監聽器,且在事件監聽器回呼中呼叫了事件 preventDefault() 方法,則開發人員工具控制台不會再顯示 uncapturederror 事件的警告。這項行為與 JavaScript 中的事件處理方式相符。請參閱以下範例和 問題 40263619

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

device.addEventListener("uncapturederror", (event) => {
  // Prevents browser warning to show up in the DevTools Console.
  event.preventDefault();

  // TODO: Handle event.error
});

WGSL 會先插補取樣,然後執行下列任一操作:

您可以使用 WGSL interpolate 屬性管理使用者定義的 I/O 資料插補。如今,您可以透過新的內插取樣參數 first (預設) 和 either 進一步控制:first 會使用原型的第 1 個頂點值,而 either 則可使用第 1 或最後一個頂點。請參閱問題 340278447

黎明更新

實作 Dawn 的 WGPUFuture 以處理非同步作業,目前已完成。其中的關鍵概念包括用於隨機事件處理的 wgpuInstanceProcessEvents,以及用於定義回呼位置的 WGPUCallbackMode。WGPUFuture 代表一次性事件,且生命週期無限,而 wgpuInstanceWaitAny 會等待任何 Future 完成或逾時。請參閱問題 42240932

Surface::GetCapabilities() 現在不會回報 CompositeAlphaMode::Auto 值。它仍有效,且等同於 Surface::GetCapabilities().alphaMode[0]。請參閱 問題 292

OpenGL 後端現在支援 Surface,並為每個 Present() 呼叫提供 y-flip blit。請參閱問題 344814083

Adapter::GetProperties() 方法已淘汰,請改用 Adapter::GetInfo()

外部貢獻者 Jaswant 已重寫所有 CMake 檔案,讓檔案更容易更新,並允許預先建構。請參閱快速入門指南,瞭解如何在 CMake 專案中使用 Dawn。

這份文件僅涵蓋部分重點。請查看完整的修訂版本清單

WebGPU 新功能

以下是「WebGPU 最新消息」系列文章中涵蓋的所有內容。

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