Wat is er nieuw in WebGPU (Chrome 131)

François Beaufort
François Beaufort

Clipafstanden in WGSL

Met clipafstanden kunt u het clipvolume van primitieven beperken met door de gebruiker gedefinieerde halve ruimtes in de uitvoer van de vertexstage. Het definiëren van uw eigen clipvlakken geeft u meer controle over wat er 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 met deze functie aan 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 functie is ingeschakeld, kunt u de ingebouwde clip_distances -array 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 halve clipruimte bevindt (de zijde die u wilt behouden).
  • Een negatieve afstand betekent dat het hoekpunt zich buiten de halve clipruimte bevindt (de zijde die u wilt weggooien).

Zie het volgende fragment, de chromestatus-invoer 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 GPUCanvasContext getConfiguration() methode de configuratie van de canvascontext controleren. Deze bevat de leden device , format , usage , viewFormats , colorSpace , toneMapping en alphaMode . Dit is handig voor taken zoals het controleren of de browser HDR-canvas ondersteunt, zoals getoond in het voorbeeld van Particles (HDR) . Zie het volgende fragment, de vermelding chromestatus en issue 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 dieptebias hebben

Zoals eerder aangekondigd, is het volgens de WebGPU-specificatie nu een validatiefout om depthBias , depthBiasSlopeScale en depthBiasClamp in te stellen op een waarde anders dan nul wanneer de topologie voor een renderpijplijn een lijn- of punttype is. Zie probleem 352567424 .

Inclusief ingebouwde scanfuncties voor subgroepen

Als onderdeel van het experimenteren met subgroepen zijn de volgende ingebouwde subgroepfuncties toegevoegd in uitgave 361330160 :

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

Experimentele ondersteuning voor multi-draw indirect

Met de indirecte GPU-functie met meerdere draws kunt u meerdere draw-aanroepen uitvoeren met één GPU-opdracht. Dit is met name handig in situaties waarin een groot aantal objecten moet worden gerenderd, zoals deeltjessystemen, instancing en grote scènes. De GPURenderPassEncoder-methoden drawIndirect() en drawIndexedIndirect() kunnen slechts één draw-aanroep tegelijk uitvoeren vanuit een bepaald gebied van een GPU-buffer.

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

Met de niet-standaard GPU-functie "chromium-experimental-multi-draw-indirect" beschikbaar is in een GPUAdapter, kunt u een GPUDevice met deze functie aanvragen. Maak vervolgens een GPUBuffer met het GPUBufferUsage.INDIRECT -gebruik om de draw-aanroepen op te slaan. U kunt dit later gebruiken in de nieuwe GPURenderPassEncoder-methoden multiDrawIndirect() en multiDrawIndexedIndirect() om draw-aanroepen binnen een renderpass uit te voeren. Zie het volgende fragment 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 Booleaanse strictMath ontwikkelaarsoptie toegevoegd aan GPUShaderModuleDescriptor waarmee u strict math 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 deze functie alleen bedoeld is voor gebruik tijdens de ontwikkeling. Zie probleem 42241455 .

Deze optie wordt momenteel ondersteund op Metal en Direct3D. Wanneer strict math is uitgeschakeld, kan de compiler uw shaders optimaliseren door:

  • De mogelijkheid van NaN- en Infinity-waarden wordt buiten beschouwing gelaten.
  • -0 behandelen als +0.
  • Vervang deling door snellere vermenigvuldiging 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 });

GPUAdapter requestAdapterInfo() verwijderen

De asynchrone methode GPUAdapter requestAdapterInfo() is overbodig, omdat u GPUAdapterInfo al synchroon kunt ophalen met behulp van het attribuut GPUAdapter info . Daarom is de niet-standaard GPUAdapter requestAdapterInfo() methode nu verwijderd. Zie de intentie om te verwijderen .

Dawn-updates

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

Dit behandelt slechts enkele van de belangrijkste hoogtepunten. Bekijk de volledige lijst met commits .

Wat is er nieuw in WebGPU

Een lijst met alles wat in de serie Wat is er nieuw in WebGPU is behandeld.

Chroom 138

Chroom 137

Chroom 136

Chroom 135

Chroom 134

Chroom 133

Chroom 132

Chroom 131

Chroom 130

Chroom 129

Chroom 128

Chroom 127

Chroom 126

Chroom 125

Chroom 124

Chroom 123

Chroom 122

Chroom 121

Chroom 120

Chroom 119

Chroom 118

Chroom 117

Chroom 116

Chroom 115

Chroom 114

Chroom 113