Neu in WebGPU (Chrome 116)

François Beaufort
François Beaufort

WebCodecs-Integration

WebGPU stellt eine API zum Erstellen von undurchsichtigen „externen Textur“-Objekten aus HTMLVideoElement über importExternalTexture() bereit. Mit diesen Objekten können Sie die Videoframes effizient abtasten, möglicherweise ohne Kopieren direkt aus den Quelldaten des YUV-Farbmodells.

Die ursprüngliche WebGPU-Spezifikation erlaubte jedoch nicht, GPUExternalTexture-Objekte aus WebCodecs-VideoFrame-Objekten zu erstellen. Diese Funktion ist wichtig für erweiterte Videoverarbeitungs-Apps, die bereits WebCodecs verwenden und WebGPU in die Videoverarbeitungs-Pipeline einbinden möchten. Durch die WebCodecs-Integration wird die Verwendung eines VideoFrame als Quelle für einen GPUExternalTexture- und einen copyExternalImageToTexture()-Aufruf unterstützt. Hier finden Sie ein Beispiel.

// 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 für das Hochladen von Videos mit WebCodecs können Sie die Funktion ausprobieren.

Verlorenes Gerät wird von GPUAdapter.requestDevice() zurückgegeben

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

Flüssige Videowiedergabe bei Aufruf von importExternalTexture()

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

Spezifikationskonformität

Das Argument message im Konstruktor GPUPipelineError() ist optional. Weitere Informationen finden Sie unter change chromium:4613967.

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

Der standardmäßige maximale Detailgrad (lodMaxClamp), der beim Sampling einer Textur mit createSampler() verwendet wird, ist 32. Weitere Informationen finden Sie unter change chromium:4608063.

Entwicklerfreundlichkeit verbessern

In der JavaScript-Konsole der Entwicklertools wird eine Meldung angezeigt, um Entwickler daran zu erinnern, dass sie WebGPU auf einer nicht unterstützten Plattform verwenden. Weitere Informationen finden Sie unter change chromium:4589369.

Fehlermeldungen zur Pufferüberprüfung werden sofort in der JavaScript-Konsole der Entwicklertools angezeigt, wenn getMappedRange() fehlschlägt. Entwickler müssen keine Befehle an die Warteschlange senden. Weitere Informationen finden Sie unter change chromium:4597950.

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

Änderungen bei Dawn

Die Debug-Ein/Aus-Schaltfläche disallow_unsafe_apis wurde in allow_unsafe_apis umbenannt und ist standardmäßig deaktiviert. Mit dieser Ein/Aus-Schaltfläche werden Validierungsfehler bei API-Einstiegspunkten oder Parameterkombinationen unterdrückt, die noch nicht als sicher gelten. Das kann beim Debuggen hilfreich sein. Weitere Informationen finden Sie unter Problem dawn:1685.

Das eingestellte Attribut „source“ vom Typ „wgpu::ShaderModuleWGSLDescriptor“ wurde 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. Hier finden Sie ein Beispiel.

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 der Rückgabewert wgpu::Texture in Kopien verwendet werden kann. Beispiel unten und Problem dawn:1551

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

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

Neu bei WebGPU

Eine Liste aller Themen, die in der Reihe Neu in WebGPU behandelt wurden.

Chrome 155–156

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