Nieuw in WebGPU (Chrome 155-156)

WGSL fragment_depth-extensie

In render-passes met veel geometrie zijn early-Z-optimalisaties de beste vriend van ontwikkelaars. Ze zorgen voor een enorme prestatieboost door de GPU verborgen pixels te laten weggooien voordat dure fragment-shaders worden uitgevoerd. Als een gerasterde diepte de dieptetest niet doorstaat, slaat de GPU de fragment-shader helemaal over, op voorwaarde dat de shader geen andere bijwerkingen heeft.

Als je wilt weten hoe hardware hiermee omgaat, heeft MJP een uitstekend artikel geschreven over When Does Early-Z Have to be Disabled?.

Hoewel aangepaste dieptemanipulatie nuttig is, brengt het gebruik ervan in je fragment-shader een verborgen belasting met zich mee. Als je naar @builtin(frag_depth) schrijft in een fragment-shader, dwing je stuurprogramma's meestal om deze vroege Z-optimalisaties uit te zetten voor de hele tekenaanroep. Dit gebeurt omdat heuristieken van stuurprogramma's niet kunnen garanderen dat de berekende uitvoerdiepte van de shader overeenkomt met de diepte die is geïnterpoleerd door de rasterizer.

Om deze prestatiebeperking op te lossen, kun je met de WGSL-extensie fragment_depth een less- of greater-dieptemodusnaam opgeven op @builtin(frag_depth) om expliciet aan te geven hoe de geschreven diepte zich verhoudt tot de geïnterpoleerde diepte. Zo kan de GPU veilig vroege Z-optimalisaties toepassen.

Deze taalextensie kan worden gedetecteerd in JavaScript met navigator.gpu.wgslLanguageFeatures. We raden je aan een requires-instructie te gebruiken om de mogelijkheid van niet-overdraagbaarheid aan te geven met requires fragment_depth; bovenaan je WGSL-shadercode. Bekijk het volgende voorbeeld en de intentie om te verzenden.

if (!navigator.gpu.wgslLanguageFeatures.has("fragment_depth")) {
  throw new Error(`WGSL fragment depth is not available`);
}

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

const shaderModule = device.createShaderModule({ code: `
  requires fragment_depth;

  @fragment
  fn main() -> @builtin(frag_depth, less) f32 {
    // Explicitly states that the output fragment depth is less than early-Z depth,
    // allowing the GPU to safely preserve early-Z optimizations.
    return 0.0f;
  }`,
});

Textuurcompressie niet uitgelijnd

Met de GPU-functie texture-compression-unaligned kun je gecomprimeerde texturen maken met afmetingen die geen gehele veelvouden van de blokgrootte zijn (zoals 4x4 voor de indelingen BC, ETC2 en ASTC). Eerder vereiste WebGPU strikt dat textuurgrootten overeenkwamen met deze blokgrenzen. Omdat je texturen niet meer hoeft op te vullen of te schalen om ze aan te passen aan blokuitlijningen, behoudt deze functie de oorspronkelijke compressiegetrouwheid zonder schaalvervorming te introduceren. Bekijk de intentie tot verzending.

Het volgende codefragment controleert of de adapter niet-uitgelijnde textuurcompressie ondersteunt en vraagt, indien beschikbaar, een apparaat aan dat dit ondersteunt.

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

Met dank aan externe bijdrager Ignacio Castaño van spark.js voor het aansturen van deze functie, specificatie en CTS-werk.

srgb-linear en display-p3-linear kleurruimtes

Met de toevoeging van de vooraf gedefinieerde kleurruimtes srgb-linear en display-p3-linear kan de WebGPU-canvascontext nu rechtstreeks worden gerenderd in lineaire kleurruimtes met een uitgebreid bereik om schermen met een breed kleurengamma te ondersteunen. Deze kleurruimten behouden een lineaire relatie tussen pixelwaarden en fysieke luminantie. Daardoor zijn ze ideaal voor fysieke lichtrendering in games en ruimtelijke verwerkingstaken zoals anti-aliasing, interpolatie en decimering. Bekijk de intentie om te verzenden en het voorbeeld van Particles (HDR) PR #574.

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

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

context.configure({
  device,
  format: "rgba16float",
  colorSpace: "display-p3-linear",
});

Aanvullende snorm10-10-10-2-vertexindeling

De vertexindeling snorm10-10-10-2 is een verpakte 32-bits indeling met 4 genormaliseerde waarden met teken: 3 10-bits componenten (r, g, b) en 1 2-bits component (a). Met deze indeling kun je kenmerken, zoals 3D-normale vectoren met een extra 2-bits scalaire of uitlijningsvlag, efficiënt opslaan terwijl je geheugenbandbreedte bespaart. Ga naar spec PR 6491.

f16-ondersteuning op Linux voor NVIDIA

De optionele functie shader-f16, die ondersteuning biedt voor 16-bits zwevende-kommawaarden in WGSL, wordt nu ondersteund op Linux voor recente NVIDIA GPU-stuurprogramma's. Ga naar probleem chromium:42251215.

Updates voor Dawn

Je kunt nu de LUID van de onderliggende DXGIAdapter voor een bepaalde GPU-adapter opvragen met de structuur WGPUAdapterPropertiesD3D. Ga naar probleem chromium:562849566.

Dit zijn enkele van de belangrijkste hoogtepunten. Check de volledige lijst met commits.

Wat is er nieuw in WebGPU?

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

Chrome 155-156

Chrome 153-154

Chrome 151-152

Chrome 149-150

Chrome 147-148

Chrome 146

Chrome 145

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