Auto-detect shader stage from file extension.
751{
752 std::filesystem::path path(filepath);
753 std::string ext = path.extension().string();
754
755 std::transform(ext.begin(), ext.end(), ext.begin(), ::tolower);
756
757 static const std::unordered_map<std::string, vk::ShaderStageFlagBits> extension_map = {
758 { ".comp", vk::ShaderStageFlagBits::eCompute },
759 { ".vert", vk::ShaderStageFlagBits::eVertex },
760 { ".frag", vk::ShaderStageFlagBits::eFragment },
761 { ".geom", vk::ShaderStageFlagBits::eGeometry },
762 { ".tesc", vk::ShaderStageFlagBits::eTessellationControl },
763 { ".tese", vk::ShaderStageFlagBits::eTessellationEvaluation },
764 { ".rgen", vk::ShaderStageFlagBits::eRaygenKHR },
765 { ".rint", vk::ShaderStageFlagBits::eIntersectionKHR },
766 { ".rahit", vk::ShaderStageFlagBits::eAnyHitKHR },
767 { ".rchit", vk::ShaderStageFlagBits::eClosestHitKHR },
768 { ".rmiss", vk::ShaderStageFlagBits::eMissKHR },
769 { ".rcall", vk::ShaderStageFlagBits::eCallableKHR },
770 { ".mesh", vk::ShaderStageFlagBits::eMeshEXT },
771 { ".task", vk::ShaderStageFlagBits::eTaskEXT }
772 };
773
774 auto it = extension_map.find(ext);
775 if (it != extension_map.end()) {
776 return it->second;
777 }
778
779 return std::nullopt;
780}