// .frag = fragment
// .comp = compute
//
- EShLanguage FindLanguage(const std::string& name, bool parseSuffix)
+ // Additionally, the file names may end in .<stage>.glsl and .<stage>.hlsl
+ // where <stage> is one of the stages listed above.
+ //
+ EShLanguage FindLanguage(const std::string& name, bool parseStageName)
{
- size_t ext = 0;
- std::string suffix;
-
- std::string stage_name;
- if (shaderStageName) {
- stage_name = shaderStageName;
- } else if (parseStageName) {
++ std::string stageName;
+ if (shaderStageName)
- suffix = shaderStageName;
- else {
- // Search for a suffix on a filename: e.g, "myfile.frag". If given
- // the suffix directly, we skip looking for the '.'
- if (parseSuffix) {
- ext = name.rfind('.');
- if (ext == std::string::npos) {
- usage();
- return EShLangVertex;
- }
- ++ext;
++ stageName = shaderStageName;
++ else if (parseStageName) {
+ // Note: "first" extension means "first from the end", i.e.
+ // if the file is named foo.vert.glsl, then "glsl" is first,
+ // "vert" is second.
- size_t first_ext_start = name.find_last_of(".");
- bool has_first_ext = first_ext_start != std::string::npos;
- size_t second_ext_start =
- has_first_ext ? name.find_last_of(".", first_ext_start - 1) : std::string::npos;
- bool has_second_ext = second_ext_start != std::string::npos;
- std::string first_ext = name.substr(first_ext_start + 1, std::string::npos);
- bool uses_unified_ext = has_first_ext && (first_ext == "glsl" ||
- first_ext == "hlsl");
- if (has_first_ext && !uses_unified_ext) {
- stage_name = first_ext;
- } else if (uses_unified_ext && has_second_ext) {
- stage_name = name.substr(second_ext_start + 1, first_ext_start - second_ext_start - 1);
++ size_t firstExtStart = name.find_last_of(".");
++ bool hasFirstExt = firstExtStart != std::string::npos;
++ size_t secondExtStart = hasFirstExt ? name.find_last_of(".", firstExtStart - 1) : std::string::npos;
++ bool hasSecondExt = secondExtStart != std::string::npos;
++ std::string firstExt = name.substr(firstExtStart + 1, std::string::npos);
++ bool usesUnifiedExt = hasFirstExt && (firstExt == "glsl" || firstExt == "hlsl");
++ if (hasFirstExt && !usesUnifiedExt) {
++ stageName = firstExt;
++ } else if (usesUnifiedExt && hasSecondExt) {
++ stageName = name.substr(secondExtStart + 1, firstExtStart - secondExtStart - 1);
+ } else {
+ usage();
+ return EShLangVertex;
}
- suffix = name.substr(ext, std::string::npos);
- } else {
- stage_name = name;
-- }
- if (stage_name == "vert")
++ } else
++ stageName = name;
+
- if (suffix == "vert")
++ if (stageName == "vert")
return EShLangVertex;
- else if (suffix == "tesc")
- else if (stage_name == "tesc")
++ else if (stageName == "tesc")
return EShLangTessControl;
- else if (suffix == "tese")
- else if (stage_name == "tese")
++ else if (stageName == "tese")
return EShLangTessEvaluation;
- else if (suffix == "geom")
- else if (stage_name == "geom")
++ else if (stageName == "geom")
return EShLangGeometry;
- else if (suffix == "frag")
- else if (stage_name == "frag")
++ else if (stageName == "frag")
return EShLangFragment;
- else if (suffix == "comp")
- else if (stage_name == "comp")
++ else if (stageName == "comp")
return EShLangCompute;
usage();