ДоступСн 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.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: opennet.ru