Novedades de WebGPU (Chrome 135)

François Beaufort
François Beaufort

Publicado: 26 de marzo de 2025

Permite crear diseños de canalizaciones con diseños de grupos de vinculación nulos

Anteriormente, crear un diseño de grupo de vinculaciones vacío requería agregar un grupo de vinculaciones con cero vinculaciones, lo que era inconveniente. Esto ya no es necesario, ya que ahora se permiten y se ignoran los diseños de grupos de vinculación nulos cuando se crea un diseño de canalización. Esto debería facilitar el desarrollo.

Por ejemplo, es posible que desees crear una canalización que solo use los diseños de grupos de vinculaciones 0 y 2. Podrías asignar el diseño del grupo de vinculación 1 a los datos de fragmentos y el diseño del grupo de vinculación 2 a los datos de vértices, y, luego, renderizar sin un sombreador de fragmentos. Consulta el problema 377836524.

const bgl0 = myDevice.createBindGroupLayout({ entries: myGlobalEntries });
const bgl1 = myDevice.createBindGroupLayout({ entries: myFragmentEntries });
const bgl2 = myDevice.createBindGroupLayout({ entries: myVertexEntries });

// Create a pipeline layout that will be used to render without a fragment shader.
const myPipelineLayout = myDevice.createPipelineLayout({
  bindGroupLayouts: [bgl0, null, bgl2],
});

Permite que los viewport se extiendan más allá de los límites de los destinos de renderización

Se relajaron los requisitos para la validación del viewport, de modo que se permita que los viewports superen los límites del objetivo de renderización. Esto es especialmente útil para dibujar elementos 2D, como la IU, que pueden extenderse fuera del viewport actual. Consulta el problema 390162929.

const passEncoder = myCommandEncoder.beginRenderPass({
  colorAttachments: [
    {
      view: myColorTexture.createView(),
      loadOp: "clear",
      storeOp: "store",
    },
  ],
});

// Set a viewport that extends past the render target's bounds by 8 pixels
// in all directions.
passEncoder.setViewport(
  /*x=*/ -8,
  /*y=*/ -8,
  /*width=*/ myColorTexture.width + 16,
  /*height=*/ myColorTexture.height + 16,
  /*minDepth=*/ 0,
  /*maxDepth=*/ 1,
);

// Draw geometry and complete the render pass as usual.

Acceso más sencillo al modo de compatibilidad experimental en Android

La marca chrome://flags/#enable-unsafe-webgpu por sí sola ahora habilita todas las capacidades necesarias para el modo de compatibilidad con WebGPU experimental en Android. Con eso, puedes solicitar un GPUAdapter en modo de compatibilidad con la opción featureLevel: "compatibility" y, hasta, acceder al backend de OpenGL ES en dispositivos que no admiten Vulkan. Consulta el siguiente ejemplo y el problema dawn:389876644.

// Request a GPUAdapter in compatibility mode.
const adapter = await navigator.gpu.requestAdapter({ featureLevel: "compatibility" });
La página de informes de WebGPU muestra un GPUAdapter en modo de compatibilidad en un dispositivo Android.
Información del adaptador del modo de compatibilidad en webgpureport.org.

Quita el límite de maxInterStageShaderComponents

Como se anunció anteriormente, se quitó el límite de maxInterStageShaderComponents debido a una combinación de factores:

  • Redundancia con maxInterStageShaderVariables: Este límite ya cumple un propósito similar, ya que controla la cantidad de datos que se pasan entre las etapas del sombreador.
  • Discrepancias menores: Si bien existen pequeñas diferencias en la forma en que se calculan los dos límites, estas diferencias son menores y se pueden administrar de manera eficaz dentro del límite de maxInterStageShaderVariables.
  • Simplificación: Quitar maxInterStageShaderComponents optimiza la interfaz del sombreador y reduce la complejidad para los desarrolladores. En lugar de administrar dos límites separados con diferencias sutiles, pueden enfocarse en el maxInterStageShaderVariables, que tiene un nombre más adecuado y es más integral.

Consulta la intención de quitar y el problema 364338810.

Actualizaciones de Dawn

Ya no es posible usar un muestreador de filtrado para muestrear una textura de profundidad. Como recordatorio, una textura de profundidad solo se puede usar con un muestreador de comparación o sin filtro. Consulta el problema 379788112.

Las estructuras WGPURequiredLimits y WGPUSupportedLimits se aplanaron en WGPULimits. Consulta el problema 374263404.

Se cambió el nombre de las siguientes structs. Consulta el problema 42240793.

  • WGPUImageCopyBuffer ahora es WGPUTexelCopyBufferInfo.
  • WGPUImageCopyTexture ahora es WGPUTexelCopyTextureInfo.
  • WGPUTextureDataLayout ahora es WGPUTexelCopyBufferLayout.

Se agregaron los miembros subgroupMinSize y subgroupMaxSize a la estructura WGPUAdapterInfo. Consulta la PR de webgpu-headers.

Ahora es posible hacer un seguimiento del uso de la API de Dawn en Metal cuando ejecutas tu programa con la variable de entorno DAWN_TRACE_FILE_BASE, que guarda un archivo .gputrace que se puede cargar más tarde en el depurador de Metal de Xcode. Consulta la documentación sobre cómo depurar Dawn.

Esto solo abarca algunos de los aspectos destacados clave. Consulta la lista exhaustiva de confirmaciones.

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