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

Франсуа Бофор
François Beaufort

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

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

Новая функция WebGPU "dual-source-blending" позволяет использовать атрибут 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. Это IR, расположенное между абстрактным синтаксическим деревом (AST) Tint и бэкендом Metal, сделает компилятор более эффективным и удобным в поддержке, что в конечном итоге принесет пользу как разработчикам, так и пользователям. Предварительные тесты показывают, что новая версия Tint до 10 раз быстрее транслирует шейдеры Unity WGSL в MSL.

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

Эти улучшения, уже доступные на Android и ChromeOS, постепенно распространяются на устройства macOS с поддержкой WebGPU и бэкэнда Metal. См. проблему 42251016 .

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

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

Консоль DevTools отображает предупреждение об устаревании requestAdapterInfo().
Предупреждение об устаревшей функции requestAdapterInfo() в Chrome DevTools.

Обновления Dawn

API webgpu.h для языка C определил некоторые соглашения об именовании для структур расширения. См. следующие изменения имён и проблему 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

Тип атрибута depthWriteEnabled для WGPUDepthStencilState меняется с логического на WGPUOptionalBool , чтобы лучше отражать три его возможных состояния (true, false и undefined), как в JavaScript API. Подробнее см. следующий фрагмент кода и PR-заголовок webgpu-headers .

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

Здесь рассматриваются лишь некоторые из ключевых моментов. Ознакомьтесь с полным списком коммитов .

Что нового в WebGPU

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

Хром 140

Хром 139

Хром 138

Хром 137

Хром 136

Хром 135

Хром 134

Хром 133

Хром 132

Хром 131

Хром 130

Хром 129

Хром 128

Хром 127

Хром 126

Хром 125

Хром 124

Хром 123

Хром 122

Хром 121

Хром 120

Хром 119

Хром 118

Хром 117

Хром 116

Хром 115

Хром 114

Хром 113