Commit ffec96c1 by Alexis Hetu Committed by Alexis Hétu

Uniform blocks stores as pointers

Changed UniformBlockArray so that it stores pointers to UniformBlock objects and adapted the code. Also reverted a change that had removed constness from some members of the UniformBlock class. Bug 22986647 Change-Id: I677a4b2e92da5849e4387e3802dfdfa36dc6b0a4 Reviewed-on: https://swiftshader-review.googlesource.com/3830Reviewed-by: 's avatarNicolas Capens <capn@google.com> Tested-by: 's avatarAlexis Hétu <sugoi@google.com>
parent 0fecd6f3
...@@ -399,7 +399,7 @@ namespace es2 ...@@ -399,7 +399,7 @@ namespace es2
{ {
ASSERT(uniformBlockIndex < getActiveUniformBlockCount()); ASSERT(uniformBlockIndex < getActiveUniformBlockCount());
const UniformBlock &uniformBlock = uniformBlocks[uniformBlockIndex]; const UniformBlock &uniformBlock = *uniformBlocks[uniformBlockIndex];
switch(pname) switch(pname)
{ {
...@@ -438,7 +438,7 @@ namespace es2 ...@@ -438,7 +438,7 @@ namespace es2
unsigned int numUniformBlocks = getActiveUniformBlockCount(); unsigned int numUniformBlocks = getActiveUniformBlockCount();
for(unsigned int blockIndex = 0; blockIndex < numUniformBlocks; blockIndex++) for(unsigned int blockIndex = 0; blockIndex < numUniformBlocks; blockIndex++)
{ {
const UniformBlock &uniformBlock = uniformBlocks[blockIndex]; const UniformBlock &uniformBlock = *uniformBlocks[blockIndex];
if(uniformBlock.name == baseName) if(uniformBlock.name == baseName)
{ {
const bool arrayElementZero = (subscript == GL_INVALID_INDEX && uniformBlock.elementIndex == 0); const bool arrayElementZero = (subscript == GL_INVALID_INDEX && uniformBlock.elementIndex == 0);
...@@ -1155,7 +1155,7 @@ namespace es2 ...@@ -1155,7 +1155,7 @@ namespace es2
for(unsigned int uniformBlockIndex = 0; uniformBlockIndex < uniformBlocks.size(); uniformBlockIndex++) for(unsigned int uniformBlockIndex = 0; uniformBlockIndex < uniformBlocks.size(); uniformBlockIndex++)
{ {
UniformBlock &uniformBlock = uniformBlocks[uniformBlockIndex]; UniformBlock &uniformBlock = *uniformBlocks[uniformBlockIndex];
GLuint blockBinding = uniformBlockBindings[uniformBlockIndex]; GLuint blockBinding = uniformBlockBindings[uniformBlockIndex];
// Unnecessary to apply an unreferenced standard or shared UBO // Unnecessary to apply an unreferenced standard or shared UBO
...@@ -1450,9 +1450,8 @@ namespace es2 ...@@ -1450,9 +1450,8 @@ namespace es2
{ {
const glsl::ActiveUniformBlocks &activeUniformBlocks = shader->activeUniformBlocks; const glsl::ActiveUniformBlocks &activeUniformBlocks = shader->activeUniformBlocks;
ASSERT(static_cast<size_t>(uniform.blockId) < activeUniformBlocks.size()); ASSERT(static_cast<size_t>(uniform.blockId) < activeUniformBlocks.size());
UniformBlockArray::iterator it = std::find(uniformBlocks.begin(), uniformBlocks.end(), UniformBlock(activeUniformBlocks[uniform.blockId].getName(), GL_INVALID_INDEX, 0, std::vector<unsigned int>())); blockIndex = getUniformBlockIndex(activeUniformBlocks[uniform.blockId].getName());
ASSERT(it != uniformBlocks.end()); ASSERT(blockIndex != GL_INVALID_INDEX);
blockIndex = (it - uniformBlocks.begin()) / sizeof(UniformBlockArray::iterator);
isRowMajorMatrix = activeUniformBlocks[uniform.blockId].isRowMajorLayout; isRowMajorMatrix = activeUniformBlocks[uniform.blockId].isRowMajorLayout;
} }
if(!defineUniform(shader->getType(), uniform.type, uniform.precision, uniform.name, uniform.arraySize, uniform.registerIndex, Uniform::BlockInfo(uniform, blockIndex, isRowMajorMatrix))) if(!defineUniform(shader->getType(), uniform.type, uniform.precision, uniform.name, uniform.arraySize, uniform.registerIndex, Uniform::BlockInfo(uniform, blockIndex, isRowMajorMatrix)))
...@@ -1697,9 +1696,9 @@ namespace es2 ...@@ -1697,9 +1696,9 @@ namespace es2
bool Program::defineUniformBlock(const Shader *shader, const glsl::UniformBlock &block) bool Program::defineUniformBlock(const Shader *shader, const glsl::UniformBlock &block)
{ {
UniformBlockArray::iterator it = std::find(uniformBlocks.begin(), uniformBlocks.end(), UniformBlock(block.getName(), 0, 0, std::vector<unsigned int>())); GLuint blockIndex = getUniformBlockIndex(block.getName());
if(it == uniformBlocks.end()) if(blockIndex == GL_INVALID_INDEX)
{ {
const glsl::ActiveUniforms &activeUniforms = shader->activeUniforms; const glsl::ActiveUniforms &activeUniforms = shader->activeUniforms;
const std::vector<int>& fields = block.fields; const std::vector<int>& fields = block.fields;
...@@ -1713,19 +1712,19 @@ namespace es2 ...@@ -1713,19 +1712,19 @@ namespace es2
{ {
for(unsigned int i = 0; i < block.arraySize; ++i) for(unsigned int i = 0; i < block.arraySize; ++i)
{ {
uniformBlocks.push_back(UniformBlock(block.getName(), i, block.dataSize, memberUniformIndexes)); uniformBlocks.push_back(new UniformBlock(block.getName(), i, block.dataSize, memberUniformIndexes));
uniformBlocks[uniformBlocks.size() - 1].setRegisterIndex(shader->getType(), block.registerIndex); uniformBlocks[uniformBlocks.size() - 1]->setRegisterIndex(shader->getType(), block.registerIndex);
} }
} }
else else
{ {
uniformBlocks.push_back(UniformBlock(block.getName(), GL_INVALID_INDEX, block.dataSize, memberUniformIndexes)); uniformBlocks.push_back(new UniformBlock(block.getName(), GL_INVALID_INDEX, block.dataSize, memberUniformIndexes));
uniformBlocks[uniformBlocks.size() - 1].setRegisterIndex(shader->getType(), block.registerIndex); uniformBlocks[uniformBlocks.size() - 1]->setRegisterIndex(shader->getType(), block.registerIndex);
} }
} }
else else
{ {
it->setRegisterIndex(shader->getType(), block.registerIndex); uniformBlocks[blockIndex]->setRegisterIndex(shader->getType(), block.registerIndex);
} }
return true; return true;
...@@ -2557,7 +2556,12 @@ namespace es2 ...@@ -2557,7 +2556,12 @@ namespace es2
uniforms.pop_back(); uniforms.pop_back();
} }
uniformBlocks.clear(); while(!uniformBlocks.empty())
{
delete uniformBlocks.back();
uniformBlocks.pop_back();
}
uniformIndex.clear(); uniformIndex.clear();
transformFeedbackLinkedVaryings.clear(); transformFeedbackLinkedVaryings.clear();
...@@ -2809,7 +2813,7 @@ namespace es2 ...@@ -2809,7 +2813,7 @@ namespace es2
{ {
ASSERT(index < getActiveUniformBlockCount()); ASSERT(index < getActiveUniformBlockCount());
const UniformBlock &uniformBlock = uniformBlocks[index]; const UniformBlock &uniformBlock = *uniformBlocks[index];
if(bufSize > 0) if(bufSize > 0)
{ {
...@@ -2846,7 +2850,7 @@ namespace es2 ...@@ -2846,7 +2850,7 @@ namespace es2
unsigned int numUniformBlocks = getActiveUniformBlockCount(); unsigned int numUniformBlocks = getActiveUniformBlockCount();
for(unsigned int uniformBlockIndex = 0; uniformBlockIndex < numUniformBlocks; uniformBlockIndex++) for(unsigned int uniformBlockIndex = 0; uniformBlockIndex < numUniformBlocks; uniformBlockIndex++)
{ {
const UniformBlock &uniformBlock = uniformBlocks[uniformBlockIndex]; const UniformBlock &uniformBlock = *uniformBlocks[uniformBlockIndex];
if(!uniformBlock.name.empty()) if(!uniformBlock.name.empty())
{ {
const int length = uniformBlock.name.length() + 1; const int length = uniformBlock.name.length() + 1;
......
...@@ -75,16 +75,13 @@ namespace es2 ...@@ -75,16 +75,13 @@ namespace es2
void setRegisterIndex(GLenum shader, unsigned int registerIndex); void setRegisterIndex(GLenum shader, unsigned int registerIndex);
// For std::find on UniformBlockArray
inline bool operator==(const UniformBlock& other) const { return name == other.name; }
bool isArrayElement() const; bool isArrayElement() const;
bool isReferencedByVertexShader() const; bool isReferencedByVertexShader() const;
bool isReferencedByFragmentShader() const; bool isReferencedByFragmentShader() const;
std::string name; const std::string name;
unsigned int elementIndex; const unsigned int elementIndex;
unsigned int dataSize; const unsigned int dataSize;
std::vector<unsigned int> memberUniformIndexes; std::vector<unsigned int> memberUniformIndexes;
...@@ -295,7 +292,7 @@ namespace es2 ...@@ -295,7 +292,7 @@ namespace es2
UniformArray uniforms; UniformArray uniforms;
typedef std::vector<UniformLocation> UniformIndex; typedef std::vector<UniformLocation> UniformIndex;
UniformIndex uniformIndex; UniformIndex uniformIndex;
typedef std::vector<UniformBlock> UniformBlockArray; typedef std::vector<UniformBlock*> UniformBlockArray;
UniformBlockArray uniformBlocks; UniformBlockArray uniformBlocks;
typedef std::vector<LinkedVarying> LinkedVaryingArray; typedef std::vector<LinkedVarying> LinkedVaryingArray;
LinkedVaryingArray transformFeedbackLinkedVaryings; LinkedVaryingArray transformFeedbackLinkedVaryings;
......
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