From b0f3d794c8b150cf9e104a09e2d29bc06e24a662 Mon Sep 17 00:00:00 2001 From: Neil Roberts Date: Tue, 20 Mar 2018 17:41:05 +0100 Subject: [PATCH] Add an option to set the base uniform location This will be used to generate uniform locations with --aml --- StandAlone/StandAlone.cpp | 10 ++++++++++ glslang/MachineIndependent/ShaderLang.cpp | 4 ++++ glslang/MachineIndependent/iomapper.cpp | 2 +- glslang/MachineIndependent/localintermediate.h | 7 ++++++- glslang/Public/ShaderLang.h | 1 + 5 files changed, 22 insertions(+), 2 deletions(-) diff --git a/StandAlone/StandAlone.cpp b/StandAlone/StandAlone.cpp index e15994b..48fcb7f 100644 --- a/StandAlone/StandAlone.cpp +++ b/StandAlone/StandAlone.cpp @@ -174,6 +174,7 @@ std::vector Processes; // what should be record typedef std::map TPerSetBaseBinding; std::vector> uniformLocationOverrides; +int uniformBase = 0; std::array, glslang::EResCount> baseBinding; std::array, glslang::EResCount> baseBindingForSet; @@ -465,6 +466,12 @@ void ProcessArguments(std::vector>& workItem } else if (lowerword == "auto-map-locations" || // synonyms lowerword == "aml") { Options |= EOptionAutoMapLocations; + } else if (lowerword == "uniform-base") { + if (argc <= 1) + Error("no provided for --uniform-base"); + uniformBase = ::strtol(argv[1], NULL, 10); + bumpArg(); + break; } else if (lowerword == "client") { if (argc > 1) { if (strcmp(argv[1], "vulkan100") == 0) @@ -924,6 +931,8 @@ void CompileAndLinkShaderUnits(std::vector compUnits) uniOverride.second); } + shader->setUniformLocationBase(uniformBase); + // Set up the environment, some subsettings take precedence over earlier // ways of setting things. if (Options & EOptionSpv) { @@ -1444,6 +1453,7 @@ void usage() " suppress GLSL warnings, except as required by \"#extension : warn\"\n" " -x save binary output as text-based 32-bit hexadecimal numbers\n" " -u: specify a uniform location override for --aml\n" + " --uniform-base set a base to use for generated uniform locations\n" " --auto-map-bindings | --amb automatically bind uniform variables\n" " without explicit bindings\n" " --auto-map-locations | --aml automatically locate input/output lacking\n" diff --git a/glslang/MachineIndependent/ShaderLang.cpp b/glslang/MachineIndependent/ShaderLang.cpp index 1a30fd3..522ded1 100755 --- a/glslang/MachineIndependent/ShaderLang.cpp +++ b/glslang/MachineIndependent/ShaderLang.cpp @@ -1763,6 +1763,10 @@ void TShader::addUniformLocationOverride(const char* name, int loc) { intermediate->addUniformLocationOverride(name, loc); } +void TShader::setUniformLocationBase(int base) +{ + intermediate->setUniformLocationBase(base); +} // See comment above TDefaultHlslIoMapper in iomapper.cpp: void TShader::setHlslIoMapping(bool hlslIoMap) { intermediate->setHlslIoMapping(hlslIoMap); } void TShader::setFlattenUniformArrays(bool flatten) { intermediate->setFlattenUniformArrays(flatten); } diff --git a/glslang/MachineIndependent/iomapper.cpp b/glslang/MachineIndependent/iomapper.cpp index 73ea801..e68e32f 100644 --- a/glslang/MachineIndependent/iomapper.cpp +++ b/glslang/MachineIndependent/iomapper.cpp @@ -359,7 +359,7 @@ struct TDefaultIoResolverBase : public glslang::TIoMapResolver { TDefaultIoResolverBase(const TIntermediate &intermediate) : intermediate(intermediate), - nextUniformLocation(0), + nextUniformLocation(intermediate.getUniformLocationBase()), nextInputLocation(0), nextOutputLocation(0) { } diff --git a/glslang/MachineIndependent/localintermediate.h b/glslang/MachineIndependent/localintermediate.h index a95e26f..59fbaa9 100644 --- a/glslang/MachineIndependent/localintermediate.h +++ b/glslang/MachineIndependent/localintermediate.h @@ -252,7 +252,8 @@ public: hlslIoMapping(false), textureSamplerTransformMode(EShTexSampTransKeep), needToLegalize(false), - binaryDoubleOutput(false) + binaryDoubleOutput(false), + uniformLocationBase(0) { localSize[0] = 1; localSize[1] = 1; @@ -685,6 +686,9 @@ public: return pos->second; } + void setUniformLocationBase(int base) { uniformLocationBase = base; } + int getUniformLocationBase() const { return uniformLocationBase; } + void setNeedsLegalization() { needToLegalize = true; } bool needsLegalization() const { return needToLegalize; } @@ -811,6 +815,7 @@ protected: bool binaryDoubleOutput; std::unordered_map uniformLocationOverrides; + int uniformLocationBase; private: void operator=(TIntermediate&); // prevent assignments diff --git a/glslang/Public/ShaderLang.h b/glslang/Public/ShaderLang.h index cd9f25e..74ab352 100644 --- a/glslang/Public/ShaderLang.h +++ b/glslang/Public/ShaderLang.h @@ -414,6 +414,7 @@ public: void setAutoMapBindings(bool map); void setAutoMapLocations(bool map); void addUniformLocationOverride(const char* name, int loc); + void setUniformLocationBase(int base); void setInvertY(bool invert); void setHlslIoMapping(bool hlslIoMap); void setFlattenUniformArrays(bool flatten); -- 2.7.4