Что нового в WebGPU (Chrome 130)

François Beaufort
François Beaufort

Совмещение двух источников данных

Объединение двух выходных данных фрагментного шейдера в один буфер кадра называется смешиванием из двух источников. Этот метод особенно полезен для приложений, в которых требуются сложные операции смешивания, например на основе режимов смешивания Портера-Даффа. Заменяя последующие проходы рендеринга одним проходом, смешивание двух источников может повысить производительность и гибкость.

Новая функция "dual-source-blending" WebGPU позволяет использовать атрибут WGSL @blend_src в @location(0), чтобы обозначить индекс источника смешивания и следующие факторы смешивания: "src1", "one-minus-src1", "src1-alpha" и "one-minus-src1-alpha". Ознакомьтесь со следующим фрагментом кода, записью в chromestatus и проблемой 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...

Улучшено время компиляции шейдеров на Metal

Команда Chrome улучшает Tint, компилятор языка шейдеров WebGPU, добавляя промежуточное представление (IR) для устройств, поддерживающих WebGPU с серверной частью Metal. Этот промежуточный код, расположенный между абстрактным синтаксическим деревом Tint и модулем записи Metal, повысит эффективность и удобство поддержки компилятора, что в конечном итоге принесет пользу как разработчикам, так и пользователям. Первые тесты показали, что новая версия Tint переводит шейдеры WGSL в MSL до 10 раз быстрее.

Блок-схема, на которой показан процесс преобразования кода шейдера WGSL в инструкции низкого уровня для графического процессора.
Создание конвейера рендеринга в macOS.

Эти улучшения уже доступны на устройствах с Android и ChromeOS и постепенно добавляются на устройства с macOS, поддерживающие WebGPU с серверной частью Metal. Подробнее о проблеме 42251016…

Устаревание метода GPUAdapter requestAdapterInfo()

Асинхронный метод GPUAdapter requestAdapterInfo() избыточен, поскольку разработчики уже могут получать GPUAdapterInfo синхронно, используя атрибут GPUAdapter info. Поэтому нестандартный метод GPUAdapter requestAdapterInfo() теперь устарел. Подробнее о прекращении поддержки…

В консоли инструментов разработчика показывается предупреждение об устаревании функции requestAdapterInfo().
Предупреждение об устаревшей функции для requestAdapterInfo() в инструментах разработчика в Chrome

Обновления на рассвете

В C API webgpu.h определены правила именования для структур расширений. Ознакомьтесь с приведенными ниже изменениями названий и проблемой 42241174.

WGPURenderPassDescriptor расширения
WGPURenderPassDescriptorMaxDrawCount -> WGPURenderPassMaxDrawCount
WGPUShaderModuleDescriptor расширения
WGPUShaderModuleSPIRVDescriptor -> WGPUShaderSourceSPIRV
WGPUShaderModuleWGSLDescriptor -> WGPUShaderSourceWGSL
WGPUSurfaceDescriptor расширения
WGPUSurfaceDescriptorFromMetalLayer -> WGPUSurfaceSourceMetalLayer
WGPUSurfaceDescriptorFromWindowsHWND -> WGPUSurfaceSourceWindowsHWND
WGPUSurfaceDescriptorFromXlibWindow -> WGPUSurfaceSourceXlibWindow
WGPUSurfaceDescriptorFromWaylandSurface -> WGPUSurfaceSourceWaylandSurface
WGPUSurfaceDescriptorFromAndroidNativeWindow -> WGPUSurfaceSourceAndroidNativeWindow
WGPUSurfaceDescriptorFromXcbWindow -> WGPUSurfaceSourceXCBWindow
WGPUSurfaceDescriptorFromCanvasHTMLSelector -> WGPUSurfaceSourceCanvasHTMLSelector_Emscripten

Тип атрибута WGPUDepthStencilState depthWriteEnabled изменен с логического на WGPUOptionalBool, чтобы лучше отражать три возможных состояния (true, false и undefined), как в JavaScript API. Чтобы узнать больше, ознакомьтесь с приведенным ниже фрагментом кода и запросом на добавление заголовков WebGPU.

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

Это лишь некоторые из основных изменений. Ознакомьтесь с полным списком коммитов.

Что нового в WebGPU

Список всех тем, которые были рассмотрены в серии статей Что нового в WebGPU.

Chrome 155–156

Chrome 153–154

Chrome 151–152

Chrome 149–150

Chrome 147–148

Chrome 146

Chrome 145

Chrome 144

Chrome 143

Chrome 142

Chrome 141

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