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 necesitas solicitar una de forma explícita. Esta lista está vacía por el momento, 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 con Direct3D 11

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

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

En dispositivos macOS con GPU duales, si se llama a requestAdapter() sin la opción powerPreference, se mostrará la GPU discreta cuando el dispositivo del usuario esté funcionando 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 un GPUExtend3DDict, se mostrará una advertencia en la consola de Herramientas para desarrolladores, ya que 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 issue dawn:1785.

Si bien los despachos y dibujos de tamaño cero son válidos, una advertencia alienta a los desarrolladores a evitarlos siempre que sea posible. Consulta issue 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 issue 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 issue 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 issue dawn:1735.

El mensaje de error de validación minBindingSize ahora informa el grupo y el número de la vinculación que falló en la validación, así como el búfer. Consulta issue 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 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, obtendrás una mejor experiencia de depuración en macOS cuando lo habilites para la depuración. Consulta issue 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.

Registrar 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, el archivo HLSL se volcará si falla la compilación. Consulta issue dawn:1681.

Actualizaciones del amanecer

Anulación del búfer de vértices

Pasar nullptr en lugar de un wgpu::Buffer a SetVertexBuffer() en wgpu::RenderPassEncoder o wgpu::RenderBundleEncoder te permite anular la configuración de un búfer de vértices establecido con anterioridad en una ranura determinada. Consulta issue 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

Si configuras el uso de wgpu::TextureUsage::TransientAttachment, puedes crear adjuntos que permitan que las operaciones de pase de renderización permanezcan en la memoria de la tarjeta, lo que evita el tráfico de VRAM y la asignación de VRAM para las texturas. Esta función solo es compatible con Metal y Vulkan. Consulta issue 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.

Edificio sin depot_tools

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

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