Co nowego w WebGPU (Chrome 115)

François Beaufort
François Beaufort

Obsługiwane rozszerzenia języka WGSL

Element wgslLanguageFeatures obiektu GPU zawiera nazwy obsługiwanych rozszerzeń języka WGSL. Obsługiwane rozszerzenia języka WGSL są włączane automatycznie, więc nie musisz o nie prosić bezpośrednio. Ta lista jest obecnie pusta, ale w przyszłości możesz się spodziewać wielu nowych pozycji (np. do-while loops). Zobacz czas problemu:1777.

if (navigator.gpu.wgslLanguageFeatures?.has("unknown-feature")) {
  // Use unknown-feature in WGSL shader code.
}

Eksperymentalna obsługa Direct3D 11

Zespół Chromium pracuje nad dodaniem obsługi standardu WebGPU w przypadku Direct3D 11. Teraz możesz poeksperymentować lokalnie, uruchamiając Chrome w systemie Windows z flagami wiersza poleceń --enable-unsafe-webgpu --use-webgpu-adapter=d3d11. Zobacz świt problemu:1705.

Domyślnie korzystaj z dyskretnego GPU przy zasilaniu sieciowym

Na urządzeniach z systemem macOS z 2 procesorami graficznymi, jeśli funkcja requestAdapter() zostanie wywołana bez opcji powerPreference, dyskretny GPU jest zwracany, gdy urządzenie użytkownika jest podłączone do zasilania sieciowego. W przeciwnym razie zwracany jest zintegrowany GPU. Zobacz zmianę 4499307.

Poprawa wrażeń deweloperów

Nowe ostrzeżenia w Narzędziach deweloperskich

Jeśli klucz depth jest używany w interfejsie GPUExtend3DDict, w konsoli Narzędzi deweloperskich pojawi się ostrzeżenie, ponieważ prawidłowy klucz to depthOrArrayLayers. Zobacz issue chromium:1440900.

Ostrzeżenie zostanie też wysłane, jeśli GPUBlendComponent zawiera zarówno użytkowników jednoznacznych, jak i domyślnych. Zobacz świt problemu:1785.

Mimo że polecenia i losowania o zerowej wielkości są prawidłowe, deweloperzy starają się w miarę możliwości unikać takich sytuacji. Zobacz świt problemu:1786.

Lepsze komunikaty o błędach

Podczas korzystania z komunikacji GPUCommandEncoder wyświetlany jest teraz ulepszony komunikat o błędzie, jeśli usługa finish() została już wywołana. Zobacz świt problemu:1736.

W przypadku przesyłania buforów poleceń ze zniszczonymi obiektami ich etykiety użyte w submit() będą teraz widoczne w komunikacie o błędzie. Zobacz świt problemu:1747.

Nieprawidłowa część stanu szablonu głębokości jest teraz określana w komunikacie o błędzie podczas weryfikacji depthStencil. Zobacz świt problemu:1735.

Komunikat o błędzie weryfikacji minBindingSize zawiera teraz informacje o grupie i numerze powiązania, które nie przeszło weryfikacji, a także o buforze. Zobacz świt problemu:1604.

Komunikaty o błędach zwracane przez metodę mapAsync() w obiekcie GPUBuffer zostały ulepszone, aby ułatwić deweloperom debugowanie. Zobacz przykład poniżej i issue chromium:1431622.

// Create a GPU buffer and map it.
const descriptor = { size: 0, usage: GPUBufferUsage.MAP_READ };
const buffer = device.createBuffer(descriptor);
buffer.mapAsync(GPUMapMode.READ);

// Before it has been mapped, request another mapping.
try {
  await buffer.mapAsync(GPUMapMode.READ);
} catch (error) {
  // New! Error message tells you mapping is already pending.
  console.warn(error.message);
}

Etykiety w narzędziach do debugowania macOS

Przełącznik debugowania use_user_defined_labels_in_backend umożliwia przekazywanie etykiet obiektów do backendu, aby można je było zobaczyć w narzędziach do debugowania związanych z konkretną platformą, takich jak RenderDoc, PIX czy Instruments. Od teraz, jeśli włączysz debugowanie w systemie macOS, ułatwi Ci to debugowanie. Zobacz świt problemu:1784

Zrzut ekranu aplikacji Instruments na macOS z etykietami własnymi pochodzącymi z WebGPU.
Etykiety zdefiniowane przez użytkownika w aplikacji Instruments na urządzeniu z macOS.

Rejestruj HLSL, jeśli kompilacja się nie powiedzie

Przełącznik debugowania dump_shaders umożliwia rejestrowanie wejściowych programów do cieniowania WGSL i przetłumaczonych mechanizmów cieniowania backendu. Od tej pory, gdy włączysz debugowanie, kod HLSL zostanie zdjęty, jeśli kompilacja się nie powiedzie. Zobacz świt problemu:1681

Powiadomienia o świcie

Usuń ustawienie bufora wierzchołków

Przekazywanie wartości nullptr zamiast wgpu::Buffer do SetVertexBuffer() w wgpu::RenderPassEncoder lub wgpu::RenderBundleEncoder umożliwia anulowanie ustawienia wcześniej ustawionego bufora wierzchołków w danym przedziale. Zobacz świt problemu:1675.

// Set vertex buffer in slot 0.
myRenderPassEncoder.SetVertexBuffer(0, myVertexBuffer);

// Then later, unset vertex buffer in slot 0.
myRenderPassEncoder.SetVertexBuffer(0, nullptr);

Załączniki tymczasowe

Możesz tworzyć załączniki, które umożliwiają wykonywanie operacji renderowania w pamięci kafelków, co pozwoli uniknąć ruchu VRAM i potencjalnie uniknąć przydzielania VRAM dla tekstur przez ustawienie wykorzystania wgpu::TextureUsage::TransientAttachment. Ta funkcja jest obsługiwana tylko w przypadku metalu i interfejsu Vulkan. Zobacz świt problemu: 1695.

wgpu::TextureDescriptor desc;
desc.format = wgpu::TextureFormat::RGBA8Unorm;
desc.size = {1, 1, 1};
desc.usage = wgpu::TextureUsage::RenderAttachment |
             wgpu::TextureUsage::TransientAttachment;

auto transientTexture = device.CreateTexture(&desc);

// You can now create views from the texture to serve as transient
// attachments, e.g. as color attachments in a render pipeline.

Kompiluję bez: depot_tools

Nowa opcja CMake DAWN_FETCH_DEPENDENCIES umożliwia pobieranie zależności Dawn za pomocą skryptu Pythona, który odczytuje pliki DEPS, zamiast wymagać instalacji depot_tools we wszystkich zależnych od niego projektach. Zobacz zmianę 131750.

Co nowego w WebGPU

Lista wszystkich zagadnień omówionych w serii Co nowego w WebGPU.

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