Wat is er nieuw in WebGPU (Chrome 131)

François Beaufort
François Beaufort

Clipafstanden in WGSL

Met knipafstanden kunt u het knipvolume van primitieven beperken met door de gebruiker gedefinieerde halfruimtes in de uitvoer van de vertexfase. Door uw eigen knipvlakken te definiëren, krijgt u meer controle over wat zichtbaar is in uw WebGPU-scènes. Deze techniek is met name handig voor toepassingen zoals CAD-software, waar nauwkeurige controle over de visualisatie cruciaal is.

Wanneer de functie "clip-distances" beschikbaar is in een GPUAdapter, vraag dan een GPUDevice aan met deze functie om ondersteuning voor clip-distances in WGSL te krijgen en schakel deze extensie expliciet in uw WGSL-code in met enable clip_distances; Zodra deze is ingeschakeld, kunt u de ingebouwde array clip_distances in uw vertexshader gebruiken. Deze array bevat afstanden tot een door de gebruiker gedefinieerd clipvlak.

  • Een clipafstand van 0 betekent dat het hoekpunt op het vlak ligt.
  • Een positieve afstand betekent dat het hoekpunt zich binnen de clip-halfruimte bevindt (de zijde die je wilt behouden).
  • Een negatieve afstand betekent dat het hoekpunt zich buiten de clip-halfruimte bevindt (de zijde die je wilt negeren).

Zie het volgende fragment, de chromestatus-vermelding en probleem 358408571 .

const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has("clip-distances")) {
  throw new Error("Clip distances support is not available");
}
// Explicitly request clip distances support.
const device = await adapter.requestDevice({
  requiredFeatures: ["clip-distances"],
});

const vertexShaderModule = device.createShaderModule({ code: `
  enable clip_distances;

  struct VertexOut {
    @builtin(clip_distances) my_clip_distances : array<f32, 1>,
    @builtin(position) my_position : vec4f,
  }
  @vertex fn main() -> VertexOut {
    var output : VertexOut;
    output.my_clip_distances[0] = 1;
    output.my_position = vec4f(0, 0, 0, 1);
    return output;
  }
`,
});

// Send the appropriate commands to the GPU...

GPUCanvasContext getConfiguration()

Nadat GPUCanvasContext configure() is aangeroepen met een configuratiewoordenboek, kunt u met de methode GPUCanvasContext getConfiguration() de configuratie van de canvascontext controleren. Deze bevat de leden device , format , usage , viewFormats , colorSpace , toneMapping en alphaMode . Dit is handig voor taken zoals controleren of de browser HDR-canvas ondersteunt, zoals te zien is in het Particles (HDR)-voorbeeld . Zie het volgende codefragment, de chromestatus-vermelding en probleem 370109829 .

const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();

const canvas = document.querySelector("canvas");
const context = canvas.getContext("webgpu");

// Configure the canvas for HDR.
context.configure({
  device,
  format: "rgba16float",
  toneMapping: { mode: "extended" },
});

const configuration = context.getConfiguration();
if (configuration.toneMapping.mode === "extended") {
  // The browser supports HDR canvas.
  // Warning! The user still needs a HDR display to enjoy HDR content.
}

Punt- en lijnprimitieven mogen geen dieptevoorkeur hebben.

Zoals eerder aangekondigd, is het volgens de WebGPU-specificatie nu een validatiefout om depthBias , depthBiasSlopeScale en depthBiasClamp in te stellen op een waarde die niet nul is, wanneer de topologie van een renderpipeline van het type lijn of punt is. Zie issue 352567424 .

Inclusieve scan met ingebouwde functies voor subgroepen

Als onderdeel van de experimenten met subgroepen zijn de volgende ingebouwde subgroepfuncties toegevoegd in issue 361330160 :

  • subgroupInclusiveAdd(value) : Retourneert de inclusieve scansom van alle actieve value binnen de subgroep.
  • subgroupInclusiveMul(value) : Retourneert de inclusieve scanvermenigvuldiging van alle actieve value binnen de subgroep.

Experimentele ondersteuning voor indirecte meervoudige trekking

De multi-draw indirect GPU-functie stelt u in staat om meerdere draw calls met één GPU-commando uit te voeren. Dit is met name handig in situaties waarin een groot aantal objecten moet worden weergegeven, zoals deeltjessystemen, instantiëring en grote scènes. De methoden drawIndirect() en drawIndexedIndirect() van GPURenderPassEncoder kunnen slechts één draw call tegelijk uitvoeren vanuit een bepaald gebied van een GPU-buffer.

Totdat deze experimentele functie is gestandaardiseerd , kunt u de vlag "Unsafe WebGPU Support" inschakelen via chrome://flags/#enable-unsafe-webgpu om deze beschikbaar te maken in Chrome.

Met de niet-standaard GPU-functie "chromium-experimental-multi-draw-indirect" die beschikbaar is in een GPUAdapter, kunt u een GPUDevice met deze functie aanvragen. Maak vervolgens een GPUBuffer aan met het gebruik GPUBufferUsage.INDIRECT om de tekenoproepen op te slaan. U kunt deze later gebruiken in de nieuwe multiDrawIndirect() en multiDrawIndexedIndirect() GPURenderPassEncoder-methoden om tekenoproepen binnen een renderpass uit te voeren. Zie het volgende codefragment en issue 356461286 .

const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has("chromium-experimental-multi-draw-indirect")) {
  throw new Error("Experimental multi-draw indirect support is not available");
}
// Explicitly request experimental multi-draw indirect support.
const device = await adapter.requestDevice({
  requiredFeatures: ["chromium-experimental-multi-draw-indirect"],
});

// Draw call have vertexCount, instanceCount, firstVertex, and firstInstance parameters.
const drawData = new Uint32Array([
  3, 1, 0, 0, // First draw call
  3, 1, 3, 0, // Second draw call
]);
// Create a buffer to store the draw calls.
const drawBuffer = device.createBuffer({
  size: drawData.byteLength,
  usage: GPUBufferUsage.INDIRECT | GPUBufferUsage.COPY_DST,
});
device.queue.writeBuffer(drawBuffer, 0, drawData);

// Create a render pipeline, a vertex buffer, and a render pass encoder...

// Inside a render pass, issue the draw calls.
myPassEncoder.setPipeline(myPipeline);
myPassEncoder.setVertexBuffer(0, myVertexBuffer);
myPassEncoder.multiDrawIndirect(drawBuffer, /*offset=*/ 0, /*maxDrawCount=*/ 2);
myPassEncoder.end();

Shadermodule-compilatieoptie strikte wiskunde

Er is een boolean-ontwikkelaarsoptie strictMath toegevoegd aan `GPUShaderModuleDescriptor` waarmee je strikte wiskunde kunt in- of uitschakelen tijdens de compilatie van shadermodules. Deze optie is beschikbaar achter de vlag "WebGPU Developer Features" op chrome://flags/#enable-webgpu-developer-features , wat betekent dat het een functie is die alleen bedoeld is voor gebruik tijdens de ontwikkeling. Zie issue 42241455 .

Deze optie wordt momenteel ondersteund door Metal en Direct3D. Wanneer strikte wiskundige bewerkingen zijn uitgeschakeld, kan de compiler uw shaders optimaliseren door:

  • De mogelijkheid van NaN- en Infinity-waarden wordt hierbij buiten beschouwing gelaten.
  • -0 behandelen als +0.
  • Delen vervangen door sneller vermenigvuldigen met het omgekeerde.
  • Het herschikken van bewerkingen op basis van associatieve en distributieve eigenschappen.
const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();

const code = `
  // Examines the bit pattern of the floating-point number to
  // determine if it represents a NaN according to the IEEE 754 standard.
  fn isNan(x : f32) -> bool {
    bool ones_exp = (bitcast<u32>(x) & 0x7f8) == 0x7f8;
    bool non_zero_sig = (bitcast<u32>(x) & 0x7ffff) != 0;
    return ones_exp && non_zero_sig;
  }
  // ...
`;

// Enable strict math during shader compilation.
const shaderModule = device.createShaderModule({ code, strictMath: true });

Verwijder GPUAdapter requestAdapterInfo()

De asynchrone methode requestAdapterInfo() van de GPUAdapter is overbodig, omdat je `GPUAdapterInfo` al synchroon kunt verkrijgen via het info attribuut van de GPUAdapter. Daarom is de niet-standaard ` requestAdapterInfo() -methode van de GPUAdapter nu verwijderd. Zie de intentie om deze te verwijderen .

Dawn-updates

Het uitvoerbare bestand tint_benchmark meet de kosten van het vertalen van shaders van WGSL naar elke backend-taal. Bekijk de nieuwe documentatie voor meer informatie.

Dit is slechts een greep uit de belangrijkste hoogtepunten. Bekijk de volledige lijst met commits .

Wat is er nieuw in WebGPU?

Een lijst van alles wat in de serie ' Wat is nieuw in WebGPU' aan bod is gekomen.

Chrome 144

Chrome 143

Chrome 142

Chrome 141

Chrome 140

Chrome 139

Chrome 138

Chrome 137

Chrome 136

Chrome 135

Chrome 134

Chrome 133

Chrome 132

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