Yang Baru di WebGPU (Chrome\r121)

François Beaufort
François Beaufort

Mendukung WebGPU di Android

Tim Chrome dengan senang hati mengumumkan bahwa WebGPU kini diaktifkan secara default di Chrome 121 di perangkat yang menjalankan Android 12 atau yang lebih baru yang didukung oleh GPU Qualcomm dan ARM.

Dukungan akan diperluas secara bertahap untuk mencakup berbagai perangkat Android, termasuk yang menjalankan Android 11 dalam waktu dekat. Perluasan ini akan bergantung pada pengujian dan pengoptimalan lebih lanjut untuk memastikan pengalaman yang lancar di berbagai konfigurasi hardware. Lihat masalah chromium:1497815.

Screenshot contoh WebGPU yang berjalan di Chrome untuk Android.
Contoh WebGPU yang berjalan di Chrome untuk Android.

Menggunakan DXC, bukan FXC untuk kompilasi shader di Windows

Chrome kini menggunakan kecanggihan DXC (DirectX Compiler) untuk mengompilasi shader pada mesin Windows D3D12 yang dilengkapi dengan hardware grafis SM6+. Sebelumnya, WebGPU mengandalkan FXC (FX Compiler) untuk kompilasi shader di Windows. Meskipun berfungsi, FXC tidak memiliki set fitur dan pengoptimalan performa yang ada di DXC.

Pengujian awal menunjukkan peningkatan rata-rata kecepatan kompilasi shader komputasi sebesar 20% saat menggunakan DXC dibandingkan dengan FXC.

Kueri stempel waktu dalam penerusan komputasi dan render

Kueri stempel waktu memungkinkan aplikasi WebGPU mengukur secara tepat (hingga nanodetik) jumlah waktu yang diperlukan perintah GPU untuk mengeksekusi penerusan komputasi dan render. Model ini banyak digunakan untuk mendapatkan insight tentang performa dan perilaku beban kerja GPU.

Saat fitur "timestamp-query" tersedia di GPUAdapter, kini Anda dapat melakukan hal-hal berikut:

Lihat contoh dan masalah berikut 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();

Karena masalah serangan waktu, kueri stempel waktu dikuantisasi dengan resolusi 100 mikrodetik, yang memberikan kompromi yang baik antara presisi dan keamanan. Di browser Chrome, Anda dapat menonaktifkan kuantisasi stempel waktu dengan mengaktifkan tanda "Fitur Developer WebGPU" di chrome://flags/#enable-webgpu-developer-features selama pengembangan aplikasi. Lihat Kuantisasi kueri stempel waktu untuk mempelajari lebih lanjut.

Karena GPU dapat mereset penghitung stempel waktu sesekali, yang dapat mengakibatkan nilai tidak terduga seperti delta negatif antar-stempel waktu, sebaiknya lihat perubahan perbedaan git yang menambahkan dukungan kueri stempel waktu ke contoh Compute Boids berikut.

Screenshot contoh Compute Boids yang menampilkan kueri stempel waktu.
Contoh Compute Boid yang menampilkan kueri stempel waktu.

Titik entri default ke modul shader

Untuk meningkatkan pengalaman developer, Anda kini dapat menghilangkan entryPoint modul shader saat membuat pipeline komputasi atau render. Jika tidak ada titik entri unik untuk stage shader yang ditemukan dalam kode shader, GPUValidationError akan dipicu. Lihat contoh dan masalah dawn:2254 berikut.

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 }] },
});

Mendukung display-p3 sebagai ruang warna GPUExternalTexture

Anda kini dapat menyetel ruang warna tujuan "display-p3" saat mengimpor GPUExternalTexture dari video HDR dengan importExternalTexture(). Lihat cara WebGPU menangani ruang warna. Lihat contoh dan masalah chromium:1330250 berikut.

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

Info heap memori

Untuk membantu Anda mengantisipasi keterbatasan memori saat mengalokasikan jumlah besar selama pengembangan aplikasi, requestAdapterInfo() kini mengekspos informasi memoryHeaps, seperti ukuran dan jenis heap memori yang tersedia di adaptor. Fitur eksperimental ini hanya dapat diakses jika tanda "WebGPU Developer Features" di chrome://flags/#enable-webgpu-developer-features diaktifkan. Lihat contoh dan masalah fawn:2249 berikut.

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)   { /* ... */ }
}
Screenshot https://webgpureport.org yang menampilkan heap memori dalam info adaptor.
Heap memori info adaptor yang ditampilkan di https://webgpureport.org.

Update Fajar

Metode HasWGSLLanguageFeature dan EnumerateWGSLLanguageFeatures pada wgpu::Instance telah ditambahkan untuk menangani fitur bahasa WGSL. Lihat masalah dawn:2260.

Fitur wgpu::Feature::BufferMapExtendedUsages non-standar memungkinkan Anda membuat buffer GPU dengan wgpu::BufferUsage::MapRead atau wgpu::BufferUsage::MapWrite dan wgpu::BufferUsage lainnya. Lihat contoh dan masalah berikut 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);

Fitur berikut telah didokumentasikan: Berbagi Tekstur ANGLE, Terlindungi multithread D3D11, Sinkronisasi Perangkat Implisit, Format tekstur Norm16, Kueri Stempel Waktu Di Dalam Kartu, Penyimpanan Lokal Pixel, Fitur Shader, dan Format Multi Planar.

Tim Chrome telah membuat repositori GitHub resmi untuk Dawn.

Artikel ini hanya mencakup beberapa sorotan utama. Lihat daftar lengkap commit.

Yang Baru di WebGPU

Daftar semua hal yang tercakup dalam seri What's New in WebGPU.

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