{
stream << entry.name << " { type = " << glu::getDataTypeName(entry.type)
<< ", size = " << entry.size
- << ", blockNdx = " << entry.blockNdx
+ << ", blockNdx = " << entry.blockLayoutNdx
<< ", offset = " << entry.offset
<< ", arrayStride = " << entry.arrayStride
<< ", matrixStride = " << entry.matrixStride
return stream;
}
-int UniformLayout::getUniformIndex (const std::string& name) const
+int UniformLayout::getUniformLayoutIndex (int blockNdx, const std::string& name) const
{
for (int ndx = 0; ndx < (int)uniforms.size(); ndx++)
{
- if (uniforms[ndx].name == name)
+ if (blocks[uniforms[ndx].blockLayoutNdx].blockDeclarationNdx == blockNdx &&
+ uniforms[ndx].name == name)
return ndx;
}
return -1;
}
-int UniformLayout::getBlockIndex (const std::string& name) const
+int UniformLayout::getBlockLayoutIndex (int blockNdx, int instanceNdx) const
{
for (int ndx = 0; ndx < (int)blocks.size(); ndx++)
{
- if (blocks[ndx].name == name)
+ if (blocks[ndx].blockDeclarationNdx == blockNdx &&
+ blocks[ndx].instanceNdx == instanceNdx)
return ndx;
}
entry.size = 1;
entry.arrayStride = 0;
entry.matrixStride = 0;
- entry.blockNdx = curBlockNdx;
+ entry.blockLayoutNdx= curBlockNdx;
if (glu::isDataTypeMatrix(basicType))
{
entry.name = curPrefix + "[0]"; // Array uniforms are always postfixed with [0]
entry.type = elemBasicType;
- entry.blockNdx = curBlockNdx;
+ entry.blockLayoutNdx= curBlockNdx;
entry.offset = curOffset;
entry.size = type.getArraySize();
entry.arrayStride = stride;
entry.name = curPrefix + "[0]"; // Array uniforms are always postfixed with [0]
entry.type = elemBasicType;
- entry.blockNdx = curBlockNdx;
+ entry.blockLayoutNdx= curBlockNdx;
entry.offset = curOffset;
entry.size = type.getArraySize();
entry.arrayStride = stride*numVecs;
blockEntry.name = block.getBlockName();
blockEntry.size = blockSize;
blockEntry.bindingNdx = blockNdx;
+ blockEntry.blockDeclarationNdx = blockNdx;
blockEntry.instanceNdx = instanceNdx;
// Compute active uniform set for block.
const std::string& srcName,
const std::string& apiName,
const UniformLayout& layout,
+ int blockNdx,
const void* basePtr,
deUint32 unusedMask,
MatrixLoadFlags matrixLoadFlag)
glu::DataType elementType = isArray ? type.getElementType().getBasicType() : type.getBasicType();
const char* typeName = glu::getDataTypeName(elementType);
std::string fullApiName = std::string(apiName) + (isArray ? "[0]" : ""); // Arrays are always postfixed with [0]
- int uniformNdx = layout.getUniformIndex(fullApiName);
+ int uniformNdx = layout.getUniformLayoutIndex(blockNdx, fullApiName);
const UniformLayoutEntry& entry = layout.uniforms[uniformNdx];
if (isArray)
std::string op = std::string("[") + de::toString(elementNdx) + "]";
std::string elementSrcName = std::string(srcName) + op;
std::string elementApiName = std::string(apiName) + op;
- generateCompareSrc(src, resultVar, elementType, elementSrcName, elementApiName, layout, basePtr, unusedMask, LOAD_FULL_MATRIX);
+ generateCompareSrc(src, resultVar, elementType, elementSrcName, elementApiName, layout, blockNdx, basePtr, unusedMask, LOAD_FULL_MATRIX);
}
}
else
std::string op = std::string(".") + memberIter->getName();
std::string memberSrcName = std::string(srcName) + op;
std::string memberApiName = std::string(apiName) + op;
- generateCompareSrc(src, resultVar, memberIter->getType(), memberSrcName, memberApiName, layout, basePtr, unusedMask, LOAD_FULL_MATRIX);
+ generateCompareSrc(src, resultVar, memberIter->getType(), memberSrcName, memberApiName, layout, blockNdx, basePtr, unusedMask, LOAD_FULL_MATRIX);
}
}
}
std::string instancePostfix = isArray ? std::string("[") + de::toString(instanceNdx) + "]" : std::string("");
std::string blockInstanceName = block.getBlockName() + instancePostfix;
std::string srcPrefix = hasInstanceName ? block.getInstanceName() + instancePostfix + "." : std::string("");
- int activeBlockNdx = layout.getBlockIndex(blockInstanceName);
- void* basePtr = blockPointers.find(activeBlockNdx)->second;
+ int blockLayoutNdx = layout.getBlockLayoutIndex(blockNdx, instanceNdx);
+ void* basePtr = blockPointers.find(blockLayoutNdx)->second;
for (UniformBlock::ConstIterator uniformIter = block.begin(); uniformIter != block.end(); uniformIter++)
{
std::string srcName = srcPrefix + uniform.getName();
std::string apiName = apiPrefix + uniform.getName();
- generateCompareSrc(src, resultVar, uniform.getType(), srcName, apiName, layout, basePtr, unusedMask, matrixLoadFlag);
+ generateCompareSrc(src, resultVar, uniform.getType(), srcName, apiName, layout, blockNdx, basePtr, unusedMask, matrixLoadFlag);
}
}
}
int m_numInstances;
};
+class LinkByBindingCase : public UniformBlockCase
+{
+public:
+ LinkByBindingCase (tcu::TestContext& testCtx, const std::string& name, const std::string& description, BufferMode bufferMode, int numInstances)
+ : UniformBlockCase (testCtx, name, description, bufferMode, LOAD_FULL_MATRIX)
+ {
+ UniformBlock& blockA = m_interface.allocBlock("TestBlock");
+ blockA.addUniform(Uniform("a", VarType(glu::TYPE_FLOAT, PRECISION_HIGH)));
+ blockA.addUniform(Uniform("b", VarType(glu::TYPE_UINT_VEC3, PRECISION_LOW), UNUSED_BOTH));
+ blockA.addUniform(Uniform("c", VarType(glu::TYPE_FLOAT_MAT2, PRECISION_MEDIUM)));
+ blockA.setFlags(LAYOUT_STD140|DECLARE_VERTEX);
+
+ UniformBlock& blockB = m_interface.allocBlock("TestBlock");
+ blockB.addUniform(Uniform("a", VarType(glu::TYPE_FLOAT_MAT3, PRECISION_MEDIUM)));
+ blockB.addUniform(Uniform("b", VarType(glu::TYPE_INT_VEC2, PRECISION_LOW)));
+ blockB.addUniform(Uniform("c", VarType(glu::TYPE_FLOAT_VEC4, PRECISION_HIGH), UNUSED_BOTH));
+ blockB.addUniform(Uniform("d", VarType(glu::TYPE_BOOL, 0)));
+ blockB.setFlags(LAYOUT_STD140|DECLARE_FRAGMENT);
+
+ if (numInstances > 0)
+ {
+ blockA.setInstanceName("testBlock");
+ blockA.setArraySize(numInstances);
+ blockB.setInstanceName("testBlock");
+ blockB.setArraySize(numInstances);
+ }
+
+ init();
+ }
+};
+
void createRandomCaseGroup (tcu::TestCaseGroup* parentGroup, tcu::TestContext& testCtx, const char* groupName, const char* description, UniformBlockCase::BufferMode bufferMode, deUint32 features, int numCases, deUint32 baseSeed)
{
tcu::TestCaseGroup* group = new tcu::TestCaseGroup(testCtx, groupName, description);
}
}
+ // .link_by_binding
+ {
+ tcu::TestCaseGroup* linkByBindingGroup = new tcu::TestCaseGroup(m_testCtx, "link_by_binding", "Blocks with same name but different binding");
+ addChild(linkByBindingGroup);
+
+ linkByBindingGroup->addChild(new LinkByBindingCase(m_testCtx, "single_buf_single_instance", "", UniformBlockCase::BUFFERMODE_SINGLE, 0));
+ linkByBindingGroup->addChild(new LinkByBindingCase(m_testCtx, "single_buf_instance_array", "", UniformBlockCase::BUFFERMODE_SINGLE, 2));
+ linkByBindingGroup->addChild(new LinkByBindingCase(m_testCtx, "per_block_buf_single_instance", "", UniformBlockCase::BUFFERMODE_PER_BLOCK, 0));
+ linkByBindingGroup->addChild(new LinkByBindingCase(m_testCtx, "per_block_buf_instance_array", "", UniformBlockCase::BUFFERMODE_PER_BLOCK, 2));
+ }
+
// ubo.random
{
const deUint32 allShaders = FEATURE_VERTEX_BLOCKS|FEATURE_FRAGMENT_BLOCKS|FEATURE_SHARED_BLOCKS;