После года разработки и 28 тестовых версий увидел свет стабильный релиз Wine 5.0. Новая версия получила около 7400 изменений, количество полноценно работающих программ, написанных под Windows, возросло с 4737 год назад до 4869 сейчас, а ещё 4136 работают при условии донастройки и использования внешний DLL (год назад таких было 4045). Работа ещё 3635 программ может сопровождаться небольшими проблемами, которые не мешают использованию основных функций ПО.
Пробежимся по ключевым изменениям в новой версии Wine:
Основные новшества
- Появились встроенные модули Wine в формате PE (Portable Executable);
- Добавлена поддержка многомониторных конфигураций;
- Новая реализация звукового API XAudio2;
- Добавлена поддержка графического API Vulkan 1.1.
Модули в формате PE
- При наличии компилятора MinGW большинство модулей Wine отныне собираются в формате исполняемых файлов PE вместо ELF. Применение PE решает проблемы с поддержкой различных схем защиты от копирования, осуществляющих сверку идентичности системных модулей на диске и в памяти;
- Исполняемые файлы PE копируются в каталог ~/.wine ($WINEPREFIX) вместо применения фиктивных DLL-файлов, что делает начинку более похожей на реальные установки Windows, потребляя при этом дополнительное дисковое пространства;
- Модули, преобразованные в формат PE, могут использовать штатные wchar Си-функции и константы с юникодом (например, L»abc»);
- В Wine C runtime добавлена поддержка связывания с двоичными файлами, собранными в MinGW, которая при сборке DLL используется по умолчанию вместо MinGW runtime.
Ядро
- Большинство функций, используемых в Kernel32, перемещены в KernelBase, чтобы соответствовать изменениям в архитектуре Windows;
- Возможность смешивания 32- и 64-разрядных DLL в каталогах, используемых для загрузки. Обеспечено игнорирование библиотек, не соответствующих текущей разрядности (32/64), на случай если далее в пути удастся найти корректную для текущей разрядности библиотеку;
- Улучшена эмуляция объектов ядра для драйверов устройств;
- Реализованы работающие на уровне ядра объекты синхронизации, такие как spin-блокировки, быстрые мьютексы и прикрепляемые к ресурсу переменные;
- Информирование приложений о состоянии аккумулятора теперь осуществляется корректнее.
Графическая подсистема
- Появилась возможность работы с несколькими мониторами и видеоадаптерами;
- Возможность динамического изменения настроек при работе с несколькими мониторами и графическими адаптерами;
- Обновлён драйвер для графического API Vulkan, который приведён в соответствие со спецификацией Vulkan 1.1.126;
- В библиотеке WindowsCodecs появилась возможность преобразования дополнительных растровых форматов, включая форматы с индексированной палитрой.
Direct3D
- Добавлена блокировка вызова хранителя экрана при выполнении полноэкранных приложений Direct3D;
- В DirectX Graphics Infrastructure появилась поддержка информирования приложения о минимизации его окна, что позволяет снизить выполнение ресурсоёмких операций при сворачивании окна;
- Для приложений, которые используют DirectX Graphics Infrastructure, реализована возможность переключения между полноэкранным и оконным режимами при помощи Alt+Enter;
- Новые возможности реализации Direct3D 12: появилась поддержка переключения между полноэкранным и оконным режимами, изменение режимов экрана, вывод с масштабированием, управление интервалом замены буферов отрисовки (swap interval);
- Улучшена обработка различных пограничных ситуаций, таких как применение выходящих за допустимые диапазоны исходных значений для тестов прозрачности и глубины, отрисовка с отражёнными текстурами и буферами, использование некорректных DirectDraw объектов clipper, создание устройств Direct3 для некорректных окон, использование видимых областей, минимальные значения параметров которых равны максимальным и т.п.;
- В Direct3D 8 и 9 обеспечено более точное отслеживание «грязных» областей загружаемых текстур;
- Снижен размер необходимого адресного пространства при загрузке 3D-текстур, сжатых методом S3TC (вместо загрузки целиком, текстуры грузятся кусками);
- Реализован интерфейс ID3D11Multithread для защиты критических секций в многопоточных приложениях;
- Для старых приложений DirectDraw внесены некоторые улучшения и исправления, связанные с расчётом освещения;
- Добавлены дополнительные вызовы для получения информации о шейдерах в API ShaderReflection;
- В wined3d добавлена поддержка блиттера на базе CPU для обработки сжатых ресурсов;
- Расширена база данных графических карт, распознаваемых в Direct3D;
- Добавлены новые ключи реестра в ветке HKEY_CURRENT_USER\Software\Wine\Direct3D: «shader_backend» (бэкенд для работы с шейдерами: «glsl» для GLSL, «arb» для ARB vertex/fragment и «none» для отключения поддержки шейдеров), «strict_shader_math» (0x1 — включить, 0x0 — отключить преобразование шейдеров Direct3D). Объявлен устаревшим ключ «UseGLSL» (следует использовать «shader_backend»).
D3DX
- Реализована поддержка механизма сжатия 3D-текстур S3TC (S3 Texture Compression);
- Добавлены корректные реализации таких операций, как заливка текстурой и неотражаемые (unmappable) поверхности;
- Внесены различные улучшения и исправления во фреймворк создания визуальных эффектов.
Интерфейс пользователя и интеграция с рабочим столом
- Минимизированные окна теперь отображаются с использованием заголовка, а не пиктограммы в стиле Windows 3.1;
- Добавлены новые стили кнопок SplitButton (кнопка с выпадающим списком действий) и Command Links (ссылки в диалоговых окнах, используемых для перехода на следующую стадию);
- Для папок Downloads и Templates созданы символьные ссылки, указывающие на соответствующие каталоги в Unix-системах.
Текст и шрифты
- В реализации API DirectWrite добавлена поддержка возможностей OpenType, связанных с позиционированием глифов, которые включены по умолчанию для начертания Latin, включая кернинг;
- Повышена безопасность обработки шрифтовых данных за счёт проверки корректности различных таблиц данных перед их использованием;
- Интерфейсы DirectWrite приведены в соответствие со свежим SDK.
Видео и звук
- Представлена новая реализация звукового API XAudio2, построенная на основе проекта FAudio. Использование FAudio в Wine позволяет добиться более высокого качества звука в играх и задействовать такие возможности как смешивание громкости и расширенные звуковые эффекты;
- Добавлено большое число новых вызовов в реализацию фреймворка Media Foundation, включая поддержку встроенных и пользовательских асинхронных очередей, Source Reader API, Media Session и т.п.;
- Фильтр захвата видео переведён на использование API v4l2 вместо v4l1, что позволило расширить диапазон поддерживаемых камер;
- Удалены встроенные декодировщики AVI, MPEG-I и WAVE, вместо которых теперь используются системные GStreamer или QuickTime;
- Добавлено подмножество конфигурационных API VMR7;
- В звуковые драйверы добавлена поддержка настройки громкости отдельных каналов.
Сетевые возможности
- Браузерный движок Wine Gecko, используемый в библиотеке MSHTML, обновлён до выпуска 2.47.1;
- В MSHTML добавлена поддержка SVG-элементов;
- Добавлены новые функции VBScript (обработчики ошибок и исключений, функции Hour, Day, Month, String, LBound, RegExp.Replace, РScriptTypeInfo_* и ScriptTypeComp_Bind* и т.п.);
- Обеспечено сохранение состояния кода в VBScript и JScript;
- Добавлена начальная реализация сервиса HTTP (WinHTTP) и связанного с ним API (HTTPAPI) для клиентских и серверных приложений, отравляющих и принимающих запросы при помощи протокола HTTP;
- Реализована возможность получения параметров настройки HTTP-прокси через DHCP;
- Добавлена поддержка перенаправления запросов аутентификации через службу Microsoft Passport.
Криптография
- Реализована поддержка криптографических ключей на основе эллиптических кривых (ECC) при использовании GnuTLS;
- Введена возможность импорта ключей и сертификатов из файлов в формате PFX;
- Появилась поддержка схемы формирования ключа на основе пароля PBKDF2.
Устройства ввода
- При запуске обеспечена установка и загрузка необходимых драйверов устройств Plug & Play;
- Улучшена поддержка игровых контроллеров, включая мини-джойстик (hat switch), руль, педали для газа и тормозов;
- Прекращена поддержка старого API взаимодействия с джойстиками, используемого в ядрах Linux до версии 2.2.
Установщики
- Для установщика MSI реализована поддержка поставки патчей (Patch Files);
- В утилите WUSA (Windows Update Standalone Installer) появилась возможность установки обновлений в формате .MSU.
Встроенные приложения
- Реализована утилита CHCP для настройки кодовой страницы консоли;
- Реализована утилита MSIDB для манипуляции с базами в формате MSI.
Интернационализация
- Таблицы Unicode обновлены до версии 12.1.0;
- Реализована поддержка нормализации Unicode;
- Обеспечена автоматическая установка географического региона (HKEY_CURRENT_USER\Control Panel\International\Geo) на основе текущей локали.
.NET
- Движок Mono обновлён до выпуска 4.9.4 и теперь включает части фреймворка Windows Presentation Foundation (WPF);
- Добавлена возможность установки дополнений с Mono и Gecko в один общий каталог с размещением файлов в иерархии /usr/share/wine вместо копирования в новые префиксы.
RPC/COM
- В typelib появилась поддержка сложных структур и массивов;
- Добавлена начальная реализация runtime-библиотеки Windows Script;
- Добавлена начальная реализация библиотеки ADO (Microsoft ActiveX Data Objects).
Инструменты для разработки/Winelib
- Добавлена возможность применения отладчика из Visual Studio для удалённой отладки приложений, запущенных в Wine;
- Частично реализована библиотека DBGENG (Debug Engine);
- Собранные для Windows исполняемые файлы более не зависят от libwine, что позволяет запускать их в Windows без дополнительных зависимостей;
- В Resource Compiler и IDL Compiler добавлена опция ‘—sysroot’ для определения пути размещения заголовочных файлов;
- В winegcc добавлены опции ‘—target’, ‘—wine-objdir’, ‘—winebuild’ и ‘-fuse-ld’, упрощающие настройку окружения для кросс-компиляции.
ARM
- Для архитектуры ARM64 в ntdll добавлена поддержка раскрутки стека (stack unwinding). Добавлена поддержка подключения внешних библиотек libunwind;
- Для архитектуры ARM64 реализована поддержка бесшовных прокси (stubless proxies) для интерфейсов объектов.
Оптимизация
- Различные функции работы со временем переведены на использование высокопроизводительных системных функций работы с таймером, что позволило снизить накладные расходы в цикле отрисовки многих игр;
- Добавлена возможность использования в файловой системе Ext4 режима работы без учёта регистра символов;
- Проведена оптимизация производительности обработки большого числа элементов в диалогах вывода списков, работающих в режиме LBS_NODATA;
- Добавлена более быстрая реализация SRW-блокировок (Slim Reader/Writer) для Linux, переведённая на Futex.
Внешние зависимости
- Для сборки модулей в формате PE задействован кросс-компилятор MinGW-w64;
- Реализация XAudio2 требует наличия библиотеки FAudio;
- Для отслеживания изменений файлов на системах BSD задействована библиотека Inotify;
- Для обработки исключений на платформе ARM64 необходима библиотека Unwind;
- Вместо Video4Linux1 теперь требуется библиотека Video4Linux2.
Свежую версию Wine можно скачать по этой ссылке.
Статьи по теме: