Novedades de WebGPU (Chrome 115)

François Beaufort
François Beaufort

Extensiones de lenguaje WGSL compatibles

El miembro wgslLanguageFeatures del objeto GPU enumera los nombres de las extensiones de idioma de WGSL compatibles. Las extensiones de idioma WGSL compatibles se habilitan automáticamente, por lo que no es necesario que las solicite de forma explícita. Por el momento, la lista está vacía, pero puedes esperar muchas en el futuro (por ejemplo, do-while loops). Consulta el problema dawn:1777.

if (navigator.gpu.wgslLanguageFeatures?.has("unknown-feature")) {
  // Use unknown-feature in WGSL shader code.
}

Compatibilidad experimental para Direct3D 11

El equipo de Chromium está trabajando para agregar compatibilidad con WebGPU en Direct3D 11. Ahora puedes experimentar con él de forma local. Para ello, ejecuta Chrome en Windows con las marcas de línea de comandos --enable-unsafe-webgpu --use-webgpu-adapter=d3d11. Consulta problema dawn:1705.

Obtén una GPU discreta de forma predeterminada con la alimentación de CA

En dispositivos macOS con doble GPU, si se llama a requestAdapter() sin una opción powerPreference, se muestra la GPU discreta cuando el dispositivo del usuario funciona con CA. De lo contrario, se muestra la GPU integrada. Consulta el cambio 4499307.

Mejora la experiencia de los desarrolladores

Nuevas advertencias de Herramientas para desarrolladores

Si se usa la clave depth en una GPUExtend3DDict, se muestra una advertencia en la consola de Herramientas para desarrolladores porque la clave correcta es depthOrArrayLayers. Consulta el problema chromium:1440900.

También se envía una advertencia si un GPUBlendComponent tiene una combinación de miembros explícitos y predeterminados. Consulta problema dawn:1785.

Aunque los envíos y las muestras de tamaño cero son válidos, una advertencia anima a los desarrolladores a evitarlos cuando sea posible. Consulta problema dawn:1786.

Mejores mensajes de error

Ahora se muestra un mensaje de error mejorado cuando se usa un GPUCommandEncoder si ya se llamó a finish(). Consulta problema dawn:1736.

Cuando envías búferes de comandos con objetos destruidos, las etiquetas de los búferes de comandos que se usaron en submit() ahora son visibles en el mensaje de error. Consulta problema dawn:1747.

La parte no válida del estado de la plantilla de profundidad ahora se especifica en el mensaje de error cuando se valida depthStencil. Consulta problema dawn:1735.

El mensaje de error de validación minBindingSize ahora informa el grupo y la cantidad de vinculaciones que fallaron en la validación, así como el búfer. Consulta problema dawn:1604.

Se mejoraron los mensajes de error que muestra el método mapAsync() en un objeto GPUBuffer para ayudar a los desarrolladores durante la depuración. Consulta el siguiente ejemplo y consulta el problema chromium:1431622.

// Create a GPU buffer and map it.
const descriptor = { size: 0, usage: GPUBufferUsage.MAP_READ };
const buffer = device.createBuffer(descriptor);
buffer.mapAsync(GPUMapMode.READ);

// Before it has been mapped, request another mapping.
try {
  await buffer.mapAsync(GPUMapMode.READ);
} catch (error) {
  // New! Error message tells you mapping is already pending.
  console.warn(error.message);
}

Etiquetas en las herramientas de depuración de macOS

El botón de activación de depuración use_user_defined_labels_in_backend te permite reenviar etiquetas de objetos al backend para que se puedan ver en herramientas de depuración específicas de la plataforma, como RenderDoc, PIX o Instruments. A partir de ahora, se brindará una mejor experiencia de depuración en macOS cuando lo habilites para la depuración. Consulta el problema dawn:1784.

Captura de pantalla de la app de Instruments en macOS que muestra etiquetas personalizadas provenientes de WebGPU.
Etiquetas definidas por el usuario en la app de Instruments en macOS

Registra HLSL si falla la compilación

El botón de activación de depuración dump_shaders te permite registrar sombreadores WGSL de entrada y sombreadores de backend traducidos. A partir de ahora, cuando la habilites para la depuración, la HLSL se volcará si falla la compilación. Consulta el problema dawn:1681.

Actualizaciones del amanecer

Anular búfer de vértices

Pasar nullptr en lugar de wgpu::Buffer a SetVertexBuffer() en wgpu::RenderPassEncoder o wgpu::RenderBundleEncoder te permite anular la configuración de un búfer de vértices configurado anteriormente en una ranura determinada. Consulta problema dawn:1675.

// Set vertex buffer in slot 0.
myRenderPassEncoder.SetVertexBuffer(0, myVertexBuffer);

// Then later, unset vertex buffer in slot 0.
myRenderPassEncoder.SetVertexBuffer(0, nullptr);

Archivos adjuntos transitorios

Puedes crear adjuntos que permitan que las operaciones de pase de renderización permanezcan en la memoria de mosaicos, lo que evita el tráfico de VRAM y posiblemente la asignación de VRAM para las texturas, si configuras el uso de wgpu::TextureUsage::TransientAttachment. Esta función solo es compatible con Metal y Vulkan. Consulta amanecer del problema: 1695.

wgpu::TextureDescriptor desc;
desc.format = wgpu::TextureFormat::RGBA8Unorm;
desc.size = {1, 1, 1};
desc.usage = wgpu::TextureUsage::RenderAttachment |
             wgpu::TextureUsage::TransientAttachment;

auto transientTexture = device.CreateTexture(&desc);

// You can now create views from the texture to serve as transient
// attachments, e.g. as color attachments in a render pipeline.

Compilando sin depot_tools

Una nueva opción DAWN_FETCH_DEPENDENCIES de CMake te permite recuperar dependencias de Dawn con una secuencia de comandos de Python que lee archivos DEPS en lugar de requerir que todos los proyectos que dependen de esta instalen depot_tools. Consulta el cambio 131750.

Novedades de WebGPU

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

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