MayaFlux 0.1.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 485 of file VKShaderModule.cpp.

490{
491#ifdef MAYAFLUX_USE_SHADERC
492 shaderc::Compiler compiler;
493 shaderc::CompileOptions options;
494
495 options.SetOptimizationLevel(shaderc_optimization_level_performance);
496
497 for (const auto& dir : include_directories) {
498 // options.AddIncludeDirectory(dir);
499 }
500
501 for (const auto& [name, value] : defines) {
502 options.AddMacroDefinition(name, value);
503 }
504
505 shaderc_shader_kind shader_kind;
506 switch (stage) {
507 case vk::ShaderStageFlagBits::eVertex:
508 shader_kind = shaderc_glsl_vertex_shader;
509 break;
510 case vk::ShaderStageFlagBits::eFragment:
511 shader_kind = shaderc_glsl_fragment_shader;
512 break;
513 case vk::ShaderStageFlagBits::eCompute:
514 shader_kind = shaderc_glsl_compute_shader;
515 break;
516 case vk::ShaderStageFlagBits::eGeometry:
517 shader_kind = shaderc_glsl_geometry_shader;
518 break;
519 case vk::ShaderStageFlagBits::eTessellationControl:
520 shader_kind = shaderc_glsl_tess_control_shader;
521 break;
522 case vk::ShaderStageFlagBits::eTessellationEvaluation:
523 shader_kind = shaderc_glsl_tess_evaluation_shader;
524 break;
525 default:
527 "Unsupported shader stage for GLSL compilation: {}", vk::to_string(stage));
528 return {};
529 }
530
531 shaderc::SpvCompilationResult result = compiler.CompileGlslToSpv(
532 glsl_source,
533 shader_kind,
534 "shader.glsl",
535 options);
536
537 if (result.GetCompilationStatus() != shaderc_compilation_status_success) {
539 "GLSL compilation failed:\n{}", result.GetErrorMessage());
540 return {};
541 }
542
543 std::vector<uint32_t> spirv(result.cbegin(), result.cend());
544
546 "Compiled GLSL ({} stage) -> {} bytes SPIR-V",
547 vk::to_string(stage), spirv.size() * 4);
548
549 return spirv;
550
551#else
553 "GLSL compilation requested but shaderc not available - use pre-compiled SPIR-V");
554 return {};
555#endif
556}
#define MF_ERROR(comp, ctx,...)
#define MF_DEBUG(comp, ctx,...)
@ GraphicsBackend
Graphics/visual rendering backend (Vulkan, OpenGL)
@ Core
Core engine, backend, subsystems.

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

Referenced by create_from_glsl().

+ Here is the caller graph for this function: