Add an option to set the base uniform location
This will be used to generate uniform locations with --aml
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 @@
typedef std::map<unsigned int, unsigned int> TPerSetBaseBinding;
std::vector<std::pair<std::string, int>> uniformLocationOverrides;
+int uniformBase = 0;
std::array<std::array<unsigned int, EShLangCount>, glslang::EResCount> baseBinding;
std::array<std::array<TPerSetBaseBinding, EShLangCount>, glslang::EResCount> baseBindingForSet;
@@ -465,6 +466,12 @@
} else if (lowerword == "auto-map-locations" || // synonyms
lowerword == "aml") {
Options |= EOptionAutoMapLocations;
+ } else if (lowerword == "uniform-base") {
+ if (argc <= 1)
+ Error("no <base> 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 @@
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 @@
" suppress GLSL warnings, except as required by \"#extension : warn\"\n"
" -x save binary output as text-based 32-bit hexadecimal numbers\n"
" -u<name>:<loc> specify a uniform location override for --aml\n"
+ " --uniform-base <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 @@
{
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 @@
{
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 @@
hlslIoMapping(false),
textureSamplerTransformMode(EShTexSampTransKeep),
needToLegalize(false),
- binaryDoubleOutput(false)
+ binaryDoubleOutput(false),
+ uniformLocationBase(0)
{
localSize[0] = 1;
localSize[1] = 1;
@@ -685,6 +686,9 @@
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 @@
bool binaryDoubleOutput;
std::unordered_map<TString, int> 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 @@
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);