Wat is er nieuw in WebGPU (Chrome 128)

François Beaufort
François Beaufort

Experimenteren met subgroepen

De subgroepenfunctie maakt parallellisme op SIMD-niveau mogelijk, waardoor threads binnen een groep kunnen communiceren en collectieve wiskundige bewerkingen kunnen uitvoeren (bijvoorbeeld het berekenen van de som van 16 getallen). Dit biedt een zeer efficiënte vorm van cross-thread datadeling.

Een minimale implementatie van het subgroepenvoorstel is beschikbaar voor lokaal testen achter de vlag "Unsafe WebGPU Support" op chrome://flags/#enable-unsafe-webgpu .

U kunt ook subgroepen op uw site uitproberen met echte gebruikers door u aan te melden voor de origin-proefperiode . Lees Aan de slag met origin-tests voor instructies over hoe u uw site kunt voorbereiden op het gebruik van origin-tests. De Origin-proefperiode loopt van Chrome 128 tot 131 (eindigt op 19 februari 2025). Zie Intentie om te experimenteren .

Wanneer de functie "subgroups" beschikbaar is in een GPUAdapter , vraagt ​​u een GPUDevice met deze functie aan om ondersteuning voor subgroepen te krijgen in WGSL en controleert u de minSubgroupSize en maxSubgroupSize limieten.

U moet deze extensie ook expliciet inschakelen in uw WGSL-code met enable subgroups; . Indien ingeschakeld, krijgt u toegang tot de volgende toevoegingen:

  • subgroup_invocation_id : een ingebouwde waarde voor de index van de thread binnen de subgroep.
  • subgroup_size : Een ingebouwde waarde voor toegang tot de subgroepgrootte.
  • subgroupBallot(value) : Retourneert een set bitvelden waarbij de bit die overeenkomt met subgroup_invocation_id 1 is als value waar is voor die actieve aanroep en anders 0.
  • subgroupBroadcast(value, id) : Zendt de value uit van de aanroep, waarbij subgroup_invocation_id overeenkomt met id voor alle aanroepen binnen de subgroep. Opmerking: id moet een constante tijdens het compileren zijn.

Meer ingebouwde functies zoals subgroupAdd , subgroupAll , subgroupElect en subgroupShuffle zullen in de toekomst worden toegevoegd. Zie uitgave 354738715 .

Om f16 in subgroepbewerkingen toe te staan, vraagt ​​u een GPUDevice aan met de functies "subgroups" , "subgroups-f16" en "shader-f16" , en schakelt u deze vervolgens in uw WGSL-code in met enable f16, subgroups, subgroups_f16; .

Het volgende codefragment biedt een basis om aan te sleutelen en het potentieel van subgroepen te ontdekken.

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

const shaderModule = device.createShaderModule({ code: `
  enable subgroups;

  var<workgroup> wgmem : u32;

  @group(0) @binding(0)
  var<storage, read> inputs : array<u32>;

  @group(0) @binding(1)
  var<storage, read_write> output : array<u32>;

  @compute @workgroup_size(64)
  fn main(@builtin(subgroup_size) subgroupSize : u32,
          @builtin(subgroup_invocation_id) id : u32,
          @builtin(local_invocation_index) lid : u32) {
    // One thread per workgroup writes the value to workgroup memory.
    if (lid == 0) {
      wgmem = inputs[lid];
    }
    workgroupBarrier();
    var v = 0u;

    // One thread per subgroup reads the value from workgroup memory
    // and shares that value with every other thread in the subgroup
    // to reduce local memory bandwidth.
    if (id == 0) {
      v = wgmem;
    }
    v = subgroupBroadcast(v, 0);
    output[lid] = v;
  }`,
});

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

Beëindig het instellen van diepteafwijking voor lijnen en punten

Een WebGPU-specificatiewijziging maakt het een validatiefout om depthBias , depthBiasSlopeScale en depthBiasClamp in te stellen op een waarde die niet nul is wanneer de topologie voor een renderpijplijn een lijn- of punttype is. Om ontwikkelaars voldoende tijd te geven om hun code bij te werken, wordt er in de DevTools Console een waarschuwing weergegeven over deze aanstaande validatie, terwijl de waarden in deze omstandigheden ook op 0 worden gedwongen. Zie uitgave 352567424 .

Niet-opgevangen fout verbergen DevTools-waarschuwing als preventieDefault

In de DevTools Console worden waarschuwingen voor uncapturederror -gebeurtenissen niet langer weergegeven als er een gebeurtenislistener voor uncapturederror is geregistreerd en de methode Event preventDefault() is aangeroepen binnen de callback van de gebeurtenislistener. Dit gedrag komt overeen met de afhandeling van gebeurtenissen in JavaScript. Zie het volgende voorbeeld en geef nummer 40263619 uit .

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

device.addEventListener("uncapturederror", (event) => {
  // Prevents browser warning to show up in the DevTools Console.
  event.preventDefault();

  // TODO: Handle event.error
});

WGSL interpoleert eerst de bemonstering en een van beide

Met het WGSL- interpolate kunt u door de gebruiker gedefinieerde IO-gegevensinterpolatie beheren. Nu interpoleren de nieuwe bemonsteringsparameters first (standaard) en either u extra controle: gebruikt first de waarde van het eerste hoekpunt van de primitief, terwijl either het eerste ofwel het laatste hoekpunt wordt toegestaan. Zie uitgave 340278447 .

Dawn-updates

De implementatie van Dawn's WGPUFuture voor het afhandelen van asynchrone bewerkingen is nu voltooid. Belangrijke concepten zijn onder meer wgpuInstanceProcessEvents voor opportunistische gebeurtenisverwerking en WGPUCallbackMode voor het definiëren van callback-locaties. WGPUFuture betekent eenmalige gebeurtenissen met een oneindige levensduur, en wgpuInstanceWaitAny wacht op de voltooiing van een toekomst of een time-out. Zie uitgave 42240932 .

De waarde CompositeAlphaMode::Auto wordt nu niet gerapporteerd door Surface::GetCapabilities() . Het is nog steeds geldig en gelijkwaardig aan Surface::GetCapabilities().alphaMode[0] . Zie nummer 292 .

De OpenGL-backend ondersteunt nu Surface met een y-flip-blit voor elke Present() -aanroep. Zie uitgave 344814083 .

De Adapter::GetProperties() methode is verouderd ten gunste van het gebruik van Adapter::GetInfo() .

Jaswant, een externe bijdrager, heeft alle CMake-bestanden herschreven, waardoor ze gemakkelijker kunnen worden bijgewerkt en pre-builds mogelijk zijn. Bekijk de snelstartgids voor het gebruik van Dawn in CMake-projecten.

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 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