Novedades de WebGPU (Chrome 130)

François Beaufort
François Beaufort

Combinación de fuentes doble

La combinación de dos salidas de sombreador de fragmentos en un solo búfer de trama se denomina combinación de fuentes dobles. Esta técnica es especialmente útil para aplicaciones que requieren operaciones de combinación complejas, como las que se basan en los modos de combinación de Porter-Duff. Cuando se reemplazan los pases de renderización posteriores por un solo pase, la compaginación de fuentes dobles puede mejorar el rendimiento y la flexibilidad.

La nueva función "dual-source-blending" de WebGPU te permite usar el atributo @blend_src de WGSL en @location(0) para indicar el índice de fuente de combinación y los siguientes factores de combinación: "src1", "one-minus-src1", "src1-alpha" y "one-minus-src1-alpha". Consulta el siguiente fragmento, la entrada de chromestatus y el problema 341973423.

const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has("dual-source-blending")) {
  throw new Error("Dual source blending support is not available");
}
// Explicitly request dual source blending support.
const device = await adapter.requestDevice({
  requiredFeatures: ["dual-source-blending"],
});

const code = `
  enable dual_source_blending;

  struct FragOut {
    @location(0) @blend_src(0) color : vec4f,
    @location(0) @blend_src(1) blend : vec4f,
  }

  @fragment fn main() -> FragOut {
    var output : FragOut;
    output.color = vec4f(1.0, 1.0, 1.0, 1.0);
    output.blend = vec4f(0.5, 0.5, 0.5, 0.5);
    return output;
  }
`;

const shaderModule = device.createShaderModule({ code });
// Create a render pipeline with this shader module
// and run the shader on the GPU...

Mejoras en el tiempo de compilación de sombreadores en Metal

El equipo de Chrome está mejorando Tint, el compilador de lenguaje de sombreadores de WebGPU, con la introducción de una representación intermedia (IR) para dispositivos que admiten WebGPU con el backend de Metal. Este IR, ubicado entre el árbol de sintaxis abstracta (AST) de Tint y el escritor de backend de Metal, hará que el compilador sea más eficiente y fácil de mantener, lo que beneficiará a los desarrolladores y a los usuarios. Las pruebas iniciales muestran que la nueva versión de Tint es hasta 10 veces más rápida cuando traduce los sombreadores WGSL de Unity a MSL.

Un diagrama de flujo muestra el proceso de conversión del código del sombreador WGSL en instrucciones de GPU de bajo nivel.
Creación de una canalización de renderización en macOS.

Estas mejoras, a las que ya se puede acceder en Android y ChromeOS, se están expandiendo de forma progresiva a los dispositivos macOS que admiten WebGPU con el backend de Metal. Consulta el problema 42251016.

Obsolescencia de requestAdapterInfo() de GPUAdapter

El método asíncrono requestAdapterInfo() de GPUAdapter es redundante, ya que los desarrolladores ya pueden obtener GPUAdapterInfo de forma síncrona con el atributo info de GPUAdapter. Por lo tanto, el método requestAdapterInfo() de GPUAdapter no estándar ahora es obsoleto. Consulta intención de dar de baja.

La consola de DevTools muestra una advertencia de baja para requestAdapterInfo().
Advertencia de función obsoleta para requestAdapterInfo() en las Herramientas para desarrolladores de Chrome.

Actualizaciones de Dawn

La API de C webgpu.h definió algunas convenciones de nombres para las estructuras de extensión. Consulta los siguientes cambios de nombre y el problema 42241174.

WGPURenderPassDescriptor extensiones
WGPURenderPassDescriptorMaxDrawCount -> WGPURenderPassMaxDrawCount
WGPUShaderModuleDescriptor extensiones
WGPUShaderModuleSPIRVDescriptor -> WGPUShaderSourceSPIRV
WGPUShaderModuleWGSLDescriptor -> WGPUShaderSourceWGSL
WGPUSurfaceDescriptor extensiones
WGPUSurfaceDescriptorFromMetalLayer -> WGPUSurfaceSourceMetalLayer
WGPUSurfaceDescriptorFromWindowsHWND -> WGPUSurfaceSourceWindowsHWND
WGPUSurfaceDescriptorFromXlibWindow -> WGPUSurfaceSourceXlibWindow
WGPUSurfaceDescriptorFromWaylandSurface -> WGPUSurfaceSourceWaylandSurface
WGPUSurfaceDescriptorFromAndroidNativeWindow -> WGPUSurfaceSourceAndroidNativeWindow
WGPUSurfaceDescriptorFromXcbWindow -> WGPUSurfaceSourceXCBWindow
WGPUSurfaceDescriptorFromCanvasHTMLSelector -> WGPUSurfaceSourceCanvasHTMLSelector_Emscripten

El tipo de atributo depthWriteEnabled de WGPUDepthStencilState cambia de booleano a WGPUOptionalBool para reflejar mejor sus tres estados posibles (verdadero, falso y no definido), como en la API de JavaScript. Para obtener más información, consulta el siguiente fragmento de código y la PR de webgpu-headers.

wgpu::DepthStencilState depthStencilState = {};
depthStencilState.depthWriteEnabled = wgpu::OptionalBool::True; // Undefined by default

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 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