Ondersteuning WebGPU op Android
Het Chrome-team kondigt met trots aan dat WebGPU nu standaard is ingeschakeld in Chrome 121 op apparaten met Android 12 en hoger, mogelijk gemaakt door Qualcomm- en ARM-GPU's.
De ondersteuning zal geleidelijk worden uitgebreid naar een breder scala aan Android-apparaten, waaronder apparaten die in de nabije toekomst op Android 11 draaien. Deze uitbreiding zal afhankelijk zijn van verder testen en optimaliseren om een naadloze ervaring over een breder scala aan hardwareconfiguraties te garanderen. Zie uitgave chroom:1497815 .
![Schermafbeelding van een WebGPU-voorbeeld in Chrome voor Android.](https://developer.chrome.google.cn/static/blog/new-in-webgpu-121/image/webgpu-android.png?authuser=0000&hl=nl)
Gebruik DXC in plaats van FXC voor shader-compilatie op Windows
Chrome gebruikt nu de kracht van DXC (DirectX Compiler) om shaders te compileren op Windows D3D12-machines die zijn uitgerust met SM6+ grafische hardware. Voorheen vertrouwde WebGPU op FXC (FX Compiler) voor shader-compilatie op Windows. Hoewel functioneel, miste FXC de functies en prestatie-optimalisaties die aanwezig zijn in DXC.
Uit eerste tests blijkt dat de compute shader-compilatiesnelheid met 20% gemiddeld toeneemt bij gebruik van DXC vergeleken met FXC.
Tijdstempelquery's in reken- en renderpassen
Met tijdstempelquery's kunnen WebGPU-applicaties nauwkeurig meten (tot op de nanoseconde) hoeveel tijd hun GPU-opdrachten nodig hebben om reken- en renderpassen uit te voeren. Ze worden intensief gebruikt om inzicht te krijgen in de prestaties en het gedrag van GPU-workloads.
Wanneer de functie "timestamp-query"
beschikbaar is in een GPUAdapter
, kunt u nu de volgende dingen doen:
- Vraag een
GPUDevice
aan met de functie"timestamp-query"
. - Maak een
GPUQuerySet
van het type"timestamp"
. - Gebruik
GPUComputePassDescriptor.timestampWrites
enGPURenderPassDescriptor.timestampWrites
om te definiëren waar tijdstempelwaarden inGPUQuerySet
moeten worden geschreven. - Los tijdstempelwaarden op in een
GPUBuffer
metresolveQuerySet()
. - Lees tijdstempelwaarden terug door de resultaten van de
GPUBuffer
naar de CPU te kopiëren. - Decodeer tijdstempelwaarden als
BigInt64Array
.
Zie het volgende voorbeeld en geef Dawn:1800 op.
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();
Vanwege problemen met timingaanvallen worden tijdstempelquery's gekwantiseerd met een resolutie van 100 microseconden, wat een goed compromis biedt tussen precisie en beveiliging. In de Chrome-browser kunt u tijdstempelkwantisering uitschakelen door de vlag 'WebGPU Developer Features' in te schakelen op chrome://flags/#enable-webgpu-developer-features
tijdens de ontwikkeling van uw app. Zie Kwantisering van tijdstempelquery's voor meer informatie.
Omdat GPU's de tijdstempelteller af en toe kunnen resetten, wat kan resulteren in onverwachte waarden zoals negatieve delta's tussen tijdstempels, raad ik je aan de git diff-wijzigingen te bekijken die ondersteuning voor tijdstempelquery's toevoegen aan het volgende Compute Boids -voorbeeld.
![Schermafbeelding van een Compute Boids-voorbeeld met tijdstempelquery.](https://developer.chrome.google.cn/static/blog/new-in-webgpu-121/image/compute-boids.png?authuser=0000&hl=nl)
Standaardingangspunten voor shadermodules
Om de ontwikkelaarservaring te verbeteren, kunt u nu het entryPoint
van uw shader-module weglaten bij het maken van een reken- of renderpijplijn. Als er geen uniek toegangspunt voor de shader-fase wordt gevonden in de shader-code, wordt een GPUValidationError geactiveerd. Zie het volgende voorbeeld en geef Dawn:2254 op .
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 }] },
});
Ondersteuning display-p3 als GPUExternalTexture-kleurruimte
U kunt nu de doelkleurruimte "display-p3"
instellen bij het importeren van een GPUExternalTexture uit HDR-video's met importExternalTexture()
. Bekijk hoe WebGPU omgaat met kleurruimten . Zie het volgende voorbeeld en geef chroom:1330250 op.
// Create texture from HDR video.
const video = document.querySelector("video");
const texture = myDevice.importExternalTexture({
source: video,
colorSpace: "display-p3",
});
Informatie over geheugenheaps
Om u te helpen geheugenbeperkingen te anticiperen bij het toewijzen van grote hoeveelheden tijdens de ontwikkeling van uw app, geeft requestAdapterInfo()
nu memoryHeaps
informatie vrij, zoals de grootte en het type geheugenheaps die beschikbaar zijn op de adapter. Deze experimentele functie is alleen toegankelijk als de vlag 'WebGPU Developer Features' op chrome://flags/#enable-webgpu-developer-features
is ingeschakeld. Zie het volgende voorbeeld en geef Dawn:2249 op .
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) { /* ... */ }
}
![Schermafbeelding van https://webgpureport.org met geheugenhopen in adapterinformatie.](https://developer.chrome.google.cn/static/blog/new-in-webgpu-121/image/webgpureport.png?authuser=0000&hl=nl)
Dawn-updates
De methoden HasWGSLLanguageFeature
en EnumerateWGSLLanguageFeatures
op wgpu::Instance
zijn toegevoegd om WGSL-taalfuncties te verwerken. Zie uitgave Dawn:2260 .
Met de niet-standaard wgpu::Feature::BufferMapExtendedUsages
kunt u een GPU-buffer maken met wgpu::BufferUsage::MapRead
of wgpu::BufferUsage::MapWrite
en elke andere wgpu::BufferUsage
. Zie het volgende voorbeeld en geef Dawn:2204 op.
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);
De volgende functies zijn gedocumenteerd: ANGLE Texture Sharing , D3D11 multithread-beveiligd , Impliciete apparaatsynchronisatie , Norm16-textuurformaten , Timestamp Query Inside Passes , Pixel Local Storage , Shader-functies en Multi Planar Formats .
Het Chrome-team heeft een officiële GitHub-repository voor Dawn gemaakt.
Dit behandelt slechts enkele van de belangrijkste hoogtepunten. Bekijk de uitgebreide lijst met commits .
Wat is er nieuw in WebGPU
Een lijst met alles wat aan bod komt in de What's New in WebGPU- serie.
Chroom 128
- Experimenteren met subgroepen
- Beëindig het instellen van diepteafwijking voor lijnen en punten
- Niet-opgevangen fout verbergen DevTools-waarschuwing als preventieDefault
- WGSL interpoleert eerst de bemonstering en een van beide
- Dawn-updates
Chroom 127
- Experimentele ondersteuning voor OpenGL ES op Android
- GPUAdapter info-kenmerk
- Verbeteringen in de interoperabiliteit van WebAssembly
- Verbeterde opdracht-encoderfouten
- Dawn-updates
Chroom 126
- Verhoog de maxTextureArrayLayers-limiet
- Bufferuploadoptimalisatie voor Vulkan-backend
- Verbeteringen in de compilatietijd van Shader
- Ingezonden opdrachtbuffers moeten uniek zijn
- Dawn-updates
Chroom 125
Chroom 124
- Alleen-lezen en lezen-schrijven opslagtexturen
- Ondersteuning van servicemedewerkers en gedeelde medewerkers
- Nieuwe attributen voor adapterinformatie
- Bugfixes
- Dawn-updates
Chroom 123
- DP4a ingebouwde functies ondersteunen in WGSL
- Onbeperkte pointerparameters in WGSL
- Syntaxissuiker voor het derefereren van composieten in WGSL
- Afzonderlijke alleen-lezen-status voor stencil- en diepteaspecten
- Dawn-updates
Chroom 122
- Vergroot het bereik met de compatibiliteitsmodus (functie in ontwikkeling)
- Verhoog de maxVertexAttributes-limiet
- Dawn-updates
Chroom 121
- Ondersteuning WebGPU op Android
- Gebruik DXC in plaats van FXC voor shader-compilatie op Windows
- Tijdstempelquery's in reken- en renderpassen
- Standaardingangspunten voor shadermodules
- Ondersteuning display-p3 als GPUExternalTexture-kleurruimte
- Informatie over geheugenheaps
- Dawn-updates
Chroom 120
- Ondersteuning voor 16-bit drijvende-kommawaarden in WGSL
- Verleg de grenzen
- Wijzigingen in de staat van de diepte-stencil
- Updates van adapterinformatie
- Kwantisering van tijdstempelquery's
- Lenteschoonmaakfuncties
Chroom 119
- Filterbare 32-bit float-texturen
- unorm10-10-10-2 hoekpuntformaat
- rgb10a2uint textuurformaat
- Dawn-updates
Chroom 118
- HTMLImageElement- en ImageData-ondersteuning in
copyExternalImageToTexture()
- Experimentele ondersteuning voor lees-schrijf- en alleen-lezen opslagtextuur
- Dawn-updates
Chroom 117
- Schakel hoekpuntbuffer uit
- Schakel de bindingsgroep uit
- Stil fouten bij het maken van asynchrone pijplijnen wanneer het apparaat verloren gaat
- Updates voor het maken van SPIR-V-shadermodules
- Verbetering van de ontwikkelaarservaring
- Caching van pijplijnen met automatisch gegenereerde lay-out
- Dawn-updates
Chroom 116
- WebCodecs-integratie
- Verloren apparaat geretourneerd door GPUAdapter
requestDevice()
- Houd het afspelen van video soepel als
importExternalTexture()
wordt aangeroepen - Spec-conformiteit
- Verbetering van de ontwikkelaarservaring
- Dawn-updates
Chroom 115
- Ondersteunde WGSL-taalextensies
- Experimentele ondersteuning voor Direct3D 11
- Krijg standaard een discrete GPU op wisselstroom
- Verbetering van de ontwikkelaarservaring
- Dawn-updates
Chroom 114
- Optimaliseer JavaScript
- getCurrentTexture() op een niet-geconfigureerd canvas genereert InvalidStateError
- WGSL-updates
- Dawn-updates