Commit 1f73b7c6 by Olli Etuaho Committed by Commit Bot

Add separate entries for inner arrays in block layout

Generating separate entries for array of array members in blocks is needed so that block member queries work correctly. This change will be tested more fully once support for parsing arrays of arrays lands in the compiler. BUG=angleproject:2125 Change-Id: I052837ddd4ee44a5c2390d3af44c0f1d21fa5fc7 Reviewed-on: https://chromium-review.googlesource.com/787975Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarCorentin Wallez <cwallez@chromium.org> Commit-Queue: Olli Etuaho <oetuaho@nvidia.com>
parent 5451d532
...@@ -42,7 +42,7 @@ void GetUniformBlockStructMemberInfo(const std::vector<VarT> &fields, ...@@ -42,7 +42,7 @@ void GetUniformBlockStructMemberInfo(const std::vector<VarT> &fields,
template <typename VarT> template <typename VarT>
void GetUniformBlockStructArrayMemberInfo(const VarT &field, void GetUniformBlockStructArrayMemberInfo(const VarT &field,
unsigned int arrayNestingIndex, unsigned int arrayNestingIndex,
const std::string &prefix, const std::string &arrayName,
sh::BlockLayoutEncoder *encoder, sh::BlockLayoutEncoder *encoder,
bool inRowMajorLayout, bool inRowMajorLayout,
BlockLayoutMap *blockInfoOut) BlockLayoutMap *blockInfoOut)
...@@ -52,7 +52,7 @@ void GetUniformBlockStructArrayMemberInfo(const VarT &field, ...@@ -52,7 +52,7 @@ void GetUniformBlockStructArrayMemberInfo(const VarT &field,
const unsigned int currentArraySize = field.getNestedArraySize(arrayNestingIndex); const unsigned int currentArraySize = field.getNestedArraySize(arrayNestingIndex);
for (unsigned int arrayElement = 0u; arrayElement < currentArraySize; ++arrayElement) for (unsigned int arrayElement = 0u; arrayElement < currentArraySize; ++arrayElement)
{ {
const std::string elementName = prefix + ArrayString(arrayElement); const std::string elementName = arrayName + ArrayString(arrayElement);
if (arrayNestingIndex + 1u < field.arraySizes.size()) if (arrayNestingIndex + 1u < field.arraySizes.size())
{ {
GetUniformBlockStructArrayMemberInfo(field, arrayNestingIndex + 1u, elementName, GetUniformBlockStructArrayMemberInfo(field, arrayNestingIndex + 1u, elementName,
...@@ -66,6 +66,33 @@ void GetUniformBlockStructArrayMemberInfo(const VarT &field, ...@@ -66,6 +66,33 @@ void GetUniformBlockStructArrayMemberInfo(const VarT &field,
} }
} }
template <typename VarT>
void GetUniformBlockArrayOfArraysMemberInfo(const VarT &field,
unsigned int arrayNestingIndex,
const std::string &arrayName,
sh::BlockLayoutEncoder *encoder,
bool inRowMajorLayout,
BlockLayoutMap *blockInfoOut)
{
const unsigned int currentArraySize = field.getNestedArraySize(arrayNestingIndex);
for (unsigned int arrayElement = 0u; arrayElement < currentArraySize; ++arrayElement)
{
const std::string elementName = arrayName + ArrayString(arrayElement);
if (arrayNestingIndex + 2u < field.arraySizes.size())
{
GetUniformBlockArrayOfArraysMemberInfo(field, arrayNestingIndex + 1u, elementName,
encoder, inRowMajorLayout, blockInfoOut);
}
else
{
std::vector<unsigned int> innermostArraySize(
1u, field.getNestedArraySize(arrayNestingIndex + 1u));
(*blockInfoOut)[elementName] =
encoder->encodeType(field.type, innermostArraySize, inRowMajorLayout);
}
}
}
} // anonymous namespace } // anonymous namespace
BlockLayoutEncoder::BlockLayoutEncoder() : mCurrentOffset(0) BlockLayoutEncoder::BlockLayoutEncoder() : mCurrentOffset(0)
...@@ -218,6 +245,12 @@ void GetUniformBlockInfo(const std::vector<VarT> &fields, ...@@ -218,6 +245,12 @@ void GetUniformBlockInfo(const std::vector<VarT> &fields,
blockInfoOut); blockInfoOut);
} }
} }
else if (field.isArrayOfArrays())
{
bool isRowMajorMatrix = (gl::IsMatrixType(field.type) && inRowMajorLayout);
GetUniformBlockArrayOfArraysMemberInfo(field, 0u, fieldName, encoder, isRowMajorMatrix,
blockInfoOut);
}
else else
{ {
bool isRowMajorMatrix = (gl::IsMatrixType(field.type) && inRowMajorLayout); bool isRowMajorMatrix = (gl::IsMatrixType(field.type) && inRowMajorLayout);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment