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 dan versi lebih baru yang didukung oleh GPU Qualcomm dan ARM.

Dukungan akan diperluas secara bertahap untuk mencakup lebih banyak perangkat Android, termasuk yang berjalan di Android 11 dalam waktu dekat. Perluasan ini akan bergantung pada pengujian dan pengoptimalan lebih lanjut untuk memastikan pengalaman yang lancar di berbagai konfigurasi hardware yang lebih luas. 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 di komputer 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 dengan tepat (hingga nanosekon) berapa lama waktu yang diperlukan perintah GPU untuk menjalankan komputasi dan rendering. Alat ini banyak digunakan untuk mendapatkan insight tentang performa dan perilaku workload GPU.

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

Lihat contoh berikut dan terbitkan 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 pengaturan waktu, kueri stempel waktu dikuantifikasi 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" pada chrome://flags/#enable-webgpu-developer-features selama pengembangan aplikasi. Lihat Kuantisasi kueri stempel waktu untuk mempelajari lebih lanjut.

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

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

Titik entri default ke modul shader

Untuk meningkatkan pengalaman developer, Anda kini dapat menghilangkan entryPoint dari modul shader saat membuat pipeline komputasi atau render. Jika tidak ada titik entri unik untuk stage shader yang ditemukan dalam kode shader, GPUValidationError akan terpicu. Lihat contoh berikut dan masalah 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 }] },
});

Mendukung display-p3 sebagai ruang warna GPUExternalTexture

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

// 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 flag "WebGPU Developer Features" di chrome://flags/#enable-webgpu-developer-features diaktifkan. Lihat contoh berikut dan masalah 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)   { /* ... */ }
}
Screenshot https://webgpureport.org yang menampilkan heap memori di info adaptor.
Heap memori info adaptor yang ditampilkan di https://webgpureport.org.

Update fajar

Metode HasWGSLLanguageFeature dan EnumerateWGSLLanguageFeatures di 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 berikut dan masalah 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: ANGLE Texture Sharing, D3D11 multithread protected, Implicit Device Synchronization, Norm16 texture formats, Timestamp Query Inside Passes, Pixel Local Storage, Shader Features, dan Multi Planar Formats.

Tim Chrome telah membuat repositori GitHub resmi untuk Dawn.

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

Yang Baru di WebGPU

Daftar semua yang telah dibahas dalam seri Yang Baru di 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