What's WebGPU 新功能 (Chrome 115 以上版本)

François Beaufort
François Beaufort

支援的 WGSL 語言擴充功能

GPU 物件的 wgslLanguageFeatures 成員會列出支援的 WGSL 語言擴充功能名稱。系統會自動啟用支援的 WGSL 語言擴充功能,因此您不需要明確要求。這個清單目前為空白,但未來可能會新增許多項目 (例如 do-while loops)。請參閱 issue dawn:1777

if (navigator.gpu.wgslLanguageFeatures?.has("unknown-feature")) {
  // Use unknown-feature in WGSL shader code.
}

實驗性支援 Direct3D 11

Chromium 團隊正在努力為 Direct3D 11 新增 WebGPU 支援。您現在可以在本機上實驗這項功能,方法是在 Windows 上使用 --enable-unsafe-webgpu --use-webgpu-adapter=d3d11 指令列旗標執行 Chrome。請參閱問題 dawn:1705

在 AC 電源下預設使用獨立 GPU

在雙 GPU macOS 裝置上,如果在未提供 powerPreference 選項的情況下呼叫 requestAdapter(),則會在使用者裝置使用交流電時傳回獨立 GPU。否則,系統會傳回內建 GPU。請參閱變更 4499307

改善開發人員使用體驗

新的開發人員工具警告

如果在 GPUExtend3DDict 中使用 depth 鍵,開發人員工具控制台會顯示警告,因為正確的鍵為 depthOrArrayLayers。請參閱 issue chromium:1440900

如果 GPUBlendComponent 同時包含明確和預設成員,系統也會發出警告。請參閱問題 dawn:1785

雖然零大小的調度和繪製作業是有效的,但系統會發出警告,建議開發人員盡量避免使用這類作業。請參閱問題 dawn:1786

提供更完善的錯誤訊息

如果您已呼叫 finish(),則使用 GPUCommandEncoder 時,系統現在會提供更完善的錯誤訊息。請參閱問題 dawn:1736

當您提交含有已毀壞物件的指令緩衝區時,錯誤訊息中會顯示 submit() 中使用的指令緩衝區標籤。請參閱問題 dawn:1747

驗證 depthStencil 時,錯誤訊息現在會指出深度遮罩狀態的無效部分。請參閱 issue dawn:1735

minBindingSize 驗證錯誤訊息現在會回報驗證失敗的繫結群組和數量,以及緩衝區。請參閱問題 dawn:1604

我們改善了 GPUBuffer 物件上 mapAsync() 方法傳回的錯誤訊息,以便開發人員在偵錯時使用。請參閱下方的範例,以及 問題 chromium:1431622

// Create a GPU buffer and map it.
const descriptor = { size: 0, usage: GPUBufferUsage.MAP_READ };
const buffer = device.createBuffer(descriptor);
buffer.mapAsync(GPUMapMode.READ);

// Before it has been mapped, request another mapping.
try {
  await buffer.mapAsync(GPUMapMode.READ);
} catch (error) {
  // New! Error message tells you mapping is already pending.
  console.warn(error.message);
}

macOS 偵錯工具中的標籤

您可以使用 use_user_defined_labels_in_backend 偵錯切換按鈕,將物件標籤轉送至後端,以便在 RenderDoc、PIX 或 Instruments 等平台專屬偵錯工具中查看。從現在起,如果您啟用 macOS 的偵錯功能,就能獲得更優質的偵錯體驗。請參閱 issue dawn:1784

macOS 上 Instruments 應用程式的螢幕截圖,其中顯示來自 WebGPU 的自訂標籤。
在 macOS 的 Instruments 應用程式中,使用者定義的標籤。

如果編譯失敗,請記錄 HLSL

dump_shaders 偵錯切換鈕可讓您記錄輸入的 WGSL 著色器和轉譯的後端著色器。從現在起,如果您啟用此功能進行偵錯,當 HLSL 編譯失敗時,系統就會將其轉儲。請參閱問題 dawn:1681

黎明更新

未設定頂點緩衝區

wgpu::RenderPassEncoderwgpu::RenderBundleEncoder 上將 nullptr 而非 wgpu::Buffer 傳遞至 SetVertexBuffer(),即可在特定的插槽中取消設定先前設定的頂點緩衝區。請參閱問題 dawn:1675

// Set vertex buffer in slot 0.
myRenderPassEncoder.SetVertexBuffer(0, myVertexBuffer);

// Then later, unset vertex buffer in slot 0.
myRenderPassEncoder.SetVertexBuffer(0, nullptr);

暫時性附件

您可以建立附件,讓轉譯通道作業保留在圖塊記憶體中,藉此避免 VRAM 流量,並透過設定 wgpu::TextureUsage::TransientAttachment 用量,避免為紋理分配 VRAM。這項功能僅支援 Metal 和 Vulkan。請參閱問題:1695

wgpu::TextureDescriptor desc;
desc.format = wgpu::TextureFormat::RGBA8Unorm;
desc.size = {1, 1, 1};
desc.usage = wgpu::TextureUsage::RenderAttachment |
             wgpu::TextureUsage::TransientAttachment;

auto transientTexture = device.CreateTexture(&desc);

// You can now create views from the texture to serve as transient
// attachments, e.g. as color attachments in a render pipeline.

不使用 depot_tools 進行建構

新的 DAWN_FETCH_DEPENDENCIES CMake 選項可讓您使用可讀取 DEPS 檔案的 Python 指令碼擷取 Dawn 依附元件,而不需要所有依附此依附元件的專案都安裝 depot_tools。請參閱 變更 131750

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