После трёх лет разработки представлен исследовательский проект 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. Для использования в программах специфичных для шейдеров возможностей предлагаются встроенные функции и аннотации.
Для работы требуется 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.