MayaFlux 1.0.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches

◆ compile_glsl_to_spirv()

std::vector< uint32_t > MayaFlux::Core::VKShaderModule::compile_glsl_to_spirv ( const std::string &  glsl_source,
vk::ShaderStageFlagBits  stage,
const std::vector< std::string > &  include_directories,
const std::unordered_map< std::string, std::string > &  defines 
)
private

Compile GLSL to SPIR-V using shaderc.

Parameters
glsl_sourceGLSL source code
stageShader stage (affects compiler settings)
include_directoriesInclude paths
definesPreprocessor macros
Returns
SPIR-V bytecode, or empty vector on failure

Definition at line 782 of file VKShaderModule.cpp.

787{
788 shaderc::Compiler compiler;
789 shaderc::CompileOptions options;
790
791 options.SetTargetEnvironment(shaderc_target_env_vulkan, shaderc_env_version_vulkan_1_3);
792 options.SetTargetSpirv(shaderc_spirv_version_1_6);
793 options.SetOptimizationLevel(shaderc_optimization_level_performance);
794 options.SetIncluder(std::make_unique<FileIncluder>(include_directories));
795
796 for (const auto& [name, value] : defines) {
797 options.AddMacroDefinition(name, value);
798 }
799
800 shaderc_shader_kind shader_kind;
801 switch (stage) {
802 case vk::ShaderStageFlagBits::eVertex:
803 shader_kind = shaderc_glsl_vertex_shader;
804 break;
805 case vk::ShaderStageFlagBits::eFragment:
806 shader_kind = shaderc_glsl_fragment_shader;
807 break;
808 case vk::ShaderStageFlagBits::eCompute:
809 shader_kind = shaderc_glsl_compute_shader;
810 break;
811 case vk::ShaderStageFlagBits::eGeometry:
812 shader_kind = shaderc_glsl_geometry_shader;
813 break;
814 case vk::ShaderStageFlagBits::eTessellationControl:
815 shader_kind = shaderc_glsl_tess_control_shader;
816 break;
817 case vk::ShaderStageFlagBits::eTessellationEvaluation:
818 shader_kind = shaderc_glsl_tess_evaluation_shader;
819 break;
820 case vk::ShaderStageFlagBits::eMeshEXT:
821 shader_kind = shaderc_glsl_mesh_shader;
822 break;
823 case vk::ShaderStageFlagBits::eTaskEXT:
824 shader_kind = shaderc_glsl_task_shader;
825 break;
826 default:
828 "Unsupported shader stage for GLSL compilation: {}", vk::to_string(stage));
829 return {};
830 }
831
832 shaderc::SpvCompilationResult result = compiler.CompileGlslToSpv(
833 glsl_source,
834 shader_kind,
835 "shader.glsl",
836 options);
837
838 if (result.GetCompilationStatus() != shaderc_compilation_status_success) {
840 "GLSL compilation failed:\n{}", result.GetErrorMessage());
841 return {};
842 }
843
844 std::vector<uint32_t> spirv(result.cbegin(), result.cend());
845
847 "Compiled GLSL ({} stage) -> {} bytes SPIR-V",
848 vk::to_string(stage), spirv.size() * 4);
849
850 return spirv;
851}
#define MF_ERROR(comp, ctx,...)
#define MF_DEBUG(comp, ctx,...)
glm::vec3 value
std::string name
Definition VKDevice.cpp:123
@ GraphicsBackend
Graphics/visual rendering backend (Vulkan, OpenGL)
@ Core
Core engine, backend, subsystems.

References MayaFlux::Journal::Core, MayaFlux::Journal::GraphicsBackend, MF_DEBUG, MF_ERROR, name, and value.

Referenced by create_from_glsl().

+ Here is the caller graph for this function: