Режим D3D9: почему ему не по пути с Dolphin’ом

Относительно недавно, в 4.0-155 ревизии эмулятора Dolphin была убрана поддержка D3D9 режима. У многих пользователей возникли вопросы: зачем удалять видеорежим, который имеет меньше проблем и лучшую скорость, чем у других видеорежимов? В своем блоге разработчики подробно описали причины удаления D3D9 режима, и какие улучшения она принесет. Ниже приводится перевод этой статьи.

Режим D3D9: почему ему не по пути с Dolphin’ом

Как уже могли заметить многие, в 155 ревизии эмулятора была убрана поддержка D3D9 режима видеоплагина. Таким образом, D3D11 и OpenGL остались единственными аппаратными режимами в Долфине. Долгое время D3D9 считался самым быстрым режимом Долфина и был предпочитаемым выбором среди пользователей ОС Windows. Но тогда зачем его убирать?

В то время как он пользовался любовью у пользователей, для разработчиков он являлся источником бесконечных расстройств. D3D9, по своей сути, дефектен: исправление его проблем занимало много времени и замедляло разработку. Теперь, когда D3D9 убран, разработчики, вместо того, чтобы угождать постоянно растущим требованиям ущербного видеорежима, могут сосредоточить свои усилия на улучшении эмулятора. Именно поэтому он и был убран.

D3D9: изначально проблемный

D3D9 режим Долфина, в основном, славился своей скоростью. Для встроенных видеокарт и видеокарт от AMD он является самым быстрым режимом. Но Direct3D9 – очень старый: он был выпущен в 2001 году и получил свое последнее обновление в 2004 году. Из-за возраста многие современные возможности ему попросту недоступны, возможности, которые нужны Долфину для эмуляции GameCube и Wii. И именно поэтому он был таким быстрым: он просто не эмулировал определенные эффекты. Многие современные функции попросту невозможно реализовать в D3D9 режиме.

  • Line width / point size: Line width и poin tsize – особенности графических процессоров GameCube и Wii. D3D11 и OpenGL могут эмулировать их с помощью геометрических шейдеров, но Direct3D9 совершенно не может этого делать. В D3D9 эти особенности можно обходными путями реализовать с помощью ряда хаков, но это крайне сложно, и результат окажется неточным.
  • Destination Alpha: Destination Alpha – это особенность графического процессора приставки Wii, используемая многими играми, которую не возможно напрямую реализовать в D3D9. Есть лишь один способ решения этой проблемы: отрисовывать объекты дважды (двухпроходная отрисовка). Такой вариант не идеален: он работает во многих играх, но представляет собой весьма огромный кусок программного кода, который занимает много разных файлов и который ломает интерфейсы. В D3D10 и OpenGL библиотеках есть функция, именуемая «dual source blending», с помощью которой разработчики могут реализовать destination alpha напрямую. D3D9 фактически тоже обладает данной функцией, но она не имеет широкой поддержки, и многие драйверы, в которых заявлена поддержка этой особенности, просто-напросто падают, если она задействуется. Из-за этого невозможно ввести определение поддержки этой функции оборудованием.
  • Early_Z-test, или ZCompLoc: ZCompLoc – это особенность приставок GameCube и Wii, позволяющая игре изменять привычный порядок «alphatest-depthtest». D3D11 и OpenGL поддерживают ее благодаря недавним расширениям, но D3D9 не может ее использовать. В D3D9 режиме был использован хак, но он весьма ужасен, и в некоторых играх он все равно не работает. Код хака настолько безобразен, что даже сами разработчики не знают, почему он вообще работает.

Переход в игре Super Mario Sunshine реализован с помощью соединенных линий. В режиме D3D11 он правильно отображается, и нельзя определить, что это ряд линий.

…до тех пор, пока не включишь режим D3D9.

D3D11 и OpenGL корректно эмулируют размер точек.

D3D9 режим любит все «преувеличивать».

ZCompLoc правильно отображается в игре Mario Super Sluggers, в режиме OpenGL.

Даже с хаком проблемы с ZCompLoc остаются. Лучшего на D3D9 добиться нельзя.

Поддерживать режим D3D9 было весьма утомительно. Корни Direct3D9 уходят аж к Direct3D5 – версии DirectX, выпущенной в 1997 году. Он содержит в себе массивы старого кода, из-за которых работа с данным интерфейсом чертовски тяжела. Он старый, запутанный и ужасный. Из-за этого разработчики попросту не хотели работать над ним. И, по мере того, как в D3D9 стали накапливаться отличия от других видеорежимов, в нем начало появляться все больше и больше багов, требующих все большего и большего внимания со стороны программистов. Это крайне убивало разработчиков. Из-за несовместимостей и ограничений Direct3D9, всякая попытка исправить эти баги потребовала бы написания сложных хаков и запутанного кода. Либо же их вообще нельзя было бы исправить.

Более того, режим D3D9 был самым старым режимом в Долфине. D3D11 был написан в 2010 году, а OpenGL – переписан в 2012-2013 годах. А D3D9 видеорежим уходит корнями к закрытым релизам исходного кода в 2004 году. Этот режим все время патчился, нагромождался хаками и получал на орехи. Весь этот старый код только лишь увеличивает масштаб и сложность поддержки режима D3D9.

D3D9: почему другие видеорежимы не лучше?

С тех пор как Долфин избавился от поддержки плагинов в 6996 ревизии, в нем использовался единый видеоинтерфейс. Такой подход значительно уменьшает количество ненужного кода в эмуляторе, и упрощает добавление новых особенностей. К сожалению, это так же означает, что любое изменение в каком-то одном видеорежиме затронет и остальные. Благодаря несовместимостям Direct3D9, новые функциональные возможности, добавленные в OpenGL и D3D11 режимы, непременно ломали режим D3D9.  После этого писались хаки и обходились ограничения, либо разработчики попросту забивали на D3D9 и оставляли его «поломанным». Но что еще хуже, некоторые возможности нельзя добавить только потому, что они полностью сломают D3D9. Эти возможности улучшат как точность, так и скорость эмуляции Долфина. Благодаря удалению режима D3D9, стали возможны следующие функциональные возможности:

  • TEV: самая важная часть пиксельного конвейера WiiTEV (Texture EnVironment – текстурная среда). Если она неправильно эмулируется, то во многих играх появляются неправильные цвета или отсутствующая графика. В частности, большая часть вычислений TEV основывается на целых числах. Графические процессы традиционно проводили вычисления с помощью плавающей запятой, и лишь недавно была добавлена поддержка продвинутых вычислений с целыми числами. D3D9 не поддерживает многие функции, использующиеся в TEV, и поэтому приходилось эмулировать вычисления с целыми числами с помощью плавающей запятой. Этого вполне хватало для простых случаев, но данный метод медленен и не всегда работает (см. проблемы на GoogleCode под номерами 2098, 5325, 6683, 4570, 6442, 540, и это лишь малая часть), а в более сложных случаях он вообще не работает (например, эмуляция 24-х разрядного числа со знаком (signed 24 bit integer emulation)). Direct3D 10.0 и OpenGL 3 изначально работают с целыми числами, но, чтобы реализовать целочислительные шейдеры, потребуется полностью переписать шейдерные генераторы, а это поломает D3D9.
  • Transform Feedback: загрузка вершин – узкое место отрисовочного конвеера Долфина, но ее можно значительно улучшить с помощью transform feedback, который не используется в Долфине потому, что D3D9 его не поддерживает.
  • Вычислительные шейдеры: текстурное декодирование в Долфине можно возложить на вычислительные шейдеры графического процессора, что даст неплохое ускорение. Но в D3D9 это не возможно. В нем нет поддержки вычислительных шейдеров, а обыкновенный шейдерный конвеер с набором инструкций D3D9 бесполезен.
  • Огромное количество специальных оптимизаций под Direct3D11 и OpenGL блокируются старым набором инструкций D3D9. Несмотря на то, что многие из них могут быть реализованы без удаления режима D3D9, это потребует слишком много работы от программистов. После удаления началась работа над многими такими функциональными возможностями, благодаря уменьшившейся сложности.

TEV правильно работает на экспериментальной ревизии эмулятора.

В данный момент, на последних мастер-ревизиях TEV сломан. Это проявляется в виде глюков, вроде этого, в ряде игр. Если бы поддержка режима D3D9 продолжалась, эти проблемы нельзя было бы исправить.

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

Многие думают, что удаление режима D3D9 приведет к тому, что Долфин станет несовместим с Windows XP. Это не так: Windows XP полностью поддерживает библиотеку OpenGL 3.3. Режим OpenGL и дальше будет работать на Windows XP. Но действительность такова, что разработчики не обязаны поддерживать операционную систему, чей возраст насчитывает двенадцать лет. Если старая ОС значительно сдерживает прогресс Долфина, то тогда ее поддержка должна быть прекращена. Самая старая версия ОС Mac OS X, которую сейчас поддерживает Долфин, вышла лишь два года назад!

Более того, режим D3D11 будет работать на любой видеокарте, которая поддерживает DirectХ10. То есть, видеокарты серии Geforce GTX 8xxx и Radeon 2xxx или новее, могут использовать режим D3D11.

На будущее

В конечном счете, именно разработчики поддерживают эмулятор. Они тратят кучу собственного времени, чтобы поддерживать и улучшать Долфин. Они весьма ограничены в возможностях. Избавление от D3D9 сделает Долфин лучше, исправит баги и даст улучшение в скорости эмулирования. Но что самое главное, оно облегчит программистам разработку Долфина на многие годы вперед.

Источник: https://ru.dolphin-emu.org/blog/2013/10/12/d3d9-why-its-not-part-dolphins-future/
0

Комментарии 9

  1. Kuro
    Kuro от 26 октября 2013 17:09
    Отличная статья, с удовольствием прочитал) Хотелось бы, чтобы это было не только на словах и разрабы начали более усиленно работать над эмулятором.
  2. Miha_xXx
    Miha_xXx от 26 октября 2013 23:11
    Молодцы, А зачем вообще нужна поддержка D3D? Из 4-х платформ он используется только на одной, так почему бы не сфокусироваться на OGL, забросив D3D?
  3. OilRush
    OilRush от 27 октября 2013 00:00
    И да, в DirectX9 невозможно было реализовать zfreeze. Для OpenGL 3.x и выше уже реализован, в DirectX11 добавят позже. В общем, решение разумное. На костылях далеко не уедешь.
  4. clan
    clan от 30 октября 2013 00:30
    У меня видюшка с dx10 с 2008г., а в 2014  куплю другую(D3D11 работает).
    А по поводу XP - то microsoft уже объявляла что заканчивает поддержку XP окончательно(т.е. если остаться на этой ОС то у вас хакеры все своруют; это особенно критично для бизнеса).

    Желаю успехов в улучшении этого продукта, а также чтобы требования к железу постепенно уменьшались.
  5. =[BFG]=
    =[BFG]= от 31 октября 2013 18:47
    Спасибо за статью, очень интересно!
    Возможно, поздновато, но signed 24-bit integer - это не "подписанное" 24-битное число, а попросту число со знаком. Как студент-программист говорю smile
  6. Miron
    Miron от 14 января 2014 16:10
    Ура товарищи!!! Даешь прогресс!!!
Добавить комментарий

Оставить комментарий