21 мая вышла новая мажорная версия библиотеки для трансляции Direct3D 12 в Vulkan — vkd3d 2.0

Проект vkd3d достиг важного рубежа. Версия 2.0 — это не просто номер, а отражение серьёзной внутренней работы, проделанной над библиотекой. Она становится мощнее, гибче и надёжнее.

Что нового в vkd3d 2.0

libvkd3d: ядро трансляции D3D12 → Vulkan

  • Создание ресурсов с форматом глубина/трафарет: Ресурсы с комбинированными форматами (например, DXGI_FORMAT_R32G8X24_TYPELESS) теперь можно создавать без обязательного флага D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL. Это важно для приложений, которые используют такие ресурсы и с представлениями глубины/трафарета, и с представлениями шейдерных ресурсов.
  • Расширенный синтаксис VKD3D_DEBUG: Переменная окружения VKD3D_DEBUG получила расширенный синтаксис для более точного контроля над отладочным выводом. Подробности — в разделе README.

libvkd3d-shader: сердце обработки шейдеров

Новые возможности HLSL:

  • Операции записи: В структурированную разделяемую память группы потоков.
  • Операции с чередованием (interlocked): Над структурированными и/или массивными неупорядоченными представлениями доступа (UAV) и разделяемой памятью группы потоков.
  • Исключение общих подвыражений (CSE): Добавлен новый проход оптимизации.
  • Циклы в шейдерных моделях 2-3: Добавлена начальная поддержка циклов.
  • Эффективное использование временных регистров: Улучшена работа аллокатора регистров, добавлен проход «поднятия выходных записей». Особенно важно для шейдерных моделей 1-3 с ограниченным числом временных регистров.
  • Новые встроенные функции: tex3Dbias(), tex3Dlod() и texCUBElod().
  • Семантики ввода/вывода: SV_ClipDistance и SV_CullDistance.
  • Семантика вывода пиксельного шейдера: SV_StencilRef.
  • Корректная обработка InterlockedMin/Max: Для входных данных с разной знаковостью.
  • Обратная совместимость семантик: Флаг VKD3D_SHADER_COMPILE_OPTION_BACKCOMPAT_MAP_SEMANTIC_NAMES теперь также отображает VFACE и VPOS (SM3) в их эквиваленты в SM4+.
  • Свёртка констант для взятия модуля (float): x % y с константами вычисляется во время компиляции.
  • Область переменных в цикле for: Расширена за пределы цикла (в отличие от C99).
  • Парсинг литералов с плавающей запятой: Стал независимым от локали (всегда использует точку .).

Улучшения для эффектов (FX):

  • Исправлен парсинг индексов операндов в блоке eval().
  • Поддерживается операция umod FXLVM.

Улучшения для устаревшего байт-кода Direct3D:

  • Поддержка инструкций: m4x4, m3x4, m4x3, m3x3, m3x2, phase, texdepth, texreg2ar, texreg2gb, texreg2rgb.
  • Модификаторы источников: _dz, _db, _dw, _da (используются с texcrd и texld).
  • Входные регистры пиксельных шейдеров: vFace и vPos.
  • Вывод размера точки (point size): Для вершинных шейдеров SM3.
  • Ограничение выходов вершинных шейдеров SM1-2: Диапазоном 0-1.

Другие улучшения:

  • DXIL: Поддержка прямых ссылок (forward-referencing) в указателях для различных операций. Поддержка указанных из пиксельного шейдера значений трафарета.
  • MSL (Metal Shading Language): Экспериментальная поддержка указанных из пиксельного шейдера значений трафарета.
  • Direct3D Shader Assembly: Поддержка 16-битных непосредственных констант и глобальных флагов:

64UAVs, ROVs, UAVLoadAdditionalFormats, UAVsAtEveryStage,

allResourcesBound, enable11_1ShaderExtensions, int64Ops,

nativeLowPrecision, stencilRef, viewportAndRTArrayIndex, waveOps.

  • Новые интерфейсы для контроля денормальных чисел:
    • Структура для получения режима денормальных чисел.
    • Опции компиляции для 16, 32 и 64-битных чисел с плавающей точкой.
    • Для SPIR-V требуется расширение SPV_KHR_float_controls.
  • Расширенный синтаксис VKD3D_SHADER_DEBUG: Для более точного контроля отладки.

libvkd3d-utils: утилиты компиляции шейдеров

  • Функции D3DCompile(), D3DCompile2(), D3DCompile2VKD3D() и D3DPreprocess() теперь поддерживают D3D_COMPILE_STANDARD_FILE_INCLUDE как обработчик включений.
  • Константные юниформы: Если не указан флаг D3DCOMPILE_ENABLE_BACKWARDS_COMPATIBILITY, D3DCompile2VKD3D() считает все юниформы с глобальной областью действия константными для версий компилятора 37 и выше (аналогично D3DCompile() и D3DCompile2()).

vkd3d 2.0 — это мощный шаг вперёд для библиотеки, лежащей в основе совместимости Direct3D 12 на Linux. Поддержка новых семантик, оптимизация шейдеров и контроль над денормальными числами делают её незаменимым инструментом для разработчиков и энтузиастов игр на Linux.

Исходный код уже доступен по ссылке. Как всегда, проект существует благодаря работе многих людей.

  • Просмотров: 26