WebGPU 新功能's (Chrome 約 121)

François Beaufort
François Beaufort

在 Android 上支援 WebGPU

Chrome 團隊很高興宣布,在搭載 Qualcomm 和 ARM GPU 的 Android 12 以上版本裝置上,Chrome 121 現在預設會啟用 WebGPU。

我們將逐步擴大支援範圍,在不久的將來,支援更多 Android 裝置,包括搭載 Android 11 的裝置。這項擴展計畫將取決於進一步的測試和最佳化,確保在更多硬體設定中提供流暢體驗。請參閱問題 chromium:1497815

在 Android 版 Chrome 上執行的 WebGPU 範例螢幕截圖。
在 Android 版 Chrome 上執行的 WebGPU 範例。

在 Windows 上編譯著色器時,請使用 DXC 而非 FXC

Chrome 現在會使用 DXC (DirectX 編譯器) 在搭載 SM6 以上圖形硬體的 Windows D3D12 電腦上編譯著色器。先前,WebGPU 在 Windows 上進行著色器編譯時,會使用 FXC (FX 編譯器)。FXC 雖然能正常運作,但缺少 DXC 的功能集和效能最佳化功能。

初步測試結果顯示,與 FXC 相比,使用 DXC 時的計算著色器編譯速度平均提升了 20%。

運算和算繪傳遞中的時間戳記查詢

時間戳記查詢可讓 WebGPU 應用程式精確測量 (精確度達奈秒單位),GPU 指令執行運算和算繪作業所需的時間。這些指標可用來深入瞭解 GPU 工作負載的效能和行為。

"timestamp-query" 功能在 GPUAdapter 中推出後,你就能執行下列操作:

請參閱以下範例和 dawn:1800 問題。

const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has("timestamp-query")) {
  throw new Error("Timestamp query feature is not available");
}
// Explicitly request timestamp query feature.
const device = await adapter.requestDevice({
  requiredFeatures: ["timestamp-query"],
});
const commandEncoder = device.createCommandEncoder();

// Create a GPUQuerySet which holds 2 timestamp query results: one for the
// beginning and one for the end of compute pass execution.
const querySet = device.createQuerySet({ type: "timestamp", count: 2 });
const timestampWrites = {
  querySet,
  beginningOfPassWriteIndex: 0, // Write timestamp in index 0 when pass begins.
  endOfPassWriteIndex: 1, // Write timestamp in index 1 when pass ends.
};
const passEncoder = commandEncoder.beginComputePass({ timestampWrites });
// TODO: Set pipeline, bind group, and dispatch work to be performed.
passEncoder.end();

// Resolve timestamps in nanoseconds as a 64-bit unsigned integer into a GPUBuffer.
const size = 2 * BigInt64Array.BYTES_PER_ELEMENT;
const resolveBuffer = device.createBuffer({
  size,
  usage: GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.COPY_SRC,
});
commandEncoder.resolveQuerySet(querySet, 0, 2, resolveBuffer, 0);

// Read GPUBuffer memory.
const resultBuffer = device.createBuffer({
  size,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ,
});
commandEncoder.copyBufferToBuffer(resolveBuffer, 0, resultBuffer, 0, size);

// Submit commands to the GPU.
device.queue.submit([commandEncoder.finish()]);

// Log compute pass duration in nanoseconds.
await resultBuffer.mapAsync(GPUMapMode.READ);
const times = new BigInt64Array(resultBuffer.getMappedRange());
console.log(`Compute pass duration: ${Number(times[1] - times[0])}ns`);
resultBuffer.unmap();

基於時間攻擊考量,時間戳記查詢會以 100 微秒的解析度量化,在精確度和安全性之間取得良好平衡。在 Chrome 瀏覽器中開發應用程式時,您可以在 chrome://flags/#enable-webgpu-developer-features 啟用「WebGPU 開發人員功能」旗標,停用時間戳記量化功能。詳情請參閱「時間戳記查詢量化」。

GPU 偶爾可能會重設時間戳記計數器,導致出現非預期的值,例如時間戳記之間的負值差異,因此建議您查看 git diff 變更,將時間戳記查詢支援新增至下列 Compute Boids 範例。

Compute Boids 範例的螢幕截圖,顯示時間戳記查詢。
Compute Boids 範例,包含時間戳記查詢。

著色器模組的預設進入點

為提升開發人員體驗,您現在建立運算或算繪管道時,可以省略著色器模組的 entryPoint。如果在著色器程式碼中找不到著色器階段的專屬進入點,系統會觸發 GPUValidationError。請參閱以下範例和問題 dawn:2254

const code = `
    @vertex fn vertexMain(@builtin(vertex_index) i : u32) ->
      @builtin(position) vec4f {
       const pos = array(vec2f(0, 1), vec2f(-1, -1), vec2f(1, -1));
       return vec4f(pos[i], 0, 1);
    }
    @fragment fn fragmentMain() -> @location(0) vec4f {
      return vec4f(1, 0, 0, 1);
    }`;
const module = myDevice.createShaderModule({ code });
const format = navigator.gpu.getPreferredCanvasFormat();
const pipeline = await myDevice.createRenderPipelineAsync({
  layout: "auto",
  vertex: { module, entryPoint: "vertexMain" },
  fragment: { module, entryPoint: "fragmentMain", targets: [{ format }] },
  vertex: { module },
  fragment: { module, targets: [{ format }] },
});

支援將 display-p3 做為 GPUExternalTexture 色彩空間

現在從 HDR 影片匯入 GPUExternalTexture 時,可以使用 importExternalTexture() 設定"display-p3"目的地色域。瞭解 WebGPU 如何處理色彩空間。請參閱以下範例和問題 chromium:1330250

// Create texture from HDR video.
const video = document.querySelector("video");
const texture = myDevice.importExternalTexture({
  source: video,
  colorSpace: "display-p3",
});

記憶體堆積資訊

為協助您在開發應用程式時分配大量記憶體,預先瞭解記憶體限制,requestAdapterInfo() 現在會公開 memoryHeaps 資訊,例如介面上可用記憶體堆積的大小和類型。只有在 chrome://flags/#enable-webgpu-developer-features 啟用「WebGPU 開發人員功能」旗標時,才能存取這項實驗功能。請參閱以下範例和問題 dawn:2249

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

for (const { size, properties } of adapterInfo.memoryHeaps) {
  console.log(size); // memory heap size in bytes
  if (properties & GPUHeapProperty.DEVICE_LOCAL)  { /* ... */ }
  if (properties & GPUHeapProperty.HOST_VISIBLE)  { /* ... */ }
  if (properties & GPUHeapProperty.HOST_COHERENT) { /* ... */ }
  if (properties & GPUHeapProperty.HOST_UNCACHED) { /* ... */ }
  if (properties & GPUHeapProperty.HOST_CACHED)   { /* ... */ }
}
https://webgpureport.org 的螢幕截圖,顯示介面卡資訊中的記憶體堆積。
https://webgpureport.org 顯示的介面卡資訊記憶體堆積。

黎明更新

wgpu::Instance 已新增 HasWGSLLanguageFeatureEnumerateWGSLLanguageFeatures 方法,可處理 WGSL 語言功能。請參閱問題 dawn:2260

非標準 wgpu::Feature::BufferMapExtendedUsages 功能可讓您使用 wgpu::BufferUsage::MapReadwgpu::BufferUsage::MapWrite 和任何其他 wgpu::BufferUsage 建立 GPU 緩衝區。請參閱以下範例和 dawn:2204 問題。

wgpu::BufferDescriptor descriptor = {
  .size = 128,
  .usage = wgpu::BufferUsage::MapWrite | wgpu::BufferUsage::Uniform
};
wgpu::Buffer uniformBuffer = device.CreateBuffer(&descriptor);

uniformBuffer.MapAsync(wgpu::MapMode::Write, 0, 128,
   [](WGPUBufferMapAsyncStatus status, void* userdata)
   {
      wgpu::Buffer* buffer = static_cast<wgpu::Buffer*>(userdata);
      memcpy(buffer->GetMappedRange(), data, sizeof(data));
   },
   &uniformBuffer);

以下功能已記錄在案:ANGLE 紋理共用D3D11 多執行緒保護隱含裝置同步Norm16 紋理格式傳遞內的時間戳記查詢像素本機儲存空間著色器功能多平面格式

Chrome 團隊已建立 Dawn 的官方 GitHub 存放區

這僅涵蓋部分重點。請參閱完整的提交清單

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