What's WebGPU 的新功能 (Chrometain128)

François Beaufort
François Beaufort

測試子群組

子群組功能支援 SIMD 層級的平行處理,讓群組中的執行緒互相溝通並執行集體數學運算 (例如計算 16 個數字的總和)。這提供跨執行緒資料共用的高效率形式。

在「不安全的 WebGPU 支援」機制下,您幾乎不需要導入子群組提案進行本機測試標記在 chrome://flags/#enable-unsafe-webgpu 中。

如果想試用網站上的子群組,歡迎申請來源試用。想瞭解如何為網站做好使用來源試用的準備,請參閱「開始使用來源試用」一文。來源試用期間為 Chrome 128 至 131 版 (結束日期為 2025 年 2 月 19 日)。請參閱「意圖進行實驗」一文。

如果 GPUAdapter 提供 "subgroups" 功能,請要求含有這項功能的 GPUDevice,以便在 WGSL 中取得子群組支援,並查看其 minSubgroupSizemaxSubgroupSize 限制。

您也必須使用 enable subgroups; 在 WGSL 程式碼中明確啟用此擴充功能。啟用後即可使用下列新增功能:

  • subgroup_invocation_id:子群組中執行緒索引的內建值。
  • subgroup_size:子群組大小存取權的內建值。
  • subgroupBallot(value):傳回一組位元欄位,如果 value 為該主動叫用為 true,則與 subgroup_invocation_id 對應的位元為 1,反之則為 0。
  • subgroupBroadcast(value, id):透過與 id 相符的 subgroup_invocation_id 將叫用的 value 播送給子群組中的所有叫用。注意: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 屬性可讓您管理使用者定義的 IO 資料內插功能。現在,新的內插取樣參數 first (預設) 和 either 可讓您進一步控制:first 使用基元第一個頂點的值,而 either 則允許第一個或最後一個頂點。請參閱問題 340278447

日出最新消息

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

Surface::GetCapabilities() 目前不會回報 CompositeAlphaMode::Auto 值。這個有效狀態仍然有效,且等同於 Surface::GetCapabilities().alphaMode[0]。請參閱問題 292

OpenGL 後端現在支援 Surface,為每個 Present() 呼叫 Y 軸翻轉。請參閱問題 344814083

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

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

這只涵蓋部分重點功能。請參閱完整的修訂版本清單

WebGPU 新功能

WebGPU 最新消息系列中所有包含的清單。

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