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 bergantung pada pengujian dan pengoptimalan lebih lanjut untuk memastikan pengalaman yang lancar di berbagai konfigurasi hardware yang lebih luas. Lihat masalah chromium:1497815.
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 secara tepat (hingga nanodetik) berapa banyak waktu yang diperlukan perintah GPU untuk menjalankan komputasi dan render pass. VM ini banyak digunakan untuk mendapatkan insight tentang performa dan perilaku workload GPU.
Jika fitur "timestamp-query"
tersedia di GPUAdapter
, Anda kini dapat melakukan hal-hal berikut:
- Meminta
GPUDevice
dengan fitur"timestamp-query"
. - Buat
GPUQuerySet
dari jenis"timestamp"
. - Gunakan
GPUComputePassDescriptor.timestampWrites
danGPURenderPassDescriptor.timestampWrites
untuk menentukan tempat menulis nilai stempel waktu diGPUQuerySet
. - Selesaikan nilai stempel waktu ke dalam
GPUBuffer
denganresolveQuerySet()
. - Baca kembali nilai stempel waktu dengan menyalin hasil dari
GPUBuffer
ke CPU. - Mendekode nilai stempel waktu sebagai
BigInt64Array
.
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 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 "WebGPU Developer Features" flag di chrome://flags/#enable-webgpu-developer-features
selama pengembangan aplikasi Anda. 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.
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 issue 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 menyetel ruang warna tujuan "display-p3"
saat mengimpor GPUExternalTexture dari video HDR dengan importExternalTexture()
. Lihat cara WebGPU menangani ruang warna. Lihat contoh dan masalah berikut 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 menampilkan informasi memoryHeaps
, seperti ukuran dan jenis heap memori yang tersedia di adaptor. Fitur eksperimental ini hanya dapat diakses ketika "Fitur Developer WebGPU" flag di chrome://flags/#enable-webgpu-developer-features
diaktifkan. Lihat contoh berikut dan issue 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) { /* ... */ }
}
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 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, Dilindungi multithread D3D11, Sinkronisasi Perangkat Implisit, format tekstur Norm16, Timestamp Query Inside Passes, 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 commit selengkapnya.
Yang Baru di WebGPU
Daftar semua hal yang telah dibahas dalam seri What's New in WebGPU.
Chrome 128
- Bereksperimen dengan subgrup
- Menghentikan penggunaan setelan bias kedalaman untuk garis dan titik
- Menyembunyikan peringatan error DevTools yang tidak direkam jika preventDefault
- Pengambilan sampel interpolasi WGSL terlebih dahulu dan
- Info terbaru fajar
Chrome 127
- Dukungan eksperimental untuk OpenGL ES di Android
- Atribut info GPUAdapter
- Peningkatan interop WebAssembly
- Memperbaiki error encoder perintah
- Info terbaru fajar
Chrome 126
- Meningkatkan batas maxTextureArrayLayers
- Pengoptimalan upload buffer untuk backend Vulkan
- Peningkatan waktu kompilasi shader
- Buffer perintah yang dikirimkan harus unik
- Info terbaru fajar
Chrome 125
Chrome 124
- Tekstur penyimpanan hanya baca dan baca-tulis
- Dukungan pekerja layanan dan pekerja bersama
- Atribut informasi adaptor baru
- Perbaikan bug
- Info terbaru fajar
Chrome 123
- Dukungan fungsi bawaan DP4a dalam WGSL
- Parameter pointer yang tidak dibatasi dalam WGSL
- sugar sintaksis untuk dereferensi komposit dalam WGSL
- Memisahkan status hanya baca untuk aspek stensil dan kedalaman
- Info terbaru fajar
Chrome 122
- Memperluas jangkauan dengan mode kompatibilitas (fitur dalam pengembangan)
- Meningkatkan batas maxVertexAttributes
- Info terbaru fajar
Chrome 121
- Mendukung WebGPU di Android
- Menggunakan DXC, bukan FXC, untuk kompilasi shader di Windows
- Kueri stempel waktu dalam penerusan komputasi dan render
- Titik entri default ke modul shader
- Mendukung display-p3 sebagai ruang warna GPUExternalTexture
- Info heap memori
- Info terbaru fajar
Chrome 120
- Dukungan untuk nilai floating point 16-bit dalam WGSL
- Menembus batas
- Perubahan pada status depth-stensil
- Pembaruan informasi adaptor
- Kuantisasi kueri stempel waktu
- Fitur pembersihan musim semi
Chrome 119
- Tekstur float 32-bit yang dapat difilter
- format verteks unorm10-10-10-2
- format tekstur rgb10a2uint
- Info terbaru fajar
Chrome 118
- Dukungan HTMLImageElement dan ImageData di
copyExternalImageToTexture()
- Dukungan eksperimental untuk tekstur penyimpanan baca-tulis dan hanya baca
- Info terbaru fajar
Chrome 117
- Membatalkan penetapan buffer verteks
- Membatalkan penetapan bind group
- Menonaktifkan error dari pembuatan pipeline asinkron saat perangkat hilang
- Pembaruan pembuatan modul shader SPIR-V
- Meningkatkan pengalaman developer
- Menyimpan pipeline dengan tata letak yang dibuat secara otomatis
- Info terbaru fajar
Chrome 116
- Integrasi WebCodecs
- Perangkat hilang yang ditampilkan oleh GPUAdapter
requestDevice()
- Menjaga pemutaran video tetap lancar jika
importExternalTexture()
dipanggil - Kesesuaian spesifikasi
- Meningkatkan pengalaman developer
- Info terbaru fajar
Chrome 115
- Ekstensi bahasa WGSL yang didukung
- Dukungan eksperimental untuk Direct3D 11
- Mendapatkan GPU diskret secara default menggunakan daya AC
- Meningkatkan pengalaman developer
- Info terbaru fajar
Chrome 114
- Optimalkan JavaScript
- getCurrentTexture() pada kanvas yang tidak dikonfigurasi menampilkan InvalidStateError
- Info terbaru WGSL
- Info terbaru fajar