Nowości w WebGPU (Chrome 153–154)

François Beaufort
François Beaufort

Opublikowano: 15 września 2026 r.

Rozszerzenie WGSL buffer_view

Rozszerzenie języka WGSL buffer_view umożliwia interpretowanie danych zmiennej jednolitej, pamięci lub grupy roboczej jako wielu różnych typów. Ma to szerokie zastosowanie, od konwencjonalnych zastosowań związanych z grą słów opartą na typach po dzielenie zmiennej na wiele zmiennych logicznych.

Ze względów bezpieczeństwa i ułatwienia implementacji do reinterpretowanych typów można uzyskać dostęp tylko za pomocą tych wbudowanych funkcji:

  • bufferView<T>() interpretuje pamięć przy określonym przesunięciu bajtowym jako wskaźnik typu T.
  • bufferArrayView<T>() tworzy wskaźnik ograniczonej tablicy z określoną liczbą elementów.
  • bufferLength() zwraca rozmiar bufora w bajtach.

To rozszerzenie języka można wykryć w JavaScript za pomocą funkcji navigator.gpu.wgslLanguageFeatures. Zalecamy użycie dyrektywy requires, aby zasygnalizować potencjalną nieprzenośność za pomocą requires buffer_view u góry kodu shadera WGSL. Zapoznaj się z tym przykładem w WGSL i planem wdrożenia.

requires buffer_view;

//  +-------------------+-----------------------------+----------------------------+
//  | Byte 0 .. 3       | Byte 4 .. (4 + N - 1)       | Byte (4 + N) .. End        |
//  +-------------------+-----------------------------+----------------------------+
//  | indices_size (u32)| indices (array<u32, count>) | vertices (array<f32>)      |
//  +-------------------+-----------------------------+----------------------------+
@group(0) @binding(0) var<storage> indices_and_vertices : buffer;

fn unpack_and_process_geometry() {
  let indices_size = *bufferView<u32>(&indices_and_vertices, 0);

  let indices = bufferArrayView<array<u32>>(&indices_and_vertices, 4, indices_size);
  let vertices = bufferView<array<f32>>(&indices_and_vertices, indices_size + 4);
  ...
}

Więcej informacji znajdziesz w propozycji widoku bufora, a także możesz wypróbować przykładowy szkielet WebGPU.

Rozszerzenie WGSL swizzle_assignment

W odpowiedzi na jedną z najbardziej pożądanych funkcji społecznościowych rozszerzenie WGSL swizzle_assignment umożliwia bezpośrednie zapisywanie w mieszankach wektorowych, co pozwala aktualizować wiele komponentów w jednej instrukcji. Znacznie zmniejsza to ilość kodu standardowego i poprawia czytelność cieniowania, a także dostosowuje WGSL do innych języków cieniowania.

To rozszerzenie języka można wykryć w JavaScript za pomocą funkcji navigator.gpu.wgslLanguageFeatures. Zalecamy użycie dyrektywy requires, aby zasygnalizować potencjalną nieprzenośność za pomocą requires swizzle_assignment u góry kodu shadera WGSL. Zapoznaj się z tym przykładem w WGSL i planem wdrożenia.

if (!navigator.gpu.wgslLanguageFeatures.has("swizzle_assignment")) {
  throw new Error(`WGSL swizzle assignment is not available`);
}

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

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

  @vertex
  fn main(@builtin(vertex_index) vertex_index: u32) -> @builtin(position) vec4f {
    var position = vec4f(0.0, 0.0, 0.0, 1.0);
    position.xy = vec2f(10.0, 20.0); // Swizzle assignment

    return position;
  }`,
});

Aktualizacje rozszerzeń WGSL

Rozszerzenie języka texture-formats-tier1, choć obsługiwane w kodzie WGSL, nie było wcześniej prawidłowo mapowane na navigator.gpu.wgslLanguageFeatures (jako texture_formats_tier1) w JavaScript. Problem z mapowaniem został już rozwiązany. Zobacz Chromium CL 8159562.

Rozszerzenie języka subgroups jest teraz automatycznie włączane, gdy w WGSL włączone jest rozszerzenie subgroup_size_control. Zobacz problem dawn:545285663.

Aktualizacje Dawn

Nowa wgpu::FeatureName::BufferMapWriteExtendedUsageseksperymentalna funkcja umożliwia tworzenie bufora z wgpu::BufferUsage::MapWrite w połączeniu z dowolnym innym wgpu::BufferUsage, z wyjątkiem wgpu::BufferUsage::MapRead, aby zapisywać dane bezpośrednio w buforze z możliwością mapowania, który jest też użyteczny dla procesora graficznego. Eliminuje to bufor tymczasowy i dodatkową kopię w przypadku backendów Vulkan i D3D12. Więcej informacji znajdziesz w sekcji Buffer Map Write Extended Usages i w zgłoszeniu dawn:386255678.

Możesz teraz używać powiązań webgpu_cpp.h w dowolnej implementacji webgpu.h zamiast być związanym z wersją Dawn, korzystając z nowego webgpu_upstream_cpp_headers. Zobacz problem #596 w repozytorium webgpu-headers.

Dawn wymaga teraz systemu macOS 13.0 lub nowszego. Zobacz Dawn CL 334415.

Obejmuje to tylko niektóre z najważniejszych informacji. Więcej informacji znajdziesz na wyczerpującej liście zatwierdzeń.

Nowości w WebGPU

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

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