Neu in WebGPU (Chrome 116)

François Beaufort
François Beaufort

WebCodecs-Integration

WebGPU stellt eine API zum Erstellen undurchsichtiger „externer Textur“-Objekte von HTMLVideoElement bis importExternalTexture() bereit. Mit diesen Objekten können Sie die Videoframes effizient erfassen, möglicherweise ohne Kopien direkt aus den Quelldaten des YUV-Farbmodells.

Die ursprüngliche WebGPU-Spezifikation ließ jedoch das Erstellen von GPUExternalTexture-Objekten aus WebCodecs-Objekten vom Typ VideoFrame nicht zu. Diese Funktion ist wichtig für fortgeschrittene Videoverarbeitungsanwendungen, die bereits WebCodecs verwenden und WebGPU in die Videoverarbeitungspipeline integrieren möchten. Durch die WebCodecs-Integration wird die Verwendung von VideoFrame als Quelle für einen GPUExternalTexture- und einen copyExternalImageToTexture()-Aufruf unterstützt. Sehen Sie sich das folgende Beispiel und den Eintrag „chromestatus“ an.

// 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.

Im experimentellen Beispiel Video Uploading with WebCodecs kannst du es ausprobieren.

Von GPUAdapter requestDevice() zurückgegebenes Gerät

Wenn die Methode requestDevice() für GPUAdapter fehlschlägt, weil sie bereits zum Erstellen einer GPUDevice verwendet wurde, wird sie jetzt mit einer GPUDevice erfüllt, die sofort als verloren markiert wird, anstatt ein Versprechen zurückzugeben, das mit null abgelehnt wird. Siehe 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;

Videowiedergabe bei Aufruf von importExternalTexture() flüssig halten

Wenn importExternalTexture() mit einem HTMLVideoElement aufgerufen wird, wird die zugehörige Videowiedergabe nicht mehr gedrosselt, wenn das Video nicht im Darstellungsbereich sichtbar ist. Siehe Problem chromium:1425252.

Einhaltung der Spezifikation

Das Argument message im Konstruktor GPUPipelineError() ist optional. Siehe change chromium:4613967.

Beim Aufruf von createShaderModule() wird ein Fehler ausgegeben, wenn die WGSL-Quelle code \0 enthält. Siehe Problem dawn:1345.

Die Standardmaximaldetailebene (lodMaxClamp), die beim Abtasten einer Textur mit createSampler() verwendet wird, ist 32. Weitere Informationen finden Sie unter chromium:4608063 ändern.

Entwicklerfreundlichkeit verbessern

In der JavaScript-Konsole von DevTools wird eine Nachricht angezeigt, die Entwickler daran erinnert, dass sie WebGPU auf einer nicht unterstützten Plattform verwenden. Weitere Informationen finden Sie unter Änderung chromium:4589369.

Fehlermeldungen bei der Puffervalidierung werden sofort in der JavaScript-Konsole der Entwicklertools angezeigt, wenn getMappedRange() fehlschlägt, ohne dass Entwickler gezwungen sind, Befehle an die Warteschlange zu senden. Weitere Informationen finden Sie unter change chromium:4597950.

Screenshot der JavaScript-Konsole der Entwicklertools mit einer Fehlermeldung zur Pufferüberprüfung
Fehlermeldung bei der Pufferüberprüfung in der JavaScript-Konsole der Entwicklertools.

Dawn-Updates

Die Debug-Ein/Aus-Schaltfläche disallow_unsafe_apis wurde in allow_unsafe_apis umbenannt und standardmäßig deaktiviert. Mit dieser Option werden Validierungsfehler bei API-Einstiegspunkten oder Parameterkombinationen unterdrückt, die noch nicht als sicher eingestuft werden. Sie kann für das Debugging nützlich sein. Siehe issue dawn:1685.

Das veraltete wgpu::ShaderModuleWGSLDescriptor-Attribut source wird zugunsten von code entfernt. Siehe change dawn:130321.

Die fehlende Methode wgpu::RenderBundle::SetLabel() wurde implementiert. Siehe change dawn:134502.

Anwendungen können ein bestimmtes Backend anfordern, wenn sie einen Adapter mit der Option wgpu::RequestAdapterOptionsBackendType abrufen. Unten sehen Sie ein Beispiel. Weitere Informationen finden Sie unter 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);

Es wurde eine neue SwapChain::GetCurrentTexture()-Methode mit zusätzlichen Verwendungsmöglichkeiten für Swapchain-Texturen hinzugefügt, sodass die Rückgabe-wgpu::Texture in Kopien verwendet werden kann. Unten findest du ein Beispiel mit issue dawn:1551.

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

Dies sind nur einige der wichtigsten Highlights. Eine vollständige Liste der Commits

Das ist neu bei WebGPU

Eine Liste aller Themen, die in der Reihe Was ist neu in WebGPU? behandelt wurden.

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