Novità di WebGPU (Chrome 116)

François Beaufort
François Beaufort

Integrazione di WebCodecs

WebGPU espone un'API per creare oggetti "texture esterna" opachi da HTMLVideoElement tramite importExternalTexture(). Puoi utilizzare questi oggetti per campionare in modo efficiente i frame video, potenzialmente senza copia direttamente dai dati del modello di colore YUV di origine.

Tuttavia, la specifica WebGPU iniziale non consentiva la creazione di oggetti GPUExternalTexture da oggetti WebCodecs VideoFrame. Questa funzionalità è importante per le app di elaborazione video avanzate che utilizzano già WebCodecs e che vorrebbero integrare WebGPU nella pipeline di elaborazione video. L'integrazione di WebCodecs aggiunge il supporto per l'utilizzo di un VideoFrame come origine per una chiamata GPUExternalTexture e copyExternalImageToTexture(). Vedi l'esempio seguente e la voce di 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.

Dai un'occhiata all'esempio sperimentale di caricamento di video con WebCodecs per provarlo.

Dispositivo smarrito restituito da GPUAdapter requestDevice()

Se il requestDevice() metodo su GPUAdapter non riesce perché è già stato utilizzato per creare un GPUDevice, ora viene completato con un GPUDevice immediatamente contrassegnato come smarrito, anziché restituire una promessa che viene rifiutata con null. Vedi il problema 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;

Mantenere fluida la riproduzione video se viene chiamato importExternalTexture()

Quando viene chiamato importExternalTexture() con un HTMLVideoElement, la riproduzione video associata non viene più limitata quando il video non è visibile nell'area visibile. Vedi il problema chromium:1425252.

Conformità alle specifiche

L'argomento message nel costruttore GPUPipelineError() è facoltativo. Vedi la modifica chromium:4613967.

Viene generato un errore quando si chiama createShaderModule() se il codice sorgente WGSL code contiene contiene \0. Vedi il problema dawn:1345.

Il livello di dettaglio massimo predefinito (lodMaxClamp) utilizzato per il campionamento di una texture con createSampler() è 32. Vedi la modifica chromium:4608063.

Migliorare l'esperienza degli sviluppatori

Nella console JavaScript di DevTools viene visualizzato un messaggio per ricordare agli sviluppatori quando utilizzano WebGPU su una piattaforma non supportata. Vedi la modifica chromium:4589369.

I messaggi di errore di convalida del buffer vengono visualizzati immediatamente nella console JavaScript di DevTools quando getMappedRange() non riesce senza costringere gli sviluppatori a inviare comandi alla coda. Vedi la modifica chromium:4597950.

Screenshot della console JavaScript di DevTools con il messaggio di errore di convalida del buffer.
Messaggio di errore di convalida del buffer nella console JavaScript di DevTools.

Aggiornamenti di Dawn

L'opzione di debug disallow_unsafe_apis è stata rinominata in allow_unsafe_apis e il valore predefinito è stato impostato su disattivato. Questa opzione sopprime gli errori di convalida sui punti di ingresso API o sulle combinazioni di parametri che non sono ancora considerati sicuri. Può essere utile per il debug. Vedi il problema dawn:1685.

L'attributo source deprecato wgpu::ShaderModuleWGSLDescriptor viene rimosso a favore di code. Vedi la modifica dawn:130321.

È stato implementato il metodo wgpu::RenderBundle::SetLabel() mancante. Vedi la modifica dawn:134502.

Le applicazioni possono richiedere un backend specifico quando ottengono un adattatore con l'opzione wgpu::RequestAdapterOptionsBackendType. Vedi un esempio di seguito e il problema dawn:1875.

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

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

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

È stato aggiunto un nuovo metodo SwapChain::GetCurrentTexture() con ulteriori utilizzi per le texture della swapchain, in modo che il wgpu::Texture restituito possa essere utilizzato nelle copie. Vedi un esempio di seguito e il problema dawn:1551.

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

Questo articolo tratta solo alcuni dei punti salienti principali. Consulta l'elenco esaustivo dei commit.

Novità di WebGPU

Un elenco di tutti gli argomenti trattati nella serie Novità di WebGPU.

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