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

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

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

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

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

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

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

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

Хром 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