Проект 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(). - Поддерживается операция
umodFXLVM.
Улучшения для устаревшего байт-кода 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.
Исходный код уже доступен по ссылке. Как всегда, проект существует благодаря работе многих людей.