Merge branch 'nicebyte-glsl-ext'
diff --git a/StandAlone/StandAlone.cpp b/StandAlone/StandAlone.cpp
index 044662f..1f7c5f2 100644
--- a/StandAlone/StandAlone.cpp
+++ b/StandAlone/StandAlone.cpp
@@ -1196,38 +1196,46 @@
// .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 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();