Доступен Vcc, C/C++ компилятор для Vulkan

После трёх лет разработки представлен исследовательский проект Vcc (Vulkan Clang Compiler), нацеленный на создание компилятора, способного транслировать код на языке С++ в представление, выполняемое на GPU, поддерживающих графический API Vulkan. В отличие от моделей программирования GPU на базе языков шейдеров GLSL и HLSL в Vcc развивается идея полного отказа от использования отдельных языков шейдеров и предоставляется возможность прямой компиляции кода C/C++ для Vulkan. Наработки проекта распространяются под лицензией MIT.

Для компиляции кода задействованы компоненты проекта LLVM и Clang в качестве фронтэнда. Для выполнения на GPU развивается собственное промежуточное представление шейдеров Shady и компилятор для преобразования кода в это представление. По возможности поддерживается компиляция обычного стандартного кода C/C++, а для поддержки специфичных для GPU возможностей предоставляется несколько дополнительных встроенных функций.

В Vcc применяются штатные возможности C/C++ для управления ходом выполнения программы, включая возможность использования оператора «goto». Допускается вызов функций, рекурсивное выполнение функций, использование физических указателей, теггированных указателей и указателей на функции, выполнение арифметических операций над указателями, а также определение раскладки типов в памяти.

Для достижения поддержки возможностей C/C++, таких как функции и указатели, промежуточное представление Shady расширено поддержкой специальных конструкций. В общем виде Shady базируется на промежуточном представлении SPIR-V 3 и использует эмуляцию для реализации расширенных возможностей, которые напрямую невозможно реализовать поверх SPIR-V. Для использования в программах специфичных для шейдеров возможностей предлагаются встроенные функции и аннотации.


   #include ‹shady.h›

   descriptor_set(0) descriptor_binding(1) uniform sampler2D texSampler;

   location(0) input vec3 vertexColor;
   location(1) input vec2 texCoord;

   location(0) output vec4 outColor;

   fragment_shader void main() {
       vec4 fragColor;
       fragColor.xyz = vertexColor;
       fragColor.w = 1.0f;
       outColor = texture2D(texSampler, texCoord) * fragColor;
   }

Для работы требуется GPU с поддержкой Vulkan 1.1, расширения VK_KHR_buffer_device_address и типов Int8, Int16 и Int64. Vcc совместим с Vulkan-драйверами radv (AMD Mesa), amdvlk (AMD), nvk (NVIDIA), anv (Intel Mesa) и проприетарными драйвеами AMD, Intel Arc и NVIDIA. Из ограничений реализации упоминается отсутствие поддержки исключений C++, недоступность функций malloc/free и непереносимость функций и указателей между хост-системой и GPU.

Источник: http://www.opennet.ru/opennews/art.shtml?num=60413