WebGPU 新功能 (Chrome 133)

François Beaufort
François Beaufort

發布日期:2025 年 1 月 29 日

其他 unorm8x4-bgra 和 1 個元件的頂點格式

已新增 "unorm8x4-bgra" 頂點格式,以及下列 1 個元件的頂點格式:"uint8""sint8""unorm8""snorm8""uint16""sint16""unorm16""snorm16""float16""unorm8x4-bgra" 頂點格式可讓您在維持相同著色器的情況下,稍微更方便地載入 BGRA 編碼的頂點顏色。此外,1 個元件的頂點格式可讓您只要求必要的資料,而不需要像 8 位元和 16 位元資料類型那樣,要求至少兩倍的資料。請參閱 chromestatus 項目問題 376924407

允許使用未定義的值,要求未知的限制

為了讓 WebGPU API 在演進時不那麼脆弱,您現在可以在要求 GPU 裝置時,使用 undefined 值要求未知的限制。這在以下應用程式程式碼中很實用,例如如果 someLimit 不再存在,adapter.limits.someLimit 可以是 undefined。請參閱 spec PR 4781

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

const device = await adapter.requestDevice({
  requiredLimits: { someLimit: adapter.limits.someLimit }, // someLimit can be undefined
});

WGSL 對齊規則異動

由於現在要求 @align(n) 為所有結構體分配 RequiredAlignOf,因此您無法再為結構體成員提供過小的對齊值。這項重大變更可簡化 WGSL 語言的使用方式,並讓 WGSL 與 Firefox 和 Safari 更相容。您可以在 spec PR 中找到範例程式碼,說明 Tint、Naga 和 WebKit 編譯器之間的差異。

透過棄用功能提升 WGSL 效能

由於在算繪複雜的螢幕空間反射 (SSR) 效果時,會觀察到效能大幅下降,因此捨棄陳述式的實作會使用平台提供的語意,在可用時降級為輔助呼叫。這可改善使用捨棄功能的著色器效能。請參閱問題 372714384

使用 VideoFrame displaySize 處理外部紋理

根據 WebGPU 規格匯入 VideoFrame 時,應使用 displayWidthdisplayHeight 尺寸做為 GPUExternalTexture 的顯示大小。不過,在 GPUExternalTexture 上嘗試使用 textureLoad() 時,由於使用了錯誤的顯示大小,導致發生問題。不過現在我們已順利解決這項問題。請參閱問題 377574981

使用 copyExternalImageToTexture 處理非預設方向的圖片

copyExternalImageToTexture() GPUQueue 方法用於將圖片或畫布的內容複製到紋理中。現在可正確處理非預設方向的圖片。先前,如果來源是含有 imageOrientation "from-image" 的 ImageBitmap,或是非預設方向的圖片,就不會發生這種情況。請參閱問題 384858956

改善開發人員使用體驗

adapter.limits 顯示高值時,您可能會感到意外,但您可能不知道在要求 GPU 裝置時,需要明確要求更高的限制。否則日後可能會意外達到限制。

為協助您,我們已擴充錯誤訊息,並提供提示,說明在呼叫 requestDevice() 時,如果 requiredLimits 未指定上限,您應明確要求更高的上限。請參閱問題 42240683

下例顯示在建立大小超出預設最大緩衝區大小裝置限制的 GPU 緩衝區時,開發人員工具控制台記錄的改善版錯誤訊息。

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

// Create a GPU buffer with a size exceeding the default max buffer size device limit.
const size = device.limits.maxBufferSize + 1;
const buffer = device.createBuffer({ size, usage: GPUBufferUsage.MAP_READ });

device.queue.submit([]);
⚠️ Buffer size (268435457) exceeds the max buffer size limit (268435456). This adapter supports a higher maxBufferSize of 4294967296, which can be specified in requiredLimits when calling requestDevice(). Limits differ by hardware, so always check the adapter limits prior to requesting a higher limit.
- While calling [Device].CreateBuffer([BufferDescriptor]).

使用 featureLevel 啟用相容模式

您現在可以將標準化的 featureLevel 選項設為 "compatibility",在實驗相容模式中要求 GPU 轉接器。唯一可用的值為 "core" (預設) 和 "compatibility" 字串。請參閱以下範例和 規格 PR 4897

// Request a GPU adapter in compatibility mode
const adapter = await navigator.gpu.requestAdapter({ featureLevel: "compatibility" });

if (adapter?.featureLevel === "compatibility") {
  // Any devices created from this adapter will support only compatibility mode.
}

featureLevel 選項會取代非標準化的 compatibilityMode 選項,而非標準化的 featureLevel 屬性會取代 isCompatibilityMode 屬性。

由於這項功能仍處於實驗階段,因此目前必須在 chrome://flags/#enable-unsafe-webgpu 中使用「Unsafe WebGPU Support」標記執行 Chrome。歡迎前往 webgpureport.org 試用。

實驗子群組功能清理

已淘汰的 "chromium-experimental-subgroups""chromium-experimental-subgroup-uniform-control-flow" 實驗性子群組功能已移除。請參閱問題 377868468

"subgroups" 實驗功能現在是嘗試使用子群組時所需的一切。"subgroups-f16" 實驗功能已淘汰,並即將移除。如果應用程式同時要求 "shader-f16""subgroups" 功能,您可以使用 f16 值搭配子群組。請參閱問題 380244620

淘汰 maxInterStageShaderComponents 限制

maxInterStageShaderComponents 限制已淘汰,原因如下:

  • maxInterStageShaderVariables 的冗餘:此限制已用於類似用途,可控制著色器階段之間傳遞的資料量。
  • 輕微差異:雖然兩種限制的計算方式略有不同,但差異不大,且可在 maxInterStageShaderVariables 限制內有效管理。
  • 簡化:移除 maxInterStageShaderComponents 可簡化著色器介面,並降低開發人員的複雜度。這樣一來,他們就能專注於命名更貼切且更全面的 maxInterStageShaderVariables,而非管理兩個差異不大的獨立限制。

目標是在 Chrome 135 中完全移除這項功能。請參閱淘汰意圖問題 364338810

黎明更新

wgpu::Device::GetAdapterInfo(adapterInfo) 可讓您直接從 wgpu::Device 取得轉接器資訊。請參閱問題 376600838

WGPUProgrammableStageDescriptor 結構體已重新命名為 WGPUComputeState,以便讓運算狀態與頂點和片段狀態保持一致。請參閱問題 379059434

已移除 wgpu::VertexStepMode::VertexBufferNotUsed 列舉值。未使用的頂點緩衝區版面配置現在可以使用 {.stepMode=wgpu::VertexStepMode::Undefined, .attributeCount=0} 表示。請參閱問題 383147017

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

WebGPU 新功能

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

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