Nieuw in WebGPU (Chrome 119)

François Beaufort
François Beaufort

Filterbare 32-bits float-texturen

32-bits zwevende-komma-texturen worden gebruikt om zeer nauwkeurige gegevens op te slaan, zoals HDR-afbeeldingen en dieptekaarten. Ze zijn vooral belangrijk voor GPU's die worden gebruikt in hoogwaardige gaming- en professionele toepassingen.

Ondersteuning voor filterbare 32-bits zwevende-kommatexturen beschrijft de mogelijkheid van een GPU om 32-bits zwevende-kommatexturen te filteren. Dit betekent dat de GPU de randen van floatingpoint-texturen kan afvlakken, waardoor ze minder gekarteld lijken. Deze is vergelijkbaar met de extensie OES_texture_float_linear in WebGL.

Niet alle GPU's ondersteunen filterbare 32-bits float-texturen. Als de functie "float32-filterable" beschikbaar is in een GPUAdapter, kun je nu een GPUDevice aanvragen met deze functie en texturen filteren met de indelingen r32float, rg32float en rgba32float. Bekijk het volgende voorbeeld en probleem dawn:1664.

const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has("float32-filterable")) {
  throw new Error("Filterable 32-bit float textures support is not available");
}
// Explicitly request filterable 32-bit float textures support.
const device = await adapter.requestDevice({
  requiredFeatures: ["float32-filterable"],
});

// Create a sampler with linear filtering.
const sampler = device.createSampler({
  magFilter: "linear",
});

// Create a texture with rgba32float format.
const texture = device.createTexture({
  size: [100, 100],
  format: "rgba32float",
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.TEXTURE_BINDING,
});

// Write data to texture, create a bindgroup with sampler and texture and
// send the appropriate commands to the GPU....

Knooppuntindeling unorm10-10-10-2

Er is een nieuwe hoekpuntindeling met de naam 'unorm10-10-10-2', ook wel 'rgb10a2' genoemd, toegevoegd aan de WebGPU-specificatie. Deze bestaat uit één verpakte 32-bits waarde met 4 genormaliseerde niet-ondertekende gehele getallen, gerangschikt als 10 bits, 10 bits, 10 bits en 2 bits. Bekijk het volgende voorbeeld en probleem dawn:2044.

// Define the layout of vertex attribute data with unorm10-10-10-2 format.
const buffers = [
  {
    arrayStride: 0,
    attributes: [
      { format: "unorm10-10-10-2", offset: 0, shaderLocation: 0 },
    ],
  },
];

// Describe the vertex shader entry point and its input buffer layouts.
const vertex = {
  module: myVertexShaderModule,
  entryPoint: "main",
  buffers,
};

// Pass vertex to device.createRenderPipeline() and
// use vec4<f32> type in WGSL shader code to manipulate data.

Textuurindeling rgb10a2uint

Er is een nieuw textuurformaat met de naam rgb10a2uint toegevoegd aan de WebGPU-specificatie. Het bestaat uit een 32-bits verpakt pixelformaat met 4 componenten voor niet-ondertekende gehele getallen: 10-bits rood, 10-bits groen, 10-bits blauw en 2-bits alfa. Bekijk het volgende voorbeeld en issue dawn:1936.

// Create a texture with rgb10a2uint format.
const texture = device.createTexture({
  size: [100, 100],
  format: "rgb10a2uint",
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.TEXTURE_BINDING,
});

// Write data to texture, create a bindgroup with texture and
// send the appropriate commands to the GPU....

Updates voor Dawn

Met tijdstempelquery's kunnen WebGPU-apps precies (tot op de nanoseconde) meten hoelang het duurt om hun GPU-opdrachten uit te voeren. De API-vorm om query's voor tijdstempels aan het begin en einde van passen vast te leggen, is geüpdatet zodat deze overeenkomt met de WebGPU-specificatie. Bekijk het volgende voorbeeld en issue dawn:1800.

// Create a timestamp query set that will store the timestamp values.
wgpu::QuerySetDescriptor querySetDescriptor = {
    .count = 2,
    .type = wgpu::QueryType::Timestamp};
wgpu::QuerySet querySet = device.CreateQuerySet(&querySetDescriptor);

wgpu::RenderPassTimestampWrites timestampWrites = {
    .querySet = querySet,
    .beginningOfPassWriteIndex = 0,
    .endOfPassWriteIndex = 1};
wgpu::ComputePassDescriptor pass{.timestampWrites = &timestampWrites};

// Write the queue timestamp into beginningOfPassWriteIndex and
// endOfPassWriteIndex of myQuerySet respectively before and after the pass
// commands execute.
myEncoder.BeginComputePass(&pass);

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

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