Novedades de WebGPU (Chrome 116)

François Beaufort
François Beaufort

Integración de WebCodecs

WebGPU expone una API para crear objetos opacos de "textura externa" desde HTMLVideoElement hasta importExternalTexture(). Puedes usar estos objetos para tomar muestras de los fotogramas de video de manera eficiente, posiblemente con una copia cero directamente desde los datos del modelo de color YUV de origen.

Sin embargo, la especificación inicial de WebGPU no permitía crear objetos GPUExternalTexture a partir de objetos VideoFrame de WebCodecs. Esta función es importante para las apps de procesamiento de video avanzadas que ya usan WebCodecs y desean integrar WebGPU en la canalización de procesamiento de video. La integración de WebCodecs agrega compatibilidad para usar un VideoFrame como fuente para una llamada GPUExternalTexture y una copyExternalImageToTexture(). Consulta el siguiente ejemplo y la entrada de 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.

Para probar la muestra experimental Cómo subir videos con WebCodecs, pruébalo.

Dispositivo perdido devuelto por GPUAdapter requestDevice()

Si el método requestDevice() en GPUAdapter falla porque ya se usó para crear un GPUDevice, ahora se completa con un GPUDevice que se marcó como perdido de inmediato, en lugar de mostrar una promesa que se rechaza con null. Consulta el 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;

Mantén la reproducción de video fluida si se llama a importExternalTexture().

Cuando se llama a importExternalTexture() con un HTMLVideoElement, la reproducción de video asociada ya no se limita cuando el video no está visible en el viewport. Consulta el problema chromium:1425252.

Cumplimiento de las especificaciones

El argumento message en el constructor GPUPipelineError() es opcional. Consulta cambiar chromium:4613967.

Se genera un error cuando se llama a createShaderModule() si la fuente WGSL code contiene \0. Consulta issue dawn:1345.

El nivel máximo de detalle predeterminado (lodMaxClamp) que se utiliza cuando se toma una textura con createSampler() es 32. Consulta cambiar chromium:4608063.

Mejora la experiencia de los desarrolladores

Se muestra un mensaje en la consola de JavaScript de Herramientas para desarrolladores para recordarles a los desarrolladores cuando estén usando WebGPU en una plataforma no compatible. Consulta cambiar chromium:4589369.

Los mensajes de error de validación del búfer se muestran de manera instantánea en la Consola de JavaScript de las Herramientas para desarrolladores cuando getMappedRange() falla sin que los desarrolladores tengan que enviar comandos a la cola. Consulta change chromium:4597950.

Captura de pantalla de la consola de JavaScript de Herramientas para desarrolladores con un mensaje de error de validación del búfer.
Mensaje de error de validación de búfer en la consola de JavaScript de Herramientas para desarrolladores.

Actualizaciones del amanecer

Se cambió el nombre del botón de activación de depuración disallow_unsafe_apis por allow_unsafe_apis y se inhabilitó de forma predeterminada. Este botón de activación elimina los errores de validación en los puntos de entrada de la API o las combinaciones de parámetros que aún no se consideran seguras. Puede ser útil para la depuración. Consulta issue dawn:1685.

Se quitó el atributo wgpu::ShaderModuleWGSLDescriptor source obsoleto y se reemplazó por code. Consulta cambio dawn:130321.

Se implementó el método wgpu::RenderBundle::SetLabel() faltante. Consulta cambiar dawn:134502.

Las aplicaciones pueden solicitar un backend en particular cuando obtienen un adaptador con la opción wgpu::RequestAdapterOptionsBackendType. Consulta el siguiente ejemplo y el error dawn:1875.

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

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

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

Se agregó un nuevo método SwapChain::GetCurrentTexture() con usos adicionales para texturas de cadena de intercambio, de modo que el wgpu::Texture que se muestra se pueda usar en copias Consulta el siguiente ejemplo y el error dawn:1551.

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

Esto abarca solo algunos de los aspectos más destacados. Consulta la lista detallada de confirmaciones.

Novedades de WebGPU

Una lista de todo lo que se aborda en la serie Novedades de WebGPU.

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