Advertisement
Guest User

Compile GLSL to SPIRV

a guest
May 20th, 2019
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.40 KB | None | 0 0
  1.                 std::vector<uint32_t> RenderManager::compileShaderStage(ShaderFile& shaderFile, ShaderStage const& stage)
  2.                 {
  3.                     std::string filePath = (stage == Vertex ? shaderFile.vertexFilePath.get() : shaderFile.fragmentFilePath.get());
  4.                     std::string fileString = shaderFile.getFileData(stage);
  5.                     const char* file = fileString.c_str();
  6.  
  7.                     //Setup shader
  8.                     EShLanguage type = EShLangVertex;
  9.                     glslang::TShader shader(type);
  10.                     shader.setStrings(&file, 1);
  11.  
  12.                     //Set vulkan specific settings
  13.                     int clientInputSemanticsVersion = 450;
  14.                     glslang::EShTargetClientVersion vulkanClientVersion = glslang::EShTargetVulkan_1_0;
  15.                     glslang::EShTargetLanguageVersion targetVersion = glslang::EShTargetSpv_1_0;
  16.                     shader.setEnvInput(glslang::EShSourceGlsl, type, glslang::EShClientVulkan, clientInputSemanticsVersion);
  17.                     shader.setEnvClient(glslang::EShClientVulkan, vulkanClientVersion);
  18.                     shader.setEnvTarget(glslang::EShTargetSpv, targetVersion);
  19.  
  20.                     TBuiltInResource resources = {};
  21.                     resources.limits.generalVariableIndexing = true;
  22.                     resources.limits.whileLoops = true;
  23.  
  24.                     auto messages = static_cast<EShMessages>(EShMsgSpvRules | EShMsgVulkanRules);
  25.  
  26.                     const int defaultVersion = 450;
  27.  
  28.                     DirStackFileIncluder includer; //Default, no include files supported for now.
  29.  
  30.                     //Preprocess shader
  31.                     std::string preprocessedGLSL;
  32.                     if (!shader.preprocess(&resources, defaultVersion, EEsProfile, false, false, messages, &preprocessedGLSL, includer))
  33.                     {
  34.                         Misc::Console::warning("GLSL Preprocessing Failed for: " + filePath);
  35.                         Misc::Console::warning(shader.getInfoLog());
  36.                         Misc::Console::warning(shader.getInfoDebugLog());
  37.  
  38.                         return {};
  39.                     }
  40.                     Misc::Console::write("Successfully preprocessed shader " + filePath);
  41.  
  42.                     //Parse shader
  43.                     const char* preprocessedStr = preprocessedGLSL.c_str();
  44.                     shader.setStrings(&preprocessedStr, 1);
  45.                     if (!shader.parse(&resources, defaultVersion, EEsProfile, false, false, messages))
  46.                     {
  47.                         Misc::Console::warning("GLSL Parsing Failed for: " + filePath);
  48.                         Misc::Console::warning(shader.getInfoLog());
  49.                         Misc::Console::warning(shader.getInfoDebugLog());
  50.  
  51.                         return {};
  52.                     }
  53.                     Misc::Console::write("Successfully parsed shader " + filePath);
  54.  
  55.                     //Link program
  56.                     glslang::TProgram program;
  57.                     program.addShader(&shader);
  58.                     if (!program.link(messages))
  59.                     {
  60.                         Misc::Console::warning("GLSL Linking Failed for: " + filePath);
  61.                         Misc::Console::warning(shader.getInfoLog());
  62.                         Misc::Console::warning(shader.getInfoDebugLog());
  63.  
  64.                         return {};
  65.                     }
  66.                     Misc::Console::write("Successfully linked shader " + filePath);
  67.  
  68.                     //Compile into SPIRV
  69.                     std::vector<uint32_t> spirV;
  70.                     spv::SpvBuildLogger logger;
  71.                     glslang::SpvOptions spvOptions;
  72. #ifdef TRISTEON_LOGENABLED
  73.                     spvOptions.validate = true;
  74.                     spvOptions.generateDebugInfo = true;
  75.                     spvOptions.disableOptimizer = true;
  76.                     spvOptions.optimizeSize = false;
  77. #else
  78.                     spvOptions.validate = false;
  79.                     spvOptions.generateDebugInfo = false;
  80.                     spvOptions.disableOptimizer = false;
  81.                     spvOptions.optimizeSize = true;
  82. #endif
  83.                     glslang::GlslangToSpv(*program.getIntermediate(type), spirV, &logger, &spvOptions);
  84.  
  85.                     Misc::Console::write("Finished compilation of " + filePath + ". Compiler messages: { " + logger.getAllMessages() + " }");
  86.                     return spirV;
  87.                 }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement