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.
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:
- Minta
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 menjadi
GPUBuffer
denganresolveQuerySet()
. - Baca nilai stempel waktu kembali dengan menyalin hasil dari
GPUBuffer
ke CPU. - Dekode 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 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.
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) { /* ... */ }
}
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
- Tekstur penyimpanan hanya baca dan baca-tulis
- Dukungan pekerja layanan dan pekerja bersama
- Atribut informasi adaptor baru
- Perbaikan bug
- Update fajar
Chrome 123
- Dukungan fungsi bawaan DP4a dalam WGSL
- Parameter pointer yang tidak dibatasi dalam WGSL
- Gula sintaksis untuk dereferensi komposit dalam WGSL
- Pisahkan status hanya baca untuk aspek stensil dan kedalaman
- Update fajar
Chrome 122
- Memperluas jangkauan dengan mode kompatibilitas (fitur dalam pengembangan)
- Meningkatkan batas maxVertexAttributes
- Update 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
- Update fajar
Chrome 120
- Dukungan untuk nilai floating point 16-bit dalam WGSL
- Capai batas
- Perubahan pada status stensil kedalaman
- Pembaruan informasi adaptor
- Kuantisasi kueri stempel waktu
- Fitur bersih-bersih
Chrome 119
- Tekstur float 32-bit yang dapat difilter
- format verteks unorm10-10-10-2
- Format tekstur rgb10a2uint
- Update fajar
Chrome 118
- Dukungan HTMLImageElement dan ImageData di
copyExternalImageToTexture()
- Dukungan eksperimental untuk tekstur penyimpanan baca-tulis dan hanya baca
- Update fajar
Chrome 117
- Membatalkan penetapan buffer verteks
- Tidak menetapkan bind group
- Menonaktifkan error dari pembuatan pipeline asinkron saat perangkat hilang
- Update pembuatan modul shader SPIR-V
- Meningkatkan pengalaman developer
- Menyimpan data dalam cache dengan tata letak yang dibuat secara otomatis
- Update fajar
Chrome 116
- Integrasi WebCodecs
- Perangkat hilang yang ditampilkan oleh GPUAdapter
requestDevice()
- Buat pemutaran video tetap lancar jika
importExternalTexture()
dipanggil - Kesesuaian spesifikasi
- Meningkatkan pengalaman developer
- Update fajar
Chrome 115
- Ekstensi bahasa WGSL yang didukung
- Dukungan eksperimental untuk Direct3D 11
- Mendapatkan GPU diskret secara default menggunakan daya AC
- Meningkatkan pengalaman developer
- Update fajar
Chrome 114
- Mengoptimalkan JavaScript
- getCurrentTexture() pada kanvas yang tidak dikonfigurasi menampilkan InvalidStateError
- Info terbaru WGSL
- Update fajar