Что нового в 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. См. выпуск 42251016 .

Устаревшая функция запроса GPUAdapterInfo().

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

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

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

API C 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

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

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

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

Что нового в WebGPU

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

Хром 130

Хром 129

Хром 128

Хром 127

Хром 126

Хром 125

Хром 124

Хром 123

Хром 122

Хром 121

Хром 120

Хром 119

Хром 118

Хром 117

Хром 116

Хром 115

Хром 114

Хром 113