Vkd3d — один из важных компонентов современного игрового Linux, отвечающий за перевод команд Direct3D 12 (используемого в подавляющем большинстве современных AAA-игр) в понятный для Vulkan вид. Релиз версии 1.19, хоть и является точечным обновлением, содержит ряд крайне важных улучшений, особенно для пользователей мобильных GPU и встраиваемых систем.
Основные изменения в libvkd3d
- Корректность на тайловых рендерах: Добавлена вставка барьеров между проходами рендеринга, работающими с одними и теми же изображениями. На настольных дискретных GPU это не критично, но для корректной работы на графических процессорах с тайловой архитектурой (например, в мобильных чипах и некоторых встраиваемых решениях) это важнейшее исправление, гарантирующее правильность отрисовки.
- Режимы уменьшения фильтрации текстур: Добавлена поддержка режимов «minimum» и «maximum» для reduction-фильтров.
Прогресс в libvkd3d-shader (обработка шейдеров)
Этот раздел получил наибольшее количество улучшений, особенно в части совместимости с различными форматами шейдеров.
- Clip и cull distance: Значительно улучшена обработка массивов входных/выходных данных для расстояний отсечения (clip and cull distances) при компиляции в SPIR-V. Предыдущий код был хрупким и не справлялся с рядом случаев, что приводило к ошибкам в играх, использующих эти возможности.
- Улучшения для HLSL (High-Level Shading Language):
- Эффекты (Effects / FX): Целевые профили FX теперь могут выводить встроенные шейдерные бинарные блоки (blobs), создаваемые функциями
CompileShader()иConstructGSWithSO(). Это улучшает поддержку старого софта и игр, использующих эту технологию. - Статические инициализации: Статически инициализированные переменные теперь считаются статическими выражениями. Например, код
int count = 4; float4 array[count];теперь считается валидным. - Работа со структурированными ресурсами: Реализованы операции записи (store) в
RWStructuredBuffer, загрузки (load) из структурированной разделяемой памяти группы потоков (thread group shared memory), а также операции копирования с участием структурированных ресурсов. - Корректное приведение типов: Приведение чисел с плавающей запятой к булевым значениям теперь работает корректно: любое ненулевое значение становится
true. Ранее, например,(bool)0.25fмогло свернуться вfalse. - Другие улучшения HLSL: Спецификатор
staticразрешён для функций. ТипыBuffer,StructuredBufferиByteAddressBufferтеперь поддерживаются в FX-профилях.
- Эффекты (Effects / FX): Целевые профили FX теперь могут выводить встроенные шейдерные бинарные блоки (blobs), создаваемые функциями
- Поддержка старых инструкций Direct3D: Реализован ряд устаревших инструкций байт-кода Direct3D, включая
dp2add,loop/endloop,lrp,nrm,pow,rep/endrep. Это улучшает совместимость со старыми играми. - Улучшенный дамп шейдеров: При использовании переменной окружения
VKD3D_SHADER_DUMP_PATHдля сохранения шейдеров теперь также сохраняются сообщения компиляции (ошибки, предупреждения).
Новые интерфейсы и улучшения сборки
- Новый параметр шейдера: Добавлен параметр
VKD3D_SHADER_PARAMETER_NAME_PROJECTED_TEXTURE_MASK, который указывает, какие текстуры в пиксельных шейдерах моделей 1.0-1.3 должны считаться проекционными (projected textures). - Улучшения для тестирования: Добавлена переменная окружения
VKD3D_TEST_WRAPPER, позволяющая оборачивать выполнение тестов.
Релиз vkd3d 1.19 — это важный шаг вперёд для всей экосистемы трансляции Direct3D 12. Исправления для тайловых рендеров делают библиотеку более универсальной, а улучшения в обработке шейдеров повышают совместимость с широким спектром игр — от современных блокбастеров до классики, использующей эффекты и старые шейдерные модели.
Исходный код новой версии уже доступен для загрузки с серверов WineHQ. Библиотека распространяется под условиями LGPL и может быть интегрирована в ваши проекты или использована для обновления системных компонентов.