Auto-detect shader stage from file extension.
680{
681 std::filesystem::path path(filepath);
682 std::string ext = path.extension().string();
683
684 std::transform(ext.begin(), ext.end(), ext.begin(), ::tolower);
685
686 static const std::unordered_map<std::string, vk::ShaderStageFlagBits> extension_map = {
687 { ".comp", vk::ShaderStageFlagBits::eCompute },
688 { ".vert", vk::ShaderStageFlagBits::eVertex },
689 { ".frag", vk::ShaderStageFlagBits::eFragment },
690 { ".geom", vk::ShaderStageFlagBits::eGeometry },
691 { ".tesc", vk::ShaderStageFlagBits::eTessellationControl },
692 { ".tese", vk::ShaderStageFlagBits::eTessellationEvaluation },
693 { ".rgen", vk::ShaderStageFlagBits::eRaygenKHR },
694 { ".rint", vk::ShaderStageFlagBits::eIntersectionKHR },
695 { ".rahit", vk::ShaderStageFlagBits::eAnyHitKHR },
696 { ".rchit", vk::ShaderStageFlagBits::eClosestHitKHR },
697 { ".rmiss", vk::ShaderStageFlagBits::eMissKHR },
698 { ".rcall", vk::ShaderStageFlagBits::eCallableKHR },
699 { ".mesh", vk::ShaderStageFlagBits::eMeshEXT },
700 { ".task", vk::ShaderStageFlagBits::eTaskEXT }
701 };
702
703 auto it = extension_map.find(ext);
704 if (it != extension_map.end()) {
705 return it->second;
706 }
707
708 return std::nullopt;
709}