Novedades de WebGPU (Chrome 130)

François Beaufort
François Beaufort

Combinación de fuente doble

La combinación de dos resultados del sombreador de fragmentos en un búfer de fotogramas único se denomina combinación de fuente doble. 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. Cuando se reemplazan los pases de renderización posteriores por un solo pase de renderización, 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 denotar el índice de fuente de compaginación y los siguientes factores de compaginació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 en el que se muestra el proceso de conversión del código de 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 ampliando de forma progresiva a los dispositivos macOS que admiten WebGPU con el backend de Metal. Consulta el problema 42251016.

Baja de GPUAdapter requestAdapterInfo()

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 dejó de estar disponible. Consulta la sección sobre intención de dar de baja.

La consola de Herramientas para desarrolladores 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 webgpu.h C definió algunas convenciones de nombres para las structs de extensiones. 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 abarca solo 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 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