Novità di WebGPU (Chrome 116)

François Beaufort
François Beaufort

Integrazione di WebCodecs

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

Tuttavia, la specifica WebGPU iniziale non consentiva di creare oggetti GPUExternalTexture da oggetti WebCodecs VideoFrame. Questa funzionalità è importante per le app di elaborazione video avanzata 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 VideoFrame come origine per una chiamata GPUExternalTexture e una copyExternalImageToTexture(). Vedi l'esempio che segue e la voce 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.

Per giocare, guarda l'esempio sperimentale Caricamento di video con WebCodecs.

Dispositivo smarrito restituito da GPUAdapter requestDevice()

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

Mantieni la riproduzione video senza interruzioni se viene chiamato importExternalTexture()

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

Conformità alle specifiche

L'argomento message nel costruttore GPUPipelineError() è facoltativo. Visita la pagina Cambiare chromium:4613967.

Se l'origine WGSL code contiene \0, viene generato un errore durante la chiamata a createShaderModule(). Vedi issue dawn:1345.

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

Migliorare l'esperienza degli sviluppatori

Nella console JavaScript di DevTools viene visualizzato un messaggio che ricorda agli sviluppatori quando utilizzano WebGPU su una piattaforma non supportata. Visita la pagina Cambiare chromium:4589369.

I messaggi di errore relativi alla convalida del buffer vengono mostrati immediatamente nella console JavaScript di DevTools in caso di errore di getMappedRange(), senza che gli sviluppatori debbano inviare comandi alla coda. Visita la pagina Cambiare chromium:4597950.

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

Aggiornamenti da Dawn

L'opzione di attivazione/disattivazione di debug di disallow_unsafe_apis è stata rinominata in allow_unsafe_apis e è stata disattivata per impostazione predefinita. Questa opzione di attivazione/disattivazione elimina gli errori di convalida nei punti di ingresso dell'API o nelle combinazioni di parametri non ancora considerati sicuri. Può essere utile per il debug. Vedi issue dawn:1685.

L'attributo source deprecato wgpu::ShaderModuleWGSLDescriptor è stato rimosso a favore di code. Vedi change dawn:130321.

Il metodo wgpu::RenderBundle::SetLabel() mancante è stato implementato. Vedi change dawn:134502.

Le applicazioni possono richiedere un backend specifico quando ricevono un adattatore con l'opzione wgpu::RequestAdapterOptionsBackendType. Vedi un esempio di seguito e 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);

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

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

Vengono trattati solo alcuni dei punti salienti. Consulta l'elenco completo dei commit.

Novità di WebGPU

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

Chrome 125

Chrome 124

Chrome 123

Chrome 122

Guida introduttiva di Chrome

Chrome 120

Chrome 119

Chrome 118

Chrome 117

Chrome 116

Versione 115 di Chrome

Chrome 114

Chrome 113