Nowości w WebGPU (Chrome 137)

François Beaufort
François Beaufort

Opublikowano: 26 maja 2025 r.

Używanie widoku tekstury do powiązania externalTexture

Podczas tworzenia GPUBindGroup można teraz używać zgodnego elementu GPUTextureView (2D, pojedynczy podzasób) zamiast powiązania GPUExternalTexture.

Upraszcza to logikę cieniowania w potokach efektów wideo, w których trzeba obsługiwać zarówno GPUExternalTexture (w przypadku źródłowego wideo), jak i GPUTextureView (w przypadku przetwarzania pośredniego). Zmniejsza to też potrzebę dynamicznego kompilowania cieniowania w zależności od tego, skąd pochodzi tekstura. Zobacz Intent to Ship: WebGPU: GPUTextureView for externalTexture binding.

const texture = myDevice.createTexture({
  size: [42, 42],
  format: navigator.gpu.getPreferredCanvasFormat(),
  usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
});

const code = `
@group(0) @binding(0) var texture : texture_external;
@group(0) @binding(1) var<storage, read_write> buffer: vec2u;
    
@compute @workgroup_size(1) fn main() {
  buffer = textureDimensions(texture);
}`;

const pipeline = myDevice.createComputePipeline({
  layout: "auto",
  compute: { module: myDevice.createShaderModule({ code }) },
});

const bindGroup = myDevice.createBindGroup({
  layout: pipeline.getBindGroupLayout(0),
  entries: [
    { binding: 0, resource: texture.createView() }, // Use texture view for an externalTexture binding
    { binding: 1, resource: { buffer: myBuffer } },
  ],
});

Kopiowanie buforów bez określania przesunięć i rozmiaru

Nowe przeciążenie metody GPUCommandEncoder umożliwia deweloperom pomijanie parametrów przesunięcia i rozmiaru podczas korzystania z copyBufferToBuffer() w celu uproszczenia kopiowania całych buforów. Zobacz Intent to Ship: WebGPU: copyBufferToBuffer overload.

const size = 42;
const srcBuffer = myDevice.createBuffer({
  size,
  usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC,
});
const dstBuffer = myDevice.createBuffer({
  size,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ,
});

// Copy entire buffer.
myCommandEncoder.copyBufferToBuffer(srcBuffer, dstBuffer);

// This is the same as the following.
// myCommandEncoder.copyBufferToBuffer(srcBuffer, 0, dstBuffer, 0, size);

WGSL workgroupUniformLoad używający wskaźnika do atomowego

Dla wygody deweloperów dodaliśmy w WGSL nowe przeciążenie workgroupUniformLoad(ptr). Atomowo wczytuje ono wartość wskazywaną przez ptr i zwraca ją do wszystkich wywołań w grupie roboczej, gdzie ptr jest wskaźnikiem do atomowego wewnątrz zmiennej grupy roboczej. Zobacz problem 408241039.

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

var<workgroup> wgvar : atomic<u32>;

@compute @workgroup_size(1, 1)
fn main(@builtin(local_invocation_index) lid: u32) {
  if (lid == 0) {
    atomicStore(&(wgvar), 42u);
  }
  buffer[lid] = workgroupUniformLoad(&wgvar);
}

Atrybut powerPreference GPUAdapterInfo

Niestandardowy atrybut ciągu znaków powerPreference GPUAdapterInfo jest teraz dostępny, gdy użytkownik włączy flagę „WebGPU Developer Features” (Funkcje deweloperskie WebGPU) w chrome://flags/#enable-webgpu-developer-features. Jeśli jest obsługiwany, wartość powerPreference może być równa "low-power" lub "high-performance" w zależności od wartości GPUPowerPreference użytej w GPURequestAdapterOptions. Zobacz CL 6438860.

function checkPowerPreferenceForGpuDevice(device) {
  const powerPreference = device.adapterInfo.powerPreference;
  if (powerPreference === "high-performance") {
    // High-performance GPU detected. Enabling enhanced graphics settings.
  } else if (powerPreference === "low-power") {
    // Low-power GPU detected. Optimizing for battery life.
  }
}

Usuwanie atrybutu compatibilityMode GPURequestAdapterOptions

Eksperymentalny atrybut GPURequestAdapterOptions compatibilityMode został usunięty na rzecz standardowego atrybutu featureLevel dodanego w Chrome 133. Zobacz problem 366151404.

Aktualizacje Dawn

Deweloperzy mogą tworzyć projekty WebGPU w językach takich jak C++, używając webgpu.h do kierowania na WebAssembly i określone platformy. Nowo wydana biblioteka „emdawnwebgpu” („Emscripten Dawn WebGPU”) implementuje najnowszy standardowy plik webgpu.h za pomocą interfejsu API przeglądarki.

Emdawnwebgpu to (utrzymywane) rozwidlenie wtyczki Emscripten (obecnie nieutrzymywanej) z wbudowanymi powiązaniami (USE_WEBGPU). Wszystkie nowe prace są wykonywane w emdawnwebgpu, a wbudowane powiązania Emscripten zostaną usunięte, gdy deweloperzy przejdą na emdawnwebgpu. Nagłówek C emdawnwebgpu jest bardzo podobny do nagłówka Dawn, natomiast wbudowane powiązania są znacznie przestarzałe.

Pobierz emdawnwebgpu ze strony wydań Dawn's GitHub i przeczytaj plik README.md pakietu, aby dowiedzieć się, jak go używać. Pliki źródłowe znajdziesz w repozytorium Dawn.

Pełny przewodnik znajdziesz w zaktualizowanej dokumentacji Tworzenie aplikacji za pomocą WebGPU.

Obejmuje to tylko niektóre najważniejsze informacje. Zapoznaj się z pełną listą commitów.

Nowości w WebGPU

Lista wszystkich tematów omówionych w serii Nowości w WebGPU.

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