diff --git a/StandAlone/StandAlone.cpp b/StandAlone/StandAlone.cpp index 044662fe..1f7c5f25 100644 --- a/StandAlone/StandAlone.cpp +++ b/StandAlone/StandAlone.cpp @@ -1196,38 +1196,46 @@ int C_DECL main(int argc, char* argv[]) // .frag = fragment // .comp = compute // -EShLanguage FindLanguage(const std::string& name, bool parseSuffix) +// Additionally, the file names may end in ..glsl and ..hlsl +// where is one of the stages listed above. +// +EShLanguage FindLanguage(const std::string& name, bool parseStageName) { - size_t ext = 0; - std::string suffix; - + 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 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 + stageName = name; - if (suffix == "vert") + if (stageName == "vert") return EShLangVertex; - else if (suffix == "tesc") + else if (stageName == "tesc") return EShLangTessControl; - else if (suffix == "tese") + else if (stageName == "tese") return EShLangTessEvaluation; - else if (suffix == "geom") + else if (stageName == "geom") return EShLangGeometry; - else if (suffix == "frag") + else if (stageName == "frag") return EShLangFragment; - else if (suffix == "comp") + else if (stageName == "comp") return EShLangCompute; usage();