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。請參閱規格 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 語言的使用方式,並提升與 Firefox 和 Safari 的相容性。如要查看 Tint、Naga 和 WebKit 編譯器之間的差異,請參閱規格 PR 中的範例程式碼。

使用 discard 提升 WGSL 效能

由於算繪複雜的螢幕空間反射 (SSR) 效果時,效能會大幅下降,因此 discard 陳述式的實作方式會使用平台提供的語意,在可用的情況下降級為輔助函式呼叫。這可提升使用捨棄項目的著色器效能。請參閱問題 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 執行 Chrome,並使用「Unsafe WebGPU Support」標記。歡迎前往 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 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