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 WGSL compatibles. Las extensiones de lenguaje WGSL compatibles se habilitan automáticamente, por lo que no es necesario que solicites una de forma explícita. Actualmente, esta lista está vacía, pero es posible que haya muchas en el futuro (por ejemplo, do-while loops). Consulta issue dawn:1777.

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

Compatibilidad experimental con Direct3D 11

El equipo de Chromium está trabajando para agregar compatibilidad con WebGPU para 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 el problema dawn:1705.

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

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

Mejora la experiencia de los desarrolladores

Nuevas advertencias de DevTools

Si se usa la clave depth en un GPUExtend3DDict, se muestra una advertencia en la consola de DevTools, ya que la clave correcta es depthOrArrayLayers. Consulta el problema chromium:1440900.

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

Aunque los envíos y los sorteos de tamaño cero son válidos, una advertencia les recomienda a los desarrolladores que los eviten siempre que sea posible. Consulta el problema dawn:1786.

Mensajes de error mejorados

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

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

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

El mensaje de error de validación minBindingSize ahora informa el grupo y el número de la vinculación que no aprobó la validación, así como el búfer. Consulta el problema dawn:1604.

Se mejoraron los mensajes de error que devuelve el método mapAsync() en un objeto GPUBuffer para ayudar a los desarrolladores durante la depuración. Consulta el siguiente ejemplo y 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 proporciona una mejor experiencia de depuración en macOS cuando lo habilitas para la depuración. Consulta el problema dawn:1784.

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

Registra HLSL si la compilación falla

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 lo habilites para la depuración, se volcará el HLSL si falla la compilación. Consulta el problema dawn:1681.

Actualizaciones de Dawn

Cómo establecer un búfer de vértices

Pasar nullptr en lugar de wgpu::Buffer a SetVertexBuffer() en wgpu::RenderPassEncoder o wgpu::RenderBundleEncoder te permite restablecer un búfer de vértices establecido anteriormente en un espacio determinado. Consulta el 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 archivos adjuntos que permitan que las operaciones de paso de renderización permanezcan en la memoria de mosaicos, lo que evita el tráfico de la 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 el problema dawn: 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.

Cómo compilar sin depot_tools

Una nueva opción de CMake DAWN_FETCH_DEPENDENCIES 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 ella instalen depot_tools. Consulta el cambio 131750.

Novedades de WebGPU

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

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