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 lenguaje de 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 puedes esperar muchos 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 ejecutando Chrome en Windows con los parámetros de la 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 los dispositivos macOS con GPU doble, si se llama a requestAdapter() sin una opción powerPreference, se devuelve la GPU discreta cuando el dispositivo del usuario está conectado a la alimentación de CA. De lo contrario, se devuelve 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 un GPUExtend3DDict, se muestra una advertencia en la consola de Herramientas para desarrolladores, ya que la clave correcta es depthOrArrayLayers. Consulta el problema chromium:1440900.

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

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

Mejores mensajes de error

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 son visibles en el mensaje de error. Consulta el problema dawn:1747.

La parte no válida del estado del búfer de profundidad y stencil 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 pasó 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 la habilitas 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 lo habilites para la depuración, se volcará el HLSL si falla la compilación. Consulta el problema dawn:1681.

Actualizaciones de Dawn

Búfer de vértices sin configurar

Si pasas nullptr en lugar de un wgpu::Buffer a SetVertexBuffer() en wgpu::RenderPassEncoder o wgpu::RenderBundleEncoder, puedes anular la configuración de un búfer de vértices establecido previamente en una ranura determinada. 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 pase de renderizado permanezcan en la memoria de la segmentación, lo que evita el tráfico de VRAM y, posiblemente, la asignación de VRAM para las texturas si se establece 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 DAWN_FETCH_DEPENDENCIES CMake te permite recuperar dependencias de Dawn con una secuencia de comandos de Python que lee archivos DEPS en lugar de requerir la instalación de depot_tools en todos los proyectos que dependen de ella. Consulta el cambio 131750.

Novedades de WebGPU

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

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