Co nowego w WebGPU (Chrome 116)

François Beaufort
François Beaufort

Integracja WebCodecs

WebGPU udostępnia interfejs API do tworzenia nieprzezroczystych obiektów „tekstury zewnętrznej” z HTMLVideoElement do importExternalTexture(). Możesz używać tych obiektów do wydajnego próbkowania klatek wideo, potencjalnie bez kopiowania bezpośrednio z danych źródłowego modelu kolorów YUV.

Początkowa specyfikacja WebGPU nie zezwalała jednak na tworzenie obiektów GPUExternalTexture z obiektów WebCodecs VideoFrame. Ta funkcja jest ważna w przypadku zaawansowanych aplikacji do przetwarzania wideo, które już korzystają z WebCodecs i chcą zintegrować WebGPU z potokiem przetwarzania wideo. Integracja WebCodecs dodaje obsługę używania obiektu VideoFrame jako źródła wywołania GPUExternalTexturecopyExternalImageToTexture(). Zobacz poniższy przykład i wpis na stronie chromestatus.

// Access the GPU device.
const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();

// Create VideoFrame from HTMLVideoElement.
const video = document.querySelector("video");
const videoFrame = new VideoFrame(video);

// Create texture from VideoFrame.
const texture = device.importExternalTexture({ source: videoFrame });
// TODO: Use texture in bind group creation.

Aby wypróbować tę funkcję, zapoznaj się z eksperymentalnym przykładem przesyłania filmów za pomocą WebCodecs.

Utracone urządzenie zwrócone przez GPUAdapter.requestDevice()

Jeśli metoda requestDevice() na GPUAdapter nie powiedzie się, ponieważ została już użyta do utworzenia GPUDevice, teraz zwraca GPUDevice natychmiast oznaczony jako utracony, zamiast zwracać obietnicę, która odrzuca null. Zobacz issue chromium:1234617.

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

// New! The promise is not rejected anymore with null.
const device2 = await adapter.requestDevice();
// And the device is immediately marked as lost.
const info = await device2.lost;

Zapewnienie płynnego odtwarzania wideo w przypadku wywołania funkcji importExternalTexture()

Gdy funkcja importExternalTexture() jest wywoływana z parametrem HTMLVideoElement, powiązane odtwarzanie wideo nie jest już ograniczane, gdy film nie jest widoczny w obszarze wyświetlania. Więcej informacji znajdziesz w tym zgłoszeniu.

Zgodność ze specyfikacją

Argument message w konstruktorze GPUPipelineError() jest opcjonalny. Zobacz change chromium:4613967.

Podczas wywoływania funkcji createShaderModule() zgłaszany jest błąd, jeśli źródło WGSL code zawiera \0. Więcej informacji znajdziesz w issue dawn:1345.

Domyślny maksymalny poziom szczegółowości (lodMaxClamp) używany podczas próbkowania tekstury za pomocą createSampler() wynosi 32. Więcej informacji znajdziesz w change chromium:4608063.

Ulepszanie środowiska programistycznego

W konsoli JavaScript w Narzędziach deweloperskich wyświetla się komunikat przypominający deweloperom, że używają WebGPU na nieobsługiwanej platformie. Zobacz change chromium:4589369.

Komunikaty o błędach weryfikacji bufora są natychmiast wyświetlane w konsoli JavaScript w Narzędziach deweloperskich, gdy funkcja getMappedRange() zawiedzie, bez konieczności wysyłania przez deweloperów poleceń do kolejki. Zobacz change chromium:4597950.

Zrzut ekranu konsoli JavaScriptu w Narzędziach deweloperskich z komunikatem o błędzie weryfikacji bufora.
Komunikat o błędzie weryfikacji bufora w konsoli JavaScript Narzędzi deweloperskich.

Aktualizacje Dawn

Przełącznik debugowania disallow_unsafe_apis został zmieniony na allow_unsafe_apis i domyślnie jest wyłączony. Ten przełącznik pomija błędy weryfikacji w punktach wejścia interfejsu API lub kombinacjach parametrów, które nie są jeszcze uznawane za bezpieczne. Może to być przydatne podczas debugowania. Zobacz problem dawn:1685.

Wycofany atrybut wgpu::ShaderModuleWGSLDescriptor source został usunięty na rzecz atrybutu code. Zobacz change dawn:130321.

Brakująca metoda wgpu::RenderBundle::SetLabel() została zaimplementowana. Zobacz change dawn:134502.

Aplikacje mogą prosić o konkretny backend podczas pobierania adaptera za pomocą opcji wgpu::RequestAdapterOptionsBackendType. Przykład znajdziesz poniżej i w issue dawn:1875.

wgpu::RequestAdapterOptionsBackendType backendTypeOptions = {};
backendTypeOptions.backendType = wgpu::BackendType::D3D12;

wgpu::RequestAdapterOptions options = {};
options.nextInChain = &backendTypeOptions;

// Request D3D12 adapter.
myInstance.RequestAdapter(&options, myCallback, myUserData);

Dodano nową metodę SwapChain::GetCurrentTexture() z dodatkowymi zastosowaniami tekstur łańcucha wymiany, dzięki czemu zwracany obiekt wgpu::Texture może być używany w kopiach. Przykład znajdziesz poniżej i w zgłoszeniu dawn:1551.

wgpu::SwapChain swapchain = myDevice.CreateSwapChain(mySurface, &myDesc);
swapchain.GetCurrentTexture();
swapchain.Present();

To tylko niektóre z najważniejszych zmian. Pełną listę zmian znajdziesz w repozytorium.

Nowości w WebGPU

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

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