WebGPU ondersteunen op Android
Het Chrome-team kondigt met trots aan dat WebGPU nu standaard aanstaat in Chrome 121 op apparaten met Android 12 en hoger die worden aangedreven door Qualcomm- en ARM-GPU's.
De ondersteuning wordt geleidelijk uitgebreid naar een breder scala aan Android-apparaten, waaronder apparaten met Android 11 in de nabije toekomst. Deze uitbreiding is afhankelijk van verdere tests en optimalisatie om een naadloze functionaliteit te garanderen voor een breder scala aan hardwareconfiguraties. Ga naar issue chromium:1497815.
DXC gebruiken in plaats van FXC voor shadercompilatie in Windows
Chrome gebruikt nu de kracht van DXC (DirectX Compiler) om shaders te compileren op Windows D3D12-machines met SM6+-grafische hardware. Eerder was WebGPU afhankelijk van FXC (FX Compiler) voor shadercompilatie in Windows. FXC was functioneel, maar had niet de functies en prestatieoptimalisaties van DXC.
Uit eerste tests blijkt dat de compilatiesnelheid van berekeningsshaders gemiddeld 20% hoger is als je DXC gebruikt in vergelijking met FXC.
Tijdstempelquery's in berekenings- en weergavefasen
Met tijdstempelquery's kunnen WebGPU-apps precies (tot op de nanoseconde) meten hoeveel tijd hun GPU-opdrachten nodig hebben om berekenings- en weergaveprocessen uit te voeren. Ze worden veel gebruikt om inzicht te krijgen in de prestaties en het gedrag van GPU-workloads.
Als de functie "timestamp-query" beschikbaar is in een GPUAdapter, kun je nu het volgende doen:
- Vraag een
GPUDeviceaan met de functie"timestamp-query". - Maak een
GPUQuerySetvan het type"timestamp". - Gebruik
GPUComputePassDescriptor.timestampWritesenGPURenderPassDescriptor.timestampWritesom te definiëren waar tijdstempelwaarden moeten worden geschreven inGPUQuerySet. - Tijdstempelwaarden omzetten in een
GPUBuffermetresolveQuerySet(). - Lees tijdstempelwaarden terug door de resultaten van de
GPUBuffernaar de CPU te kopiëren. - Tijdstempelwaarden decoderen als een
BigInt64Array.
Bekijk het volgende voorbeeld en geef dawn:1800 uit.
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 zorgen over timingaanvallen worden tijdstempelquery's gekwantiseerd met een resolutie van 100 microseconden. Dit is een goed compromis tussen nauwkeurigheid en beveiliging. In de Chrome-browser kun je kwantisatie van tijdstempels uitzetten door de flag WebGPU Developer Features aan te zetten op chrome://flags/#enable-webgpu-developer-features tijdens de ontwikkeling van je app. Ga naar Kwantisatie van tijdstempelquery's voor meer informatie.
Omdat GPU's de tijdstempelcounter af en toe kunnen resetten, wat kan leiden tot onverwachte waarden zoals negatieve delta's tussen tijdstempels, raad ik je aan de git diff-wijzigingen te checken die ondersteuning voor tijdstempelquery's toevoegen aan het volgende Compute Boids-voorbeeld.
Standaard startpunten voor shadermodules
Je kunt nu de entryPoint van je shader-module weglaten als je een berekenings- of weergavepijplijn maakt. Zo verbeter je de ontwikkelaarservaring. Als er geen uniek toegangspunt voor de shaderfase wordt gevonden in de shadercode, wordt er een GPUValidationError geactiveerd. Bekijk het volgende voorbeeld en probleem 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 }] },
});
Ondersteuning voor display-p3 als GPUExternalTexture-kleurruimte
Je kunt nu de "display-p3"bestemmingskleurruimte instellen als je een GPUExternalTexture importeert uit HDR-video's met importExternalTexture(). Ontdek hoe WebGPU kleurruimten verwerkt. Raadpleeg het volgende voorbeeld en het probleem chromium:1330250.
// Create texture from HDR video.
const video = document.querySelector("video");
const texture = myDevice.importExternalTexture({
source: video,
colorSpace: "display-p3",
});
Informatie over geheugen-heaps
requestAdapterInfo() biedt nu memoryHeaps-informatie, zoals de grootte en het type geheugen-heaps die beschikbaar zijn op de adapter. Zo kun je tijdens de ontwikkeling van je app rekening houden met geheugenbeperkingen als je grote hoeveelheden toewijst. Deze experimentele functie is alleen toegankelijk als de flag WebGPU Developer Features (WebGPU-ontwikkelaarsfuncties) op chrome://flags/#enable-webgpu-developer-features aanstaat. Bekijk het volgende voorbeeld en probleem 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) { /* ... */ }
}
Updates voor Dawn
De methoden HasWGSLLanguageFeature en EnumerateWGSLLanguageFeatures op wgpu::Instance zijn toegevoegd om WGSL-taalfuncties te verwerken. Ga naar probleem dawn:2260.
Met de niet-standaard functie wgpu::Feature::BufferMapExtendedUsages kun je een GPU-buffer maken met wgpu::BufferUsage::MapRead of wgpu::BufferUsage::MapWrite en een andere wgpu::BufferUsage. Bekijk het volgende voorbeeld en het probleem 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);
De volgende functies zijn gedocumenteerd: ANGLE Texture Sharing, D3D11 multithread protected, Implicit Device Synchronization, Norm16 texture formats, Timestamp Query Inside Passes, Pixel Local Storage, Shader Features en Multi Planar Formats.
Het Chrome-team heeft een officiële GitHub-repository voor Dawn gemaakt.
Dit zijn maar enkele van de belangrijkste punten. Neem de uitgebreide lijst met doorvoeringen door.
Wat is er nieuw in WebGPU?
Een lijst met alles wat is behandeld in de serie Nieuw in WebGPU.
Chrome 155-156
- WGSL-extensie fragment_depth
- Textuurcompressie niet uitgelijnd
- Kleurruimten srgb-lineair en display-p3-lineair
- Aanvullende hoekpuntindeling snorm10-10-10-2
- f16-ondersteuning op Linux voor NVIDIA
- Updates voor Dageraad
Chrome 153-154
- WGSL buffer_view-extensie
- WGSL-extensie voor swizzle-toewijzing
- Updates voor WGSL-extensies
- Updates voor Dageraad
Chrome 151-152
- Subgroepgrootte beheren
- OperationError voor validatiefouten voor setImmediates
- Updates voor Dageraad
Chrome 149-150
Chrome 147-148
Chrome 146
- Ondersteuning voor de WebGPU-compatibiliteitsmodus op OpenGL ES 3.1
- Tijdelijke bijlagen
- WGSL-extensie texture_and_sampler_let
- Updates voor Dageraad
Chrome 145
- WGSL-extensie subgroup_uniformity
- Experimentele synchrone buffermapping in werknemers
- Updates voor Dageraad
Chrome 144
- WGSL-extensie subgroup_id
- WGSL uniform_buffer_standard_layout-extensie
- WebGPU op Linux
- Snellere writeBuffer en writeTexture
- Updates voor Dageraad
Chrome 143
- Swizzle van textuurcomponent
- Gebruik van alleen-lezen opslagtextuur bgra8unorm verwijderen
- Updates voor Dageraad
Chrome 142
Chrome 141
- Tint IR afgerond
- Analyse van gehele getallen in de WGSL-compiler
- SPIR-V 1.4-update voor Vulkan-backend
- Updates voor Dageraad
Chrome 140
- Apparaatverzoeken verbruiken de adapter
- Afkorting voor het gebruik van textuur als de textuurweergave wordt gebruikt
- WGSL textureSampleLevel ondersteunt 1D-textures
- Gebruik van alleen-lezen opslagtextuur bgra8unorm beëindigen
- Kenmerk isFallbackAdapter van GPUAdapter verwijderen
- Updates voor Dageraad
Chrome 139
- Ondersteuning voor 3D-texturen voor BC- en ASTC-gecomprimeerde indelingen
- Nieuwe functie kernfuncties en limieten
- Origin trial voor de compatibiliteitsmodus van WebGPU
- Updates voor Dageraad
Chrome 138
- Afkorting voor het gebruik van een buffer als bindende bron
- Wijzigingen in de formaatvereisten voor buffers die bij het maken zijn toegewezen
- Architectuurrapport voor recente GPU's
- Kenmerk isFallbackAdapter van GPUAdapter beëindigen
- Updates voor Dageraad
Chrome 137
- Textuurweergave gebruiken voor externe textuurbinding
- Buffers copy without specifying offsets and size
- WGSL workgroupUniformLoad met een pointer naar atomic
- Kenmerk powerPreference van GPUAdapterInfo
- Kenmerk compatibilityMode verwijderen uit GPURequestAdapterOptions
- Updates voor Dageraad
Chrome 136
- Kenmerk isFallbackAdapter van GPUAdapterInfo
- Verbeteringen in de compilatietijd van shaders op D3D12
- Canvasafbeeldingen opslaan en kopiëren
- Beperkingen voor de compatibiliteitsmodus voor impact
- Updates voor Dageraad
Chrome 135
- Pijplijnindeling maken met een null-bindgroepindeling toestaan
- Toestaan dat viewports buiten de grenzen van de weergavedoelen vallen
- Makkelijker toegang tot de experimentele compatibiliteitsmodus op Android
- De limiet maxInterStageShaderComponents verwijderen
- Updates voor Dageraad
Chrome 134
- Workloads voor machine learning verbeteren met subgroepen
- Ondersteuning verwijderen voor zwevende filterbare textuurtypen als mengbaar
- Updates voor Dageraad
Chrome 133
- Aanvullende unorm8x4-bgra- en 1-component vertex-indelingen
- Toestaan dat onbekende limieten worden aangevraagd met een niet-gedefinieerde waarde
- Wijzigingen in de uitlijningsregels voor WGSL
- WGSL-prestatieverbeteringen met discard
- VideoFrame.displaySize gebruiken voor externe texturen
- Afbeeldingen met niet-standaard richtingen verwerken met copyExternalImageToTexture
- De ontwikkelaarservaring verbeteren
- De compatibiliteitsmodus aanzetten met featureLevel
- Opschoning van experimentele subgroepfuncties
- De limiet maxInterStageShaderComponents beëindigen
- Updates voor Dageraad
Chrome 132
- Gebruik van textuurweergave
- 32-bits floating-point texture blending
- GPUDevice-kenmerk adapterInfo
- Als u het canvascontext configureert met een ongeldige indeling, treedt er een JavaScript-fout op
- Beperkingen voor het filteren van samplers op texturen
- Uitgebreide experimenten met subgroepen
- De ontwikkelaarservaring verbeteren
- Experimentele ondersteuning voor genormaliseerde 16-bits textuurindelingen
- Updates voor Dageraad
Chrome 131
- Afstanden knippen in WGSL
- GPUCanvasContext getConfiguration()
- Punt- en lijnprimitieven mogen geen dieptebias hebben
- Inclusieve scan met ingebouwde functies voor subgroepen
- Experimentele ondersteuning voor indirect tekenen met meerdere tekeningen
- Optie voor compilatie van shader-modules strict math
- GPUAdapter requestAdapterInfo() verwijderen
- Updates voor Dageraad
Chrome 130
- Mengen van 2 bronnen
- Verbeteringen in de compilatietijd van shaders op Metal
- Beëindiging van GPUAdapter requestAdapterInfo()
- Updates voor Dageraad
Chrome 129
- HDR-ondersteuning met de modus voor tinttoewijzing van het canvas
- Uitgebreide ondersteuning voor subgroepen
- Updates voor Dageraad
Chrome 128
- Experimenteren met subgroepen
- Dieptebias instellen voor lijnen en punten wordt beëindigd
- DevTools-waarschuwing voor niet-vastgelegde fout verbergen als preventDefault
- WGSL interpoleert eerst de sampling en daarna
- Updates voor Dageraad
Chrome 127
- Experimentele ondersteuning voor OpenGL ES op Android
- Kenmerk info van GPUAdapter
- Verbeteringen in WebAssembly-interoperabiliteit
- Verbeterde fouten in opdrachtcodering
- Updates voor Dageraad
Chrome 126
- De limiet voor maxTextureArrayLayers verhogen
- Optimalisatie van bufferuploads voor Vulkan-backend
- Verbeteringen in de compilatietijd van shaders
- Ingediende opdrachtbuffers moeten uniek zijn
- Updates voor Dageraad
Chrome 125
- Subgroepen (functie in ontwikkeling)
- Renderen naar een segment van een 3D-textuur
- Updates voor Dageraad
Chrome 124
- Alleen-lezen en lees-/schrijftopslagtexturen
- Ondersteuning voor service workers en shared workers
- Nieuwe kenmerken voor adapterinformatie
- Bug fixes
- Updates voor Dageraad
Chrome 123
- Ondersteuning voor ingebouwde DP4a-functies in WGSL
- Onbeperkte aanwijzerparameters in WGSL
- Syntactische suiker voor het derefereren van samengestelde typen in WGSL
- Aparte alleen-lezen status voor stencils en diepte
- Updates voor Dageraad
Chrome 122
- Uw bereik vergroten met de compatibiliteitsmodus (functie in ontwikkeling)
- De limiet voor maxVertexAttributes verhogen
- Updates voor Dageraad
Chrome 121
- WebGPU ondersteunen op Android
- DXC gebruiken in plaats van FXC voor shadercompilatie in Windows
- Tijdstempelquery's in berekenings- en weergavefasen
- Standaard toegangspunten voor shadermodules
- Ondersteuning voor display-p3 als GPUExternalTexture-kleurruimte
- Informatie over geheugen-heaps
- Updates voor Dageraad
Chrome 120
- Ondersteuning voor 16-bits zwevendekommawaarden in WGSL
- De grenzen verleggen
- Wijzigingen in de diepte-stencilstatus
- Updates van adaptergegevens
- Kwantisatie van tijdstempelquery's
- Functies voor voorjaarsschoonmaak
Chrome 119
- Filterbare 32-bits float-texturen
- unorm10-10-10-2-hoekpuntindeling
- rgb10a2uint-textuurindeling
- Updates voor Dageraad
Chrome 118
- Ondersteuning voor HTMLImageElement en ImageData in
copyExternalImageToTexture() - Experimentele ondersteuning voor opslagtexturen met lees-/schrijfrechten en alleen-lezenrechten
- Updates voor Dageraad
Chrome 117
- Knooppuntbuffer verwijderen
- Bindgroep verwijderen
- Fouten bij het maken van een asynchrone pijplijn negeren als het apparaat kwijt is
- Updates voor het maken van SPIR-V-shadermodules
- De ontwikkelaarservaring verbeteren
- Caching-pipelines met automatisch gegenereerde indeling
- Updates voor Dageraad
Chrome 116
- WebCodecs-integratie
- Verloren apparaat geretourneerd door GPUAdapter
requestDevice() - Zorgen dat video's vloeiend worden afgespeeld als
importExternalTexture()wordt aangeroepen - Specificatieovereenstemming
- De ontwikkelaarservaring verbeteren
- Updates voor Dageraad
Chrome 115
- Ondersteunde WGSL-taalextensies
- Experimentele ondersteuning voor Direct3D 11
- Standaard discrete GPU bij netvoeding
- De ontwikkelaarservaring verbeteren
- Updates voor Dageraad
Chrome 114
- JavaScript van Optimize
- getCurrentTexture() voor niet-ingestelde canvas geeft InvalidStateError
- WGSL-updates
- Updates voor Dageraad