Nowości w WebGPU (Chrome 137)

François Beaufort
François Beaufort

Data publikacji: 26 maja 2025 r.

Używanie widoku tekstury do powiązania zewnętrznej tekstury

Podczas tworzenia GPUBindGroup można teraz używać zgodnego widoku GPUTexture (2D, pojedynczy zasób podrzędny) zamiast powiązania GPUExternalTexture.

Upraszcza to logikę shadera w pipeline’ach efektów wideo, w których trzeba obsługiwać zarówno GPUExternalTexture (dla filmu źródłowego), jak i GPUTextureView (dla przetwarzania pośredniego). Zmniejsza też potrzebę dynamicznego kompilowania shaderów w zależności od źródła tekstury. Zobacz Intend to Ship: WebGPU: GPUTextureView for externalTexture binding (Intend to Ship: WebGPU: GPUTextureView do wiązania zewnętrznego tekstu).

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;

Nowa metoda nakładania GPUCommandEncoder pozwala deweloperom pomijać przesunięcia i parametry rozmiaru podczas używania funkcji copyBufferToBuffer() w celu uproszczenia kopiowania całych buforów. Zobacz Intencja wydania: WebGPU: przeciążenie copyBufferToBuffer.

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 za pomocą wskaźnika do atomic

Dla wygody deweloperów do WGSL dodano nową przeciążenie workgroupUniformLoad(ptr). Zasób ten wczytuje wartość wskazywaną przez ptr i zwraca ją we wszystkich wywołaniach w grupie roboczej, gdzie ptr jest wskaźnikiem do zmiennej w grupie 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 atrybutu GPUAdapterInfo

Niestandardowy atrybut ciągu znaków powerPreference GPUAdapterInfo jest teraz dostępny, gdy użytkownik włączy flagę „WebGPU Developer Features” w sekcji chrome://flags/#enable-webgpu-developer-features. Jeśli jest obsługiwana, 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 z elementu GPURequestAdapterOptions

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

Aktualizacje świtu

Deweloperzy mogą tworzyć projekty WebGPU w językach takich jak C++, używając pliku webgpu.h, aby kierować je na WebAssembly i konkretne platformy. Nowo opublikowana biblioteka „emdawnwebgpu” („Emscripten Dawn WebGPU”) implementuje najnowszą standardową bibliotekę webgpu.h za pomocą interfejsu API przeglądarki.

Emdawnwebgpu to (utrzymywana) gałąź wbudowanych bindigów Emscripten (obecnie nieutrzymywanych) (USE_WEBGPU). Wszystkie nowe prace programistyczne są wykonywane w emdawnwebgpu, a wbudowane bindigi Emscripten zostaną usunięte, gdy deweloperzy przejdą na emdawnwebgpu. Nagłówek C w Emdawnwebgpu jest bardzo podobny do tego w Dawn, natomiast wbudowane powiązania są znacznie przestarzałe.

Pobierz emdawnwebgpu ze strony z wersjami GitHuba Dawna i przeczytaj README.md pakietu, aby dowiedzieć się, jak go używać. Pliki źródłowe znajdziesz w starym repozytorium.

Pełny przewodnik znajdziesz w zaktualizowanej dokumentacji Tworzenie aplikacji z WebGPU.

Dotyczy to tylko niektórych kluczowych informacji. Zapoznaj się z pełną listą commitów.

Co nowego w WebGPU

Lista wszystkich tematów omawianych w cyklu Co nowego w WebGPU.

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