Для компиляции кода задействованы компоненты проекта 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
