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();