Merge branch 'nicebyte-glsl-ext'
authorJohn Kessenich <cepheus@frii.com>
Tue, 17 Apr 2018 23:24:03 +0000 (17:24 -0600)
committerJohn Kessenich <cepheus@frii.com>
Tue, 17 Apr 2018 23:30:20 +0000 (17:30 -0600)
1  2 
StandAlone/StandAlone.cpp

@@@ -1196,38 -1196,48 +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 .<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();