Add full support for uniform structs.
TRAC #23750
Signed-off-by: Geoff Lang
Signed-off-by: Nicolas Capens
diff --git a/src/libGLESv2/ProgramBinary.cpp b/src/libGLESv2/ProgramBinary.cpp
index 66c94c5..a210ed1 100644
--- a/src/libGLESv2/ProgramBinary.cpp
+++ b/src/libGLESv2/ProgramBinary.cpp
@@ -2385,7 +2385,8 @@
{
const sh::Uniform &field = constant.fields[fieldIndex];
const std::string &uniformName = constant.name + arrayString(elementIndex) + "." + field.name;
- const sh::Uniform fieldUniform(field.type, field.precision, uniformName.c_str(), field.arraySize, elementRegisterIndex);
+ const sh::Uniform fieldUniform(field.type, field.precision, uniformName.c_str(), field.arraySize,
+ elementRegisterIndex, field.elementIndex);
if (!defineUniform(shader, fieldUniform, infoLog))
{
return false;
@@ -2396,21 +2397,20 @@
}
else
{
- unsigned int fieldRegisterIndex = constant.registerIndex;
-
for (size_t fieldIndex = 0; fieldIndex < constant.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, fieldRegisterIndex);
+ sh::Uniform fieldUniform(field.type, field.precision, uniformName.c_str(), field.arraySize,
+ field.registerIndex, field.elementIndex);
+
fieldUniform.fields = field.fields;
if (!defineUniform(shader, fieldUniform, infoLog))
{
return false;
}
- fieldRegisterIndex += sh::HLSLVariableRegisterCount(field);
}
}
@@ -2470,6 +2470,7 @@
else
{
uniform = new Uniform(constant.type, constant.precision, constant.name, constant.arraySize, -1, sh::BlockMemberInfo::defaultBlockInfo);
+ uniform->registerElement = constant.elementIndex;
}
if (!uniform)