Novedades de WebGPU (Chrome 130)

François Beaufort
François Beaufort

Combinación de fuente 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 particularmente útil para aplicaciones que requieren operaciones de combinación complejas, como las que se basan en modos de combinación Porter-Duff. Mediante el reemplazo de los pases de renderización posteriores con un solo pase de renderización, la combinació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 de Tint (AST) y el escritor del backend de Metal, hará que el compilador sea más eficiente y fácil de mantener, lo que, en última instancia, beneficiará tanto a los desarrolladores como 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 canalizaciones 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 porque 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 la sección sobre 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 ha abordado en la serie Novedades de WebGPU.

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