Novedades de WebGPU (Chrome 135)

François Beaufort
François Beaufort

Fecha de publicación: 26 de marzo de 2025

Se permite crear un diseño de canalización con un diseño de grupo de vinculación nulo.

Anteriormente, crear un diseño de grupo de vinculaciones vacío requería agregar un grupo de vinculaciones sin 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 grupo de vinculaciones 0 y 2. Puedes 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 viewports 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 para permitir que los viewports vayan más allá de los límites del destino 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

Ahora, solo la marca chrome://flags/#enable-unsafe-webgpu habilita todas las funciones necesarias para el modo de compatibilidad de WebGPU experimental en Android. Con eso, puedes solicitar un GPUAdapter en modo de compatibilidad con la opción featureLevel: "compatibility" y hasta obtener acceso 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 del informe de WebGPU muestra un GPUAdapter en modo de compatibilidad en un dispositivo Android.
Información del adaptador del modo de compatibilidad en webgpureport.org.

Se quitó 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 tiene un propósito similar, que es controlar la cantidad de datos que se pasan entre las etapas del sombreador.
  • Discrepancias menores: Si bien hay ligeras diferencias en la forma en que se calculan los dos límites, estas 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 más completo y con un nombre más apropiado.

Consulta el intento de quitar y el problema 364338810.

Actualizaciones de Dawn

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

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

Se cambió el nombre de las siguientes estructuras. 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 realizar 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 adelante en el depurador de Metal de XCode. Consulta la documentación de Debugging Dawn.

Esto solo abarca algunos de los aspectos más destacados. Consulta la lista exhaustiva de confirmaciones.

Novedades de WebGPU

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

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