DirectX backend в LLVM получил статус официально поддерживаемой архитектурной цели

В LLVM завершён перевод DirectX backend из экспериментального в официальный статус. Соответствующий pull request #214066 был влит в основную ветку llvm-project 31 августа. DirectX перенесён из LLVM_ALL_EXPERIMENTAL_TARGETS в обычный LLVM_ALL_TARGETS, поэтому теперь backend будет собираться по умолчанию вместе с другими штатными целями LLVM.
Ранее для его включения требовалось явно добавлять DirectX через CMake-параметр LLVM_EXPERIMENTAL_TARGETS_TO_BUILD. В принятом изменении DirectX добавлен в стандартный список targets и удалён из экспериментального.
Речь идёт не о реализации Direct3D или графическом драйвере. DirectX backend преобразует LLVM IR в DXIL — DirectX Intermediate Language, используемый DirectX 12 для представления скомпилированных шейдеров. Согласно документации LLVM, DXIL основан на bitcode старого LLVM 3.7, дополненного специфичными для DirectX операциями, ограничениями и метаданными. Результат помещается в контейнер DXContainer, содержащий DXIL и дополнительную информацию о шейдере.
Одновременно с повышением статуса backend поддержка HLSL и clang-dxc включается при сборке Clang по умолчанию. Отдельный переключатель CLANG_ENABLE_HLSL удалён. clang-dxc фактически запускает Clang в режиме --driver-mode=dxc, предоставляя интерфейс командной строки, ориентированный на совместимость с Microsoft DirectX Shader Compiler. (изменение в LLVM)
Долгосрочная цель проекта ещё масштабнее. В документации HLSL в Clang разработчики заявляют о намерении сделать Clang заменой DXC во всех поддерживаемых сценариях, сохранив совместимость с существующим HLSL-кодом. При этом HLSL toolchain не ограничивается DirectX: предусмотрена генерация как DXIL, так и SPIR-V, используемого в Vulkan.
Работа над DirectX backend в основном дереве LLVM ведётся примерно четыре года. 4 августа инженер Microsoft Farzon Lotfi опубликовал RFC с предложением перевести его в официальный статус. Разработчики посчитали backend достаточно зрелым с точки зрения архитектуры, стабильности, тестирования и наличия сопровождающих. В качестве наиболее готового сценария сейчас называется компиляция compute shaders.
Официальный статус имеет практическое значение и для самого LLVM. Experimental backend не обязан собираться по умолчанию, а его поломки в первую очередь исправляют собственные сопровождающие. Штатный target становится частью обычной сборочной и тестовой инфраструктуры LLVM и должен оставаться работоспособным при изменениях общих компонентов проекта.
Особенность DirectX backend — необходимость преобразовывать современный LLVM IR в формат, совместимый с LLVM 3.7. Этот вопрос отдельно обсуждался при рассмотрении RFC. Разработчики решили изолировать такую совместимость внутри backend: специальные проходы адаптируют IR к требованиям DXIL, а ограничения старого формата не должны мешать развитию современного LLVM. (обсуждение RFC)
Например, стадия DXILPrepare преобразует конструкции, которые нельзя непосредственно представить в DXIL, а DXILOpLowering заменяет LLVM intrinsics операциями DirectX. После этого DXILTranslateMetadata формирует требуемые метаданные. Архитектура этой цепочки описана в документации LLVM.
Получение официального статуса пока не означает полной готовности замены DXC. Наиболее зрелым направлением остаются compute shaders, тогда как поддержка полного набора графических стадий, ray tracing и новых Shader Model продолжает развиваться. Сам backend первоначально ориентирован на DirectX 12; поддержку DirectX 11 разработчики планируют расширять позднее. (DirectX Usage)
>>> Источник
