Co nowego w WebGPU (Chrome 115)

François Beaufort
François Beaufort

Obsługiwane rozszerzenia języka WGSL

Element wgslLanguageFeatures obiektu GPU zawiera listę nazw obsługiwanych rozszerzeń języka WGSL. Obsługiwane rozszerzenia języka WGSL są włączane automatycznie, więc nie musisz o nie prosić. Ta lista jest obecnie pusta, ale w przyszłości będzie zawierać wiele pozycji (np. do-while loops). Zobacz issue dawn: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 WebGPU w Direct3D 11. Możesz teraz przetestować tę funkcję lokalnie, uruchamiając Chrome w systemie Windows z flagami wiersza poleceń --enable-unsafe-webgpu --use-webgpu-adapter=d3d11. Zobacz problem dawn:1705.

Domyślne używanie dyskretnego procesora graficznego po podłączeniu do zasilania sieciowego

Na urządzeniach z macOS z dwoma procesorami GPU, jeśli funkcja requestAdapter() zostanie wywołana bez opcji powerPreference, zwracany jest dyskretny procesor GPU, gdy urządzenie użytkownika jest zasilane z gniazdka. W przeciwnym razie zwracany jest zintegrowany procesor graficzny. Zobacz zmianę 4499307.

Ulepszanie środowiska programistycznego

Nowe ostrzeżenia w Narzędziach deweloperskich

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

Ostrzeżenie jest też wyświetlane, jeśli w przypadku GPUBlendComponent występują zarówno członkowie z wyraźną zgodą, jak i członkowie domyślni. Zobacz problem dawn:1785.

Wysyłanie i wyświetlanie reklam o zerowej wielkości jest prawidłowe, ale ostrzeżenie zachęca deweloperów do unikania takich sytuacji, gdy jest to możliwe. Zobacz problem dawn:1786.

Ulepszone komunikaty o błędach

Gdy używasz GPUCommandEncoder, a funkcja finish() została już wywołana, wyświetla się teraz ulepszony komunikat o błędzie. Zobacz problem dawn:1736.

Podczas przesyłania buforów poleceń ze zniszczonymi obiektami etykiety buforów poleceń użytych w funkcji submit() są teraz widoczne w komunikacie o błędzie. Zobacz problem dawn:1747.

Nieprawidłowa część stanu bufora głębi i szablonu jest teraz określana w komunikacie o błędzie podczas weryfikacji depthStencil. Zobacz issue dawn:1735.

Komunikat o błędzie weryfikacji minBindingSize zawiera teraz grupę i numer powiązania, które nie przeszło weryfikacji, a także bufor. Zobacz problem dawn:1604.

Ulepszyliśmy komunikaty o błędach zwracane przez metodę mapAsync() w obiekcie GPUBuffer, aby ułatwić deweloperom debugowanie. Zobacz przykład poniżej i zgłoś problem 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 w systemie macOS

Przełącznik debugowania use_user_defined_labels_in_backend umożliwia przekazywanie etykiet obiektów do backendu, aby można było je zobaczyć w narzędziach do debugowania specyficznych dla platformy, takich jak RenderDoc, PIX czy Instruments. Od teraz po włączeniu debugowania w systemie macOS możesz korzystać z lepszych funkcji debugowania. Zobacz issue dawn:1784

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

Rejestrowanie HLSL w przypadku nieudanej kompilacji

Przełącznik debugowania dump_shaders umożliwia rejestrowanie wejściowych shaderów WGSL i przetłumaczonych shaderów backendu. Od teraz, gdy włączysz debugowanie, w przypadku niepowodzenia kompilacji HLSL zostanie zrzucany. Zobacz problem dawn:1681

Aktualizacje o świcie

Usuwanie bufora wierzchołków

Przekazanie wartości nullptr zamiast wgpu::Buffer do SetVertexBuffer() w przypadku wgpu::RenderPassEncoder lub wgpu::RenderBundleEncoder umożliwia usunięcie wcześniej ustawionego bufora wierzchołków w danym slocie. Zobacz problem dawn:1675.

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

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

Przyłącza przejściowe

Możesz tworzyć załączniki, które pozwalają operacjom renderowania pozostawać w pamięci kafelków, co pozwala uniknąć ruchu w pamięci VRAM i potencjalnie uniknąć przydzielania pamięci VRAM na tekstury przez ustawienie wgpu::TextureUsage::TransientAttachment usage. Ta funkcja jest obsługiwana tylko w przypadku interfejsów Metal i Vulkan. Zobacz issue dawn: 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.

Budynek bez depot_tools

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

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