Компания Collabora новият Gallium драйвер за Mesa, реализиращ слой за работа с API OpenCL 1.2 и OpenGL 3.3 върху драйвери, поддържащи DirectX 12 (D3D12). Код под лиценз MIT.
Предложеният драйвер позволява използването на Mesa на устройства, които първоначално не поддържат OpenCL и OpenGL, както и служи като стартова позиция за портване на приложения OpenGL/OpenCL за работа върху D3D12. За производителите на GPU подсистемата предоставя възможност за осигуряване на поддръжка за OpenCL и OpenGL, при наличие на драйвери с поддръжка само на D3D12.
От близките планове се отбелязва постигането на пълно преминаване на тестовете за съвместимост с OpenCL 1.2 и OpenGL 3.3, проверка на съвместимостта с приложения и включване на разработки в основния състав на Mesa. Развитието се извършва съвместно с инженерите на Microsoft, които развиват инструментариум за пренос на игри от D3D11 на D3D12 и библиотеката , реализираща стандартни графични примитиви върху D3D12.
Реализацията включва Gallium драйвер, компилатор OpenCL, OpenCL runtime и компилатор на шейдъри NIR-to-DXIL, преобразуващ използваното в Mesa междинно представяне на шейдъри NIR в бинарен формат DXIL (DirectX Intermediate Language), поддържан в DirectX 12 и базиран на биткод LLVM 3.7 ( от Microsoft, всъщност разширен форк на LLVM 3.7). Компилаторът OpenCL е подготвен на базата на разработки от проекта LLVM и инструментария .
Изходният код с разширения OpenCL се компилира с помощта на clang в междинен псевдокод LLVM (LLVM IR), който след това се преобразува в междинно представяне на OpenCL ядра във формат SPIR-V. Ядрата в представянето SPIR-V се предават на Mesa, трансформират се в формат NIR, оптимизират се и се предават в NIR-to-DXIL за генериране на изчислителни шейдъри във формат DXIL, подходящ за изпълнение на GPU с използване на runtime на базата на DirectX 12.
Вместо Clover, използвана в Mesa реализация на OpenCL, е предложен нов OpenCL runtime, допускащ повече директни преобразувания в API DirectX 12.
OpenCL и OpenGL драйверите са подготвени с помощта на предоставения в Mesa интерфейс Gallium, позволяващ при създаването на драйвери да не се задълбочаваме в специфични за OpenGL детайли и да трансформираме извикванията на OpenGL в същности, по-близки до графичните примитиви, с които оперират съвременните GPU. Gallium-драйверът приема команди на OpenGL и при взаимодействие с транслатора NIR-to-DXIL.
създава команди буфери, които се изпълняват на GPU, използвайки D3D12 драйвер.
Източник: opennet.ru
