SPIR-V (Standard Portable Intermediate Representation V)는 Vulkan의 Shader 언어다.

 

목차

     

     


     

     


    인프런 삼각형님의 '삼각형의 실전! Vulkan 중급' 강의를 참고하였습니다. 

    😎 [삼각형의 실전! Vulkan 중급] 강의 들으러 가기!

     

     

     

     

    SPIR-V


     

     

    SPIR-V란?

     

    SPIR는 Standard Portable Intermediate Representation의 약어다. SPIR-V는 SPIR로부터 파생되었다.

    SPIR-V는 Vulkan의 Shader 언어다.

     

     

    SPIR-V가 Vulkan과 OpenCL에서 사용되기 시작하면서 그래픽스와 컴퓨팅 생태계의 모습이 근본적으로 변하게 될 것입니다. 특히 다양한 언어를 개발자들이 사용할 수 있기 때문입니다. 또한 벤더들은 드라이버 개발과 최적화에 집중을 할 수 있게 되었습니다.

    - by Neil Trevett 

     

     

     

     

    다양한 언어가 SPIR로 컴파일되고 컴파일된 SPIR는 다양한 API에서 작동한다. 또한 SPIR는 LLVM을 기반이기 때문에  LLVM의 다양한 최적화 패스를 손쉽게 적용할 수 있다.

     

    이러한 SPIR의 장점 덕분에 개발자들은 새로운 언어를 배우는데 시간을 소비하지 않고 코드 작성에 더 집중할 수 있다. 또한 Vendor들은 다양한 언어 복잡성을 관리하는 대신 코드 최적화에 더욱 집중할 수 있다. 

     

     

    SPIR-V 예시


     

     

    shaderc 빌드

     

    Vulkan Shader를 SPIR-V로 컴파일하기 위해 구글의 shaderc 라이브러리를 사용.

     

     

    https://developer.android.com/ndk/guides/graphics/shader-compilers?hl=ko

     

    Android의 Vulkan 셰이더 컴파일러  |  Android NDK  |  Android Developers

    이 페이지는 Cloud Translation API를 통해 번역되었습니다. Android의 Vulkan 셰이더 컴파일러 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. Vulkan 앱은 OpenGL ES 앱과

    developer.android.com

     


     

     

    shaderc 사용법

     


     

     

    코드

     

    ShadercTest.kt 생성

    더보기
    package com.inflearn.practicevulkan
    import androidx.test.ext.junitgtest.GtestRunner
    import androidx.test.ext.junitgtest.TargetLibrary
    import org.junit.runner.RunWith
    @RunWith(GtestRunner::class)
    @TargetLibrary(libraryName = "shaderctest")
    class ShadercTest

     

     

    build.gradle.kts 수정

    더보기
    plugins {
    id("com.android.application")
    id("org.jetbrains.kotlin.android")
    }
    android {
    namespace = "com.inflearn.practicevulkan"
    compileSdk = 34
    defaultConfig {
    applicationId = "com.inflearn.practicevulkan"
    minSdk = 33
    targetSdk = 34
    versionCode = 1
    versionName = "1.0"
    testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
    externalNativeBuild {
    cmake {
    cppFlags += "-std=c++17"
    }
    }
    }
    buildTypes {
    release {
    isMinifyEnabled = false
    proguardFiles(
    getDefaultProguardFile("proguard-android-optimize.txt"),
    "proguard-rules.pro"
    )
    }
    }
    compileOptions {
    sourceCompatibility = JavaVersion.VERSION_1_8
    targetCompatibility = JavaVersion.VERSION_1_8
    }
    kotlinOptions {
    jvmTarget = "1.8"
    }
    buildFeatures {
    prefab = true
    }
    externalNativeBuild {
    cmake {
    path = file("src/main/cpp/CMakeLists.txt")
    version = "3.22.1"
    }
    }
    }
    dependencies {
    implementation("androidx.core:core-ktx:1.13.0")
    implementation("androidx.appcompat:appcompat:1.6.1")
    implementation("com.google.android.material:material:1.11.0")
    implementation("androidx.games:games-activity:1.2.2")
    implementation("androidx.test.ext:junit-gtest:1.0.0-alpha02")
    implementation("com.android.ndk.thirdparty:googletest:1.11.0-beta-1")
    testImplementation("junit:junit:4.13.2")
    androidTestImplementation("androidx.test.ext:junit:1.1.5")
    androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1")
    }

    코드 추가

     


    ShaderTest.cpp
     생성

    더보기
    #include <sstream>
    #include <string>
    #include <string_view>
    #include <gtest/gtest.h>
    #include <shaderc/shaderc.hpp>
    TEST(shaderc, compile) {
    constexpr std::string_view code{
    "#version 310 es\n"
    "void main() {"
    "}"
    };
    shaderc::Compiler compiler;
    shaderc::CompileOptions options;
    auto result = compiler.CompileGlslToSpvAssembly(
    code.data(), code.size(), shaderc_vertex_shader, "test", options);
    EXPECT_EQ(result.GetCompilationStatus(), shaderc_compilation_status_success);
    std::string spv(result.cbegin(), result.cend());
    std::istringstream iss(spv);
    std::string header;
    std::getline(iss, header);
    EXPECT_EQ(header, "; SPIR-V");
    }

     

     

    CMakeLists.txt 수정

    더보기
    # For more information about using CMake with Android Studio, read the
    # documentation: https://d.android.com/studio/projects/add-native-code.html
    cmake_minimum_required(VERSION 3.22.1)
    project("practicevulkan")
    ####################################################################################################
    # shaderc 정의
    ####################################################################################################
    set(CMAKE_SHADERRC ${CMAKE_ANDROID_NDK}/sources/third_party/shaderc)
    add_library(shaderc INTERFACE)
    target_include_directories(shaderc INTERFACE
    ${CMAKE_SHADERRC}/include)
    target_link_libraries(shaderc INTERFACE
    ${CMAKE_SHADERRC}/libs/system/${CMAKE_ANDROID_ARCH_ABI}/libshaderc.a)
    ####################################################################################################
    # practicevulkan 정의
    ####################################################################################################
    find_package(game-activity REQUIRED CONFIG)
    find_package(Vulkan REQUIRED)
    add_library(practicevulkan SHARED
    VkRenderer.h
    VkRenderer.cpp
    VkUtil.h
    main.cpp
    AndroidOut.cpp)
    target_compile_definitions(practicevulkan PRIVATE
    VK_USE_PLATFORM_ANDROID_KHR)
    target_link_libraries(practicevulkan
    game-activity::game-activity
    android
    log
    Vulkan::Vulkan
    shaderc)
    ####################################################################################################
    # shaderctest 정의
    ####################################################################################################
    find_package(googletest REQUIRED CONFIG)
    find_package(junit-gtest REQUIRED CONFIG)
    add_library(shaderctest SHARED
    ShadercTest.cpp)
    target_link_libraries(shaderctest PRIVATE
    googletest::gtest
    junit-gtest::junit-gtest
    shaderc)

     

    '⭐ Vulkan & CMake > Vulkan' 카테고리의 다른 글

    [Vulkan] Vulkan Shader module  (0) 2024.09.10
    [Vulkan] VKSL 주의사항  (0) 2024.09.10
    [Vulkan] Hello fast clear  (0) 2024.09.10
    [Vulkan] Vulkan Framebuffer  (0) 2024.09.10
    [Vulkan] Vulkan Render pass  (0) 2024.08.16