Do not create dummy variables when linking uniforms.
This cleanup prepares us for removing the uniform register info
from the shader translator types.
BUG=angle:466
Change-Id: I86f47970b793135f410a5ef698fc96d44219ee96
Reviewed-on: https://chromium-review.googlesource.com/207253
Tested-by: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Zhenyao Mo <zmo@chromium.org>
diff --git a/src/libGLESv2/ProgramBinary.cpp b/src/libGLESv2/ProgramBinary.cpp
index 14e90b8..a57cabd 100644
--- a/src/libGLESv2/ProgramBinary.cpp
+++ b/src/libGLESv2/ProgramBinary.cpp
@@ -1929,12 +1929,12 @@
for (unsigned int uniformIndex = 0; uniformIndex < vertexUniforms.size(); uniformIndex++)
{
- defineUniform(GL_VERTEX_SHADER, vertexUniforms[uniformIndex]);
+ defineUniformBase(GL_VERTEX_SHADER, vertexUniforms[uniformIndex]);
}
for (unsigned int uniformIndex = 0; uniformIndex < fragmentUniforms.size(); uniformIndex++)
{
- defineUniform(GL_FRAGMENT_SHADER, fragmentUniforms[uniformIndex]);
+ defineUniformBase(GL_FRAGMENT_SHADER, fragmentUniforms[uniformIndex]);
}
if (!indexUniforms(infoLog))
@@ -1947,69 +1947,64 @@
return true;
}
-void ProgramBinary::defineUniform(GLenum shader, const sh::Uniform &constant)
+void ProgramBinary::defineUniformBase(GLenum shader, const sh::Uniform &uniform)
{
- if (constant.isStruct())
+ defineUniform(shader, uniform, uniform.name, uniform.registerIndex);
+}
+
+void ProgramBinary::defineUniform(GLenum shader, const sh::Uniform &uniform,
+ const std::string &fullName, unsigned int baseRegisterIndex)
+{
+ if (uniform.isStruct())
{
- if (constant.arraySize > 0)
+ if (uniform.arraySize > 0)
{
ShShaderOutput outputType = Shader::getCompilerOutputType(shader);
- const unsigned int elementRegisterCount = HLSLVariableRegisterCount(constant, outputType) / constant.arraySize;
+ const unsigned int elementRegisterCount = HLSLVariableRegisterCount(uniform, outputType) / uniform.arraySize;
- for (unsigned int elementIndex = 0; elementIndex < constant.arraySize; elementIndex++)
+ for (unsigned int elementIndex = 0; elementIndex < uniform.arraySize; elementIndex++)
{
const unsigned int elementRegisterOffset = elementRegisterCount * elementIndex;
- for (size_t fieldIndex = 0; fieldIndex < constant.fields.size(); fieldIndex++)
+ for (size_t fieldIndex = 0; fieldIndex < uniform.fields.size(); fieldIndex++)
{
- const sh::Uniform &field = constant.fields[fieldIndex];
- const std::string &uniformName = constant.name + ArrayString(elementIndex) + "." + field.name;
+ const sh::Uniform &field = uniform.fields[fieldIndex];
+ const std::string &fieldFullName = fullName + ArrayString(elementIndex) + "." + field.name;
const unsigned int fieldRegisterIndex = field.registerIndex + elementRegisterOffset;
- sh::Uniform fieldUniform(field.type, field.precision, uniformName.c_str(), field.arraySize,
- fieldRegisterIndex, field.elementIndex);
-
- fieldUniform.fields = field.fields;
-
- defineUniform(shader, fieldUniform);
+ defineUniform(shader, field, fieldFullName, fieldRegisterIndex);
}
}
}
else
{
- for (size_t fieldIndex = 0; fieldIndex < constant.fields.size(); fieldIndex++)
+ for (size_t fieldIndex = 0; fieldIndex < uniform.fields.size(); fieldIndex++)
{
- const sh::Uniform &field = constant.fields[fieldIndex];
- const std::string &uniformName = constant.name + "." + field.name;
-
- sh::Uniform fieldUniform(field.type, field.precision, uniformName.c_str(), field.arraySize,
- field.registerIndex, field.elementIndex);
-
- fieldUniform.fields = field.fields;
-
- defineUniform(shader, fieldUniform);
+ const sh::Uniform &field = uniform.fields[fieldIndex];
+ const std::string &fieldFullName = fullName + "." + field.name;
+ defineUniform(shader, field, fieldFullName, field.registerIndex);
}
}
}
else // Not a struct
{
- LinkedUniform *linkedUniform = getUniformByName(constant.name);
+ LinkedUniform *linkedUniform = getUniformByName(fullName);
if (!linkedUniform)
{
- linkedUniform = new LinkedUniform(constant.type, constant.precision, constant.name, constant.arraySize,
+ linkedUniform = new LinkedUniform(uniform.type, uniform.precision, fullName, uniform.arraySize,
-1, sh::BlockMemberInfo::getDefaultBlockInfo());
ASSERT(linkedUniform);
- linkedUniform->registerElement = constant.elementIndex;
+ linkedUniform->registerElement = uniform.elementIndex;
mUniforms.push_back(linkedUniform);
}
if (shader == GL_FRAGMENT_SHADER)
{
- linkedUniform->psRegisterIndex = constant.registerIndex;
+ linkedUniform->psRegisterIndex = baseRegisterIndex;
}
else if (shader == GL_VERTEX_SHADER)
{
- linkedUniform->vsRegisterIndex = constant.registerIndex;
+ linkedUniform->vsRegisterIndex = baseRegisterIndex;
}
else UNREACHABLE();
}