Compile GLSL to SPIR-V using shaderc.
590{
591#ifdef MAYAFLUX_USE_SHADERC
592 shaderc::Compiler compiler;
593 shaderc::CompileOptions options;
594
595 options.SetOptimizationLevel(shaderc_optimization_level_performance);
596
597 for (const auto& dir : include_directories) {
598
599 }
600
601 for (const auto& [name, value] : defines) {
602 options.AddMacroDefinition(name, value);
603 }
604
605 shaderc_shader_kind shader_kind;
606 switch (stage) {
607 case vk::ShaderStageFlagBits::eVertex:
608 shader_kind = shaderc_glsl_vertex_shader;
609 break;
610 case vk::ShaderStageFlagBits::eFragment:
611 shader_kind = shaderc_glsl_fragment_shader;
612 break;
613 case vk::ShaderStageFlagBits::eCompute:
614 shader_kind = shaderc_glsl_compute_shader;
615 break;
616 case vk::ShaderStageFlagBits::eGeometry:
617 shader_kind = shaderc_glsl_geometry_shader;
618 break;
619 case vk::ShaderStageFlagBits::eTessellationControl:
620 shader_kind = shaderc_glsl_tess_control_shader;
621 break;
622 case vk::ShaderStageFlagBits::eTessellationEvaluation:
623 shader_kind = shaderc_glsl_tess_evaluation_shader;
624 break;
625 default:
627 "Unsupported shader stage for GLSL compilation: {}", vk::to_string(stage));
628 return {};
629 }
630
631 shaderc::SpvCompilationResult result = compiler.CompileGlslToSpv(
632 glsl_source,
633 shader_kind,
634 "shader.glsl",
635 options);
636
637 if (result.GetCompilationStatus() != shaderc_compilation_status_success) {
639 "GLSL compilation failed:\n{}", result.GetErrorMessage());
640 return {};
641 }
642
643 std::vector<uint32_t> spirv(result.cbegin(), result.cend());
644
646 "Compiled GLSL ({} stage) -> {} bytes SPIR-V",
647 vk::to_string(stage), spirv.size() * 4);
648
649 return spirv;
650
651#else
653#endif
654}
#define MF_ERROR(comp, ctx,...)
#define MF_DEBUG(comp, ctx,...)
static std::vector< uint32_t > compile_glsl_to_spirv_external(const std::string &glsl_source, vk::ShaderStageFlagBits stage, const std::vector< std::string > &include_directories={}, const std::unordered_map< std::string, std::string > &defines={})
@ GraphicsBackend
Graphics/visual rendering backend (Vulkan, OpenGL)
@ Core
Core engine, backend, subsystems.