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 Kopien direkt aus den Quelldaten des YUV-Farbmodells.

In der ursprünglichen WebGPU-Spezifikation war es jedoch nicht möglich, GPUExternalTexture-Objekte aus VideoFrame-Objekten von WebCodecs zu erstellen. Diese Funktion ist wichtig für erweiterte Videoverarbeitungs-Apps, die bereits WebCodecs verwenden und WebGPU in die Videoverarbeitungspipeline 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 sich das genauer ansehen.

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

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;

Videowiedergabe flüssig halten, wenn importExternalTexture() aufgerufen wird

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.

Entwicklererfahrung 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 in dieser Chromium-Änderung.

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 Puffervalidierung.
Fehlermeldung zur 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 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 Debugging hilfreich sein. Siehe Problem dawn:1685.

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

Die fehlende Methode wgpu::RenderBundle::SetLabel() wurde implementiert. Weitere Informationen finden Sie unter change dawn:134502.

Anwendungen können ein bestimmtes Backend anfordern, wenn sie einen Adapter mit der Option wgpu::RequestAdapterOptionsBackendType abrufen. Beispiel und Problem 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 der Rückgabewert wgpu::Texture in Kopien verwendet werden kann. Ein Beispiel finden Sie unten.

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

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

Neues zu WebGPU

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

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