Commit cd3acf67 by Qin Jiajia Committed by Commit Bot

ES31: Update block members static use

BUG=angleproject:1920 TEST=angle_end2end_tests Change-Id: I90bcd3bf5a078623b3a739615fbc7b157b6fb94c Reviewed-on: https://chromium-review.googlesource.com/808144Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarCorentin Wallez <cwallez@chromium.org> Commit-Queue: Corentin Wallez <cwallez@chromium.org>
parent f2f6d379
...@@ -48,6 +48,22 @@ int GetUniformLocationBinding(const ProgramBindings &uniformLocationBindings, ...@@ -48,6 +48,22 @@ int GetUniformLocationBinding(const ProgramBindings &uniformLocationBindings,
return binding; return binding;
} }
template <typename VarT>
void SetStaticUse(std::vector<VarT> *list,
const std::string &name,
GLenum shaderType,
bool staticUse)
{
for (auto &variable : *list)
{
if (variable.name == name)
{
variable.setStaticUse(shaderType, staticUse);
return;
}
}
}
} // anonymous namespace } // anonymous namespace
UniformLinker::UniformLinker(const ProgramState &state) : mState(state) UniformLinker::UniformLinker(const ProgramState &state) : mState(state)
...@@ -766,7 +782,11 @@ void InterfaceBlockLinker::linkBlocks(const GetBlockSize &getBlockSize, ...@@ -766,7 +782,11 @@ void InterfaceBlockLinker::linkBlocks(const GetBlockSize &getBlockSize,
if (block.name == priorBlock.name) if (block.name == priorBlock.name)
{ {
priorBlock.setStaticUse(shaderType, true); priorBlock.setStaticUse(shaderType, true);
// TODO(jiajia.qin@intel.com): update the block members static use. // Update the block members static use.
defineBlockMembers(nullptr, block.fields, block.fieldPrefix(),
block.fieldMappedPrefix(), -1,
block.blockType == sh::BlockType::BLOCK_BUFFER, 1,
shaderType);
} }
} }
} }
...@@ -788,7 +808,8 @@ void InterfaceBlockLinker::defineArrayOfStructsBlockMembers(const GetBlockMember ...@@ -788,7 +808,8 @@ void InterfaceBlockLinker::defineArrayOfStructsBlockMembers(const GetBlockMember
const std::string &mappedPrefix, const std::string &mappedPrefix,
int blockIndex, int blockIndex,
bool singleEntryForTopLevelArray, bool singleEntryForTopLevelArray,
int topLevelArraySize) const int topLevelArraySize,
GLenum shaderType) const
{ {
// Nested arrays are processed starting from outermost (arrayNestingIndex 0u) and ending at the // Nested arrays are processed starting from outermost (arrayNestingIndex 0u) and ending at the
// innermost. // innermost.
...@@ -805,12 +826,12 @@ void InterfaceBlockLinker::defineArrayOfStructsBlockMembers(const GetBlockMember ...@@ -805,12 +826,12 @@ void InterfaceBlockLinker::defineArrayOfStructsBlockMembers(const GetBlockMember
{ {
defineArrayOfStructsBlockMembers(getMemberInfo, field, arrayNestingIndex + 1u, defineArrayOfStructsBlockMembers(getMemberInfo, field, arrayNestingIndex + 1u,
elementName, elementMappedName, blockIndex, false, elementName, elementMappedName, blockIndex, false,
topLevelArraySize); topLevelArraySize, shaderType);
} }
else else
{ {
defineBlockMembers(getMemberInfo, field.fields, elementName, elementMappedName, defineBlockMembers(getMemberInfo, field.fields, elementName, elementMappedName,
blockIndex, false, topLevelArraySize); blockIndex, false, topLevelArraySize, shaderType);
} }
} }
} }
...@@ -822,7 +843,8 @@ void InterfaceBlockLinker::defineBlockMembers(const GetBlockMemberInfo &getMembe ...@@ -822,7 +843,8 @@ void InterfaceBlockLinker::defineBlockMembers(const GetBlockMemberInfo &getMembe
const std::string &mappedPrefix, const std::string &mappedPrefix,
int blockIndex, int blockIndex,
bool singleEntryForTopLevelArray, bool singleEntryForTopLevelArray,
int topLevelArraySize) const int topLevelArraySize,
GLenum shaderType) const
{ {
for (const VarT &field : fields) for (const VarT &field : fields)
{ {
...@@ -831,7 +853,7 @@ void InterfaceBlockLinker::defineBlockMembers(const GetBlockMemberInfo &getMembe ...@@ -831,7 +853,7 @@ void InterfaceBlockLinker::defineBlockMembers(const GetBlockMemberInfo &getMembe
(mappedPrefix.empty() ? field.mappedName : mappedPrefix + "." + field.mappedName); (mappedPrefix.empty() ? field.mappedName : mappedPrefix + "." + field.mappedName);
defineBlockMember(getMemberInfo, field, fullName, fullMappedName, blockIndex, defineBlockMember(getMemberInfo, field, fullName, fullMappedName, blockIndex,
singleEntryForTopLevelArray, topLevelArraySize); singleEntryForTopLevelArray, topLevelArraySize, shaderType);
} }
} }
...@@ -842,7 +864,8 @@ void InterfaceBlockLinker::defineBlockMember(const GetBlockMemberInfo &getMember ...@@ -842,7 +864,8 @@ void InterfaceBlockLinker::defineBlockMember(const GetBlockMemberInfo &getMember
const std::string &fullMappedName, const std::string &fullMappedName,
int blockIndex, int blockIndex,
bool singleEntryForTopLevelArray, bool singleEntryForTopLevelArray,
int topLevelArraySize) const int topLevelArraySize,
GLenum shaderType) const
{ {
int nextArraySize = topLevelArraySize; int nextArraySize = topLevelArraySize;
if (((field.isArray() && field.isStruct()) || field.isArrayOfArrays()) && if (((field.isArray() && field.isStruct()) || field.isArrayOfArrays()) &&
...@@ -859,14 +882,14 @@ void InterfaceBlockLinker::defineBlockMember(const GetBlockMemberInfo &getMember ...@@ -859,14 +882,14 @@ void InterfaceBlockLinker::defineBlockMember(const GetBlockMemberInfo &getMember
if (field.isArray()) if (field.isArray())
{ {
defineArrayOfStructsBlockMembers(getMemberInfo, field, 0u, fullName, fullMappedName, defineArrayOfStructsBlockMembers(getMemberInfo, field, 0u, fullName, fullMappedName,
blockIndex, singleEntryForTopLevelArray, blockIndex, singleEntryForTopLevelArray, nextArraySize,
nextArraySize); shaderType);
} }
else else
{ {
ASSERT(nextArraySize == topLevelArraySize); ASSERT(nextArraySize == topLevelArraySize);
defineBlockMembers(getMemberInfo, field.fields, fullName, fullMappedName, blockIndex, defineBlockMembers(getMemberInfo, field.fields, fullName, fullMappedName, blockIndex,
false, nextArraySize); false, nextArraySize, shaderType);
} }
return; return;
} }
...@@ -886,18 +909,11 @@ void InterfaceBlockLinker::defineBlockMember(const GetBlockMemberInfo &getMember ...@@ -886,18 +909,11 @@ void InterfaceBlockLinker::defineBlockMember(const GetBlockMemberInfo &getMember
const std::string elementMappedName = fullMappedName + ArrayString(arrayElement); const std::string elementMappedName = fullMappedName + ArrayString(arrayElement);
defineBlockMember(getMemberInfo, fieldElement, elementName, elementMappedName, defineBlockMember(getMemberInfo, fieldElement, elementName, elementMappedName,
blockIndex, false, nextArraySize); blockIndex, false, nextArraySize, shaderType);
} }
return; return;
} }
// If getBlockMemberInfo returns false, the variable is optimized out.
sh::BlockMemberInfo memberInfo;
if (!getMemberInfo(fullName, fullMappedName, &memberInfo))
{
return;
}
std::string fullNameWithArrayIndex = fullName; std::string fullNameWithArrayIndex = fullName;
std::string fullMappedNameWithArrayIndex = fullMappedName; std::string fullMappedNameWithArrayIndex = fullMappedName;
...@@ -907,9 +923,23 @@ void InterfaceBlockLinker::defineBlockMember(const GetBlockMemberInfo &getMember ...@@ -907,9 +923,23 @@ void InterfaceBlockLinker::defineBlockMember(const GetBlockMemberInfo &getMember
fullMappedNameWithArrayIndex += "[0]"; fullMappedNameWithArrayIndex += "[0]";
} }
if (blockIndex == -1)
{
updateBlockMemberStaticUsedImpl(fullNameWithArrayIndex, shaderType, field.staticUse);
}
else
{
// If getBlockMemberInfo returns false, the variable is optimized out.
sh::BlockMemberInfo memberInfo;
if (!getMemberInfo(fullName, fullMappedName, &memberInfo))
{
return;
}
ASSERT(nextArraySize == topLevelArraySize); ASSERT(nextArraySize == topLevelArraySize);
defineBlockMemberImpl(field, fullNameWithArrayIndex, fullMappedNameWithArrayIndex, blockIndex, defineBlockMemberImpl(field, fullNameWithArrayIndex, fullMappedNameWithArrayIndex,
memberInfo, nextArraySize); blockIndex, memberInfo, nextArraySize, shaderType);
}
} }
void InterfaceBlockLinker::defineInterfaceBlock(const GetBlockSize &getBlockSize, void InterfaceBlockLinker::defineInterfaceBlock(const GetBlockSize &getBlockSize,
...@@ -926,7 +956,7 @@ void InterfaceBlockLinker::defineInterfaceBlock(const GetBlockSize &getBlockSize ...@@ -926,7 +956,7 @@ void InterfaceBlockLinker::defineInterfaceBlock(const GetBlockSize &getBlockSize
size_t firstBlockMemberIndex = getCurrentBlockMemberIndex(); size_t firstBlockMemberIndex = getCurrentBlockMemberIndex();
defineBlockMembers(getMemberInfo, interfaceBlock.fields, interfaceBlock.fieldPrefix(), defineBlockMembers(getMemberInfo, interfaceBlock.fields, interfaceBlock.fieldPrefix(),
interfaceBlock.fieldMappedPrefix(), blockIndex, interfaceBlock.fieldMappedPrefix(), blockIndex,
interfaceBlock.blockType == sh::BlockType::BLOCK_BUFFER, 1); interfaceBlock.blockType == sh::BlockType::BLOCK_BUFFER, 1, shaderType);
size_t lastBlockMemberIndex = getCurrentBlockMemberIndex(); size_t lastBlockMemberIndex = getCurrentBlockMemberIndex();
for (size_t blockMemberIndex = firstBlockMemberIndex; blockMemberIndex < lastBlockMemberIndex; for (size_t blockMemberIndex = firstBlockMemberIndex; blockMemberIndex < lastBlockMemberIndex;
...@@ -986,12 +1016,13 @@ void UniformBlockLinker::defineBlockMemberImpl(const sh::ShaderVariable &field, ...@@ -986,12 +1016,13 @@ void UniformBlockLinker::defineBlockMemberImpl(const sh::ShaderVariable &field,
const std::string &fullMappedName, const std::string &fullMappedName,
int blockIndex, int blockIndex,
const sh::BlockMemberInfo &memberInfo, const sh::BlockMemberInfo &memberInfo,
int /*topLevelArraySize*/) const int /*topLevelArraySize*/,
GLenum shaderType) const
{ {
LinkedUniform newUniform(field.type, field.precision, fullName, field.arraySizes, -1, -1, -1, LinkedUniform newUniform(field.type, field.precision, fullName, field.arraySizes, -1, -1, -1,
blockIndex, memberInfo); blockIndex, memberInfo);
newUniform.mappedName = fullMappedName; newUniform.mappedName = fullMappedName;
// TODO(jiajia.qin@intel.com): update the block memeber static use. newUniform.setStaticUse(shaderType, field.staticUse);
// Since block uniforms have no location, we don't need to store them in the uniform locations // Since block uniforms have no location, we don't need to store them in the uniform locations
// list. // list.
...@@ -1003,6 +1034,13 @@ size_t UniformBlockLinker::getCurrentBlockMemberIndex() const ...@@ -1003,6 +1034,13 @@ size_t UniformBlockLinker::getCurrentBlockMemberIndex() const
return mUniformsOut->size(); return mUniformsOut->size();
} }
void UniformBlockLinker::updateBlockMemberStaticUsedImpl(const std::string &fullName,
GLenum shaderType,
bool staticUse) const
{
SetStaticUse(mUniformsOut, fullName, shaderType, staticUse);
}
// ShaderStorageBlockLinker implementation. // ShaderStorageBlockLinker implementation.
ShaderStorageBlockLinker::ShaderStorageBlockLinker(std::vector<InterfaceBlock> *blocksOut, ShaderStorageBlockLinker::ShaderStorageBlockLinker(std::vector<InterfaceBlock> *blocksOut,
std::vector<BufferVariable> *bufferVariablesOut) std::vector<BufferVariable> *bufferVariablesOut)
...@@ -1019,12 +1057,13 @@ void ShaderStorageBlockLinker::defineBlockMemberImpl(const sh::ShaderVariable &f ...@@ -1019,12 +1057,13 @@ void ShaderStorageBlockLinker::defineBlockMemberImpl(const sh::ShaderVariable &f
const std::string &fullMappedName, const std::string &fullMappedName,
int blockIndex, int blockIndex,
const sh::BlockMemberInfo &memberInfo, const sh::BlockMemberInfo &memberInfo,
int topLevelArraySize) const int topLevelArraySize,
GLenum shaderType) const
{ {
BufferVariable newBufferVariable(field.type, field.precision, fullName, field.arraySizes, BufferVariable newBufferVariable(field.type, field.precision, fullName, field.arraySizes,
blockIndex, memberInfo); blockIndex, memberInfo);
newBufferVariable.mappedName = fullMappedName; newBufferVariable.mappedName = fullMappedName;
// TODO(jiajia.qin@intel.com): update the block memeber static use. newBufferVariable.setStaticUse(shaderType, field.staticUse);
newBufferVariable.topLevelArraySize = topLevelArraySize; newBufferVariable.topLevelArraySize = topLevelArraySize;
...@@ -1036,6 +1075,13 @@ size_t ShaderStorageBlockLinker::getCurrentBlockMemberIndex() const ...@@ -1036,6 +1075,13 @@ size_t ShaderStorageBlockLinker::getCurrentBlockMemberIndex() const
return mBufferVariablesOut->size(); return mBufferVariablesOut->size();
} }
void ShaderStorageBlockLinker::updateBlockMemberStaticUsedImpl(const std::string &fullName,
GLenum shaderType,
bool staticUse) const
{
SetStaticUse(mBufferVariablesOut, fullName, shaderType, staticUse);
}
// AtomicCounterBufferLinker implementation. // AtomicCounterBufferLinker implementation.
AtomicCounterBufferLinker::AtomicCounterBufferLinker( AtomicCounterBufferLinker::AtomicCounterBufferLinker(
std::vector<AtomicCounterBuffer> *atomicCounterBuffersOut) std::vector<AtomicCounterBuffer> *atomicCounterBuffersOut)
......
...@@ -209,7 +209,8 @@ class InterfaceBlockLinker : angle::NonCopyable ...@@ -209,7 +209,8 @@ class InterfaceBlockLinker : angle::NonCopyable
const std::string &mappedPrefix, const std::string &mappedPrefix,
int blockIndex, int blockIndex,
bool singleEntryForTopLevelArray, bool singleEntryForTopLevelArray,
int topLevelArraySize) const; int topLevelArraySize,
GLenum shaderType) const;
template <typename VarT> template <typename VarT>
void defineBlockMember(const GetBlockMemberInfo &getMemberInfo, void defineBlockMember(const GetBlockMemberInfo &getMemberInfo,
const VarT &field, const VarT &field,
...@@ -217,15 +218,20 @@ class InterfaceBlockLinker : angle::NonCopyable ...@@ -217,15 +218,20 @@ class InterfaceBlockLinker : angle::NonCopyable
const std::string &fullMappedName, const std::string &fullMappedName,
int blockIndex, int blockIndex,
bool singleEntryForTopLevelArray, bool singleEntryForTopLevelArray,
int topLevelArraySize) const; int topLevelArraySize,
GLenum shaderType) const;
virtual void defineBlockMemberImpl(const sh::ShaderVariable &field, virtual void defineBlockMemberImpl(const sh::ShaderVariable &field,
const std::string &fullName, const std::string &fullName,
const std::string &fullMappedName, const std::string &fullMappedName,
int blockIndex, int blockIndex,
const sh::BlockMemberInfo &memberInfo, const sh::BlockMemberInfo &memberInfo,
int topLevelArraySize) const = 0; int topLevelArraySize,
GLenum shaderType) const = 0;
virtual size_t getCurrentBlockMemberIndex() const = 0; virtual size_t getCurrentBlockMemberIndex() const = 0;
virtual void updateBlockMemberStaticUsedImpl(const std::string &fullName,
GLenum shaderType,
bool staticUse) const = 0;
using ShaderBlocks = std::pair<GLenum, const std::vector<sh::InterfaceBlock> *>; using ShaderBlocks = std::pair<GLenum, const std::vector<sh::InterfaceBlock> *>;
std::vector<ShaderBlocks> mShaderBlocks; std::vector<ShaderBlocks> mShaderBlocks;
...@@ -241,7 +247,8 @@ class InterfaceBlockLinker : angle::NonCopyable ...@@ -241,7 +247,8 @@ class InterfaceBlockLinker : angle::NonCopyable
const std::string &mappedPrefix, const std::string &mappedPrefix,
int blockIndex, int blockIndex,
bool singleEntryForTopLevelArray, bool singleEntryForTopLevelArray,
int topLevelArraySize) const; int topLevelArraySize,
GLenum shaderType) const;
}; };
class UniformBlockLinker final : public InterfaceBlockLinker class UniformBlockLinker final : public InterfaceBlockLinker
...@@ -257,8 +264,12 @@ class UniformBlockLinker final : public InterfaceBlockLinker ...@@ -257,8 +264,12 @@ class UniformBlockLinker final : public InterfaceBlockLinker
const std::string &fullMappedName, const std::string &fullMappedName,
int blockIndex, int blockIndex,
const sh::BlockMemberInfo &memberInfo, const sh::BlockMemberInfo &memberInfo,
int topLevelArraySize) const override; int topLevelArraySize,
GLenum shaderType) const override;
size_t getCurrentBlockMemberIndex() const override; size_t getCurrentBlockMemberIndex() const override;
void updateBlockMemberStaticUsedImpl(const std::string &fullName,
GLenum shaderType,
bool staticUse) const override;
std::vector<LinkedUniform> *mUniformsOut; std::vector<LinkedUniform> *mUniformsOut;
}; };
...@@ -275,8 +286,12 @@ class ShaderStorageBlockLinker final : public InterfaceBlockLinker ...@@ -275,8 +286,12 @@ class ShaderStorageBlockLinker final : public InterfaceBlockLinker
const std::string &fullMappedName, const std::string &fullMappedName,
int blockIndex, int blockIndex,
const sh::BlockMemberInfo &memberInfo, const sh::BlockMemberInfo &memberInfo,
int topLevelArraySize) const override; int topLevelArraySize,
GLenum shaderType) const override;
size_t getCurrentBlockMemberIndex() const override; size_t getCurrentBlockMemberIndex() const override;
void updateBlockMemberStaticUsedImpl(const std::string &fullName,
GLenum shaderType,
bool staticUse) const override;
std::vector<BufferVariable> *mBufferVariablesOut; std::vector<BufferVariable> *mBufferVariablesOut;
}; };
......
...@@ -660,10 +660,9 @@ TEST_P(ProgramInterfaceTestES31, GetBufferVariableProperties) ...@@ -660,10 +660,9 @@ TEST_P(ProgramInterfaceTestES31, GetBufferVariableProperties)
EXPECT_EQ(14, params[5]); // name_length EXPECT_EQ(14, params[5]); // name_length
EXPECT_LE(0, params[6]); // offset EXPECT_LE(0, params[6]); // offset
// TODO(jiajia.qin@intel.com): Enable them once the block member staticUse are implemented. EXPECT_EQ(1, params[7]); // referenced_by_vertex_shader
// EXPECT_EQ(1, params[7]); // referenced_by_vertex_shader EXPECT_EQ(1, params[8]); // referenced_by_fragment_shader
// EXPECT_EQ(1, params[8]); // referenced_by_fragment_shader EXPECT_EQ(0, params[9]); // referenced_by_compute_shader
// EXPECT_EQ(0, params[9]); // referenced_by_compute_shader
EXPECT_EQ(1, params[10]); // top_level_array_size EXPECT_EQ(1, params[10]); // top_level_array_size
EXPECT_LE(0, params[11]); // top_level_array_stride EXPECT_LE(0, params[11]); // top_level_array_stride
...@@ -691,10 +690,9 @@ TEST_P(ProgramInterfaceTestES31, GetBufferVariableProperties) ...@@ -691,10 +690,9 @@ TEST_P(ProgramInterfaceTestES31, GetBufferVariableProperties)
EXPECT_EQ(8, params[5]); // name_length EXPECT_EQ(8, params[5]); // name_length
EXPECT_LE(0, params[6]); // offset EXPECT_LE(0, params[6]); // offset
// TODO(jiajia.qin@intel.com): Enable them once the block member staticUse are implemented. EXPECT_EQ(1, params[7]); // referenced_by_vertex_shader
// EXPECT_EQ(1, params[7]); // referenced_by_vertex_shader EXPECT_EQ(0, params[8]); // referenced_by_fragment_shader
// EXPECT_EQ(0, params[8]); // referenced_by_fragment_shader EXPECT_EQ(0, params[9]); // referenced_by_compute_shader
// EXPECT_EQ(0, params[9]); // referenced_by_compute_shader
EXPECT_EQ(2, params[10]); // top_level_array_size EXPECT_EQ(2, params[10]); // top_level_array_size
EXPECT_EQ(80, params[11]); // top_level_array_stride EXPECT_EQ(80, params[11]); // top_level_array_stride
......
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