En el panorama de las API de gráficos, los lenguajes de sombreado han enfrentado una limitación, pues a pesar de la posibilidad de escribir código en un subconjunto común entre GLSL, HLSL y C++, las restricciones actuales estas presentes.
Es por ello que nace Vcc (Vulkan Clang Compiler) el compilador Vulkan Clang, el cúal es un proyecto que estuvo en desarrollo durante 3 años, surge como una respuesta a estas limitaciones y desafíos. Este proyecto busca no solo superar las restricciones expresivas, sino eliminar el concepto mismo de lenguajes de sombreado.
Al incorporar la familia completa de lenguajes C/C++ a Vulkan, Vcc introduce características nunca antes vistas en los sombreadores de Vulkan, como punteros físicos, punteros genéricos, llamadas a funciones reales y un completo flujo de control.
Esta iniciativa busca cerrar la brecha de software entre las API de gráficos y de computación. Al hacer que Vulkan sea compatible con otras API de computación de GPU, Vcc se presenta como un paso importante hacia la unificación de la programación en gráficos y computación, alineándose con la adopción masiva y la calidad de implementación que caracterizan a Vulkan.
Sobre VCC
Vcc es un compilador basado en Clang diseñado para generar código ejecutable en Vulkan, tiene como objetivo, el posicionarse como un compilador capaz de traducir código C++ en una representación que pueda ejecutarse en GPU que soporten la API de gráficos Vulkan. A diferencia de los modelos de programación de GPU basados en los lenguajes de sombreado GLSL y HLSL, Vcc toma la idea de eliminar por completo el uso de lenguajes de sombreado separados y brinda la capacidad de compilar directamente código C/C++ para Vulkan.
Aunque podría considerarse un competidor de GLSL y HLSL, la verdadera intención detrás de este proyecto va más allá, pues Vcc busca incorporar la familia de lenguajes C/C++ a Vulkan, presentando una serie de características en los sombreadores de Vulkan.
Vcc es simplemente una interfaz para Shady, un IR y un compilador diseñado para ampliar SPIR-V con soporte para las construcciones antes mencionadas. Shady se presenta como un IR relativamente convencional e incluye soporte para analizar LLVM IR. Maneja la reducción y emulación de todas las funciones adicionales que no se encuentran en las versiones actuales de SPIR-V 3 .
Por supuesto, hay una serie de características únicas que sólo se encuentran en los sombreadores. Estos se exponen en Vcc mediante intrínsecos y anotaciones, lo que permite escribir código que interactúe con las diversas características del canal Vulkan.
El proceso de compilación en Vcc implica la utilización de los componentes del proyecto LLVM y Clang como interfaz. Para su ejecución en la GPU, Vcc desarrolla su propia representación de sombreador intermedia «Shady», junto con un compilador dedicado para convertir el código a esta representación. Este enfoque permite la compilación de código C/C++ estándar y se complementa con funciones integradas específicas para aprovechar las capacidades de la GPU.
Vcc destaca por admitir funciones nativas de C/C++ para controlar el flujo del programa, incluso permitiendo el uso de la instrucción «goto». Asimismo, proporciona la capacidad de llamar funciones, ejecutar funciones de manera recursiva y utilizar diversos tipos de punteros, como punteros físicos, punteros etiquetados y punteros de función. Además, se facilita la realización de operaciones aritméticas en punteros y la determinación de diseños de tipos en la memoria.
La representación intermedia de sombreador Shady se basa en SPIR-V 3 y se expande para admitir construcciones especiales que son inherentes a las características de C/C++. La emulación se utiliza para implementar capacidades avanzadas que no son directamente aplicables a SPIR-V. Vcc incluye funciones y anotaciones integradas para permitir que los programas utilicen de manera eficiente las capacidades específicas de los sombreadores, proporcionando así un entorno versátil y potente para el desarrollo de aplicaciones GPU.
Finalmente, cabe mencionar que no todo es color de rosa y es esencial tener en cuenta algunas limitaciones de la implementación. Por ejemplo, Vcc no admite excepciones de C++, y la funcionalidad de malloc/free no está disponible. Además, existe una restricción en la portabilidad de funciones y punteros entre el sistema host y la GPU. Estas consideraciones son cruciales al planificar el desarrollo de aplicaciones que utilicen Vcc para garantizar una implementación eficaz y libre de problemas.
Si estás interesado en poder conocer más al respecto, puedes consular el sitio web y para los interesados en el código, deben saber que está disponible aquí.