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 externalTexture

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

Upraszcza to logikę shadera w potokach 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 to również potrzebę dynamicznego kompilowania shaderów w zależności od źródła tekstury. Zobacz Intent to Ship: WebGPU: GPUTextureView for externalTexture binding (w języku angielskim).

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(), aby uprościć kopiowanie całych buforów. Zobacz Intent to Ship: WebGPU: copyBufferToBuffer overload (w języku angielskim).

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 z użyciem wskaźnika do typu atomic

Dla wygody deweloperów dodaliśmy nowy operator workgroupUniformLoad(ptr) w WGSL. Atomowo wczytuje wartość wskazywaną przez ptr i zwraca ją do wszystkich wywołań w grupie roboczej, gdzie ptr jest wskaźnikiem do zmiennej atomowej 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 interfejsu GPUAdapterInfo

Niestandardowy atrybut ciągu znaków powerPreference GPUAdapterInfo jest teraz dostępny, gdy użytkownik włączy flagę „Funkcje deweloperskie WebGPU” na stronie chrome://flags/#enable-webgpu-developer-features. Jeśli jest obsługiwana, wartość powerPreference może wynosić "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 GPURequestAdapterOptions compatibilityMode

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

Aktualizacje o świcie

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

Emdawnwebgpu to (utrzymywana) wersja rozwidlona wbudowanych (obecnie nieutrzymywanych) powiązań Emscripten (USE_WEBGPU). Wszystkie nowe funkcje są opracowywane w ramach emdawnwebgpu, a wbudowane powiązania Emscripten zostaną usunięte, gdy deweloperzy przejdą na emdawnwebgpu. Nagłówek C biblioteki Emdawnwebgpu jest bardzo podobny do nagłówka biblioteki Dawn, natomiast wbudowane powiązania są znacznie przestarzałe.

Pobierz emdawnwebgpu ze strony wydań Dawn w GitHubie i zapoznaj się z plikiem 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 z najważniejszych informacji. Zapoznaj się z pełną listą zatwierdzeń.

Nowości w WebGPU

Lista wszystkich tematów omówionych w serii Co nowego w WebGPU.

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