resolve merge conflicts of a9ffcc1 to master
authorPyry Haulos <phaulos@google.com>
Mon, 13 Jun 2016 22:21:10 +0000 (15:21 -0700)
committerPyry Haulos <phaulos@google.com>
Mon, 13 Jun 2016 22:21:10 +0000 (15:21 -0700)
Change-Id: I35f661fbec0f2118af483f4a73004f2f8b94528e

android/cts/master/com.drawelements.deqp.vk.xml
android/cts/master/vk-master.txt
external/vulkancts/modules/vulkan/ubo/vktUniformBlockCase.cpp
external/vulkancts/modules/vulkan/ubo/vktUniformBlockCase.hpp
external/vulkancts/modules/vulkan/ubo/vktUniformBlockTests.cpp

index b803f40..c17d3cd 100644 (file)
                                        </Test>
                                </TestCase>
                        </TestSuite>
+                       <TestCase name="link_by_binding">
+                               <Test name="single_buf_single_instance">
+                                       <TestInstance/>
+                               </Test>
+                               <Test name="single_buf_instance_array">
+                                       <TestInstance/>
+                               </Test>
+                               <Test name="per_block_buf_single_instance">
+                                       <TestInstance/>
+                               </Test>
+                               <Test name="per_block_buf_instance_array">
+                                       <TestInstance/>
+                               </Test>
+                       </TestCase>
                        <TestSuite name="random">
                                <TestCase name="scalar_types">
                                        <Test name="0">
index 15d2cb8..701a571 100644 (file)
@@ -80949,6 +80949,10 @@ dEQP-VK.ubo.multi_nested_struct.single_buffer.std140_instance_array_vertex_comp_
 dEQP-VK.ubo.multi_nested_struct.single_buffer.std140_instance_array_fragment_comp_access
 dEQP-VK.ubo.multi_nested_struct.single_buffer.std140_instance_array_both_comp_access
 dEQP-VK.ubo.multi_nested_struct.single_buffer.std140_instance_array_mixed_comp_access
+dEQP-VK.ubo.link_by_binding.single_buf_single_instance
+dEQP-VK.ubo.link_by_binding.single_buf_instance_array
+dEQP-VK.ubo.link_by_binding.per_block_buf_single_instance
+dEQP-VK.ubo.link_by_binding.per_block_buf_instance_array
 dEQP-VK.ubo.random.scalar_types.0
 dEQP-VK.ubo.random.scalar_types.1
 dEQP-VK.ubo.random.scalar_types.2
index cf8421e..6bd85a1 100644 (file)
@@ -165,7 +165,7 @@ std::ostream& operator<< (std::ostream& stream, const UniformLayoutEntry& entry)
 {
        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
@@ -174,22 +174,24 @@ std::ostream& operator<< (std::ostream& stream, const UniformLayoutEntry& entry)
        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;
        }
 
@@ -423,7 +425,7 @@ void computeStd140Layout (UniformLayout& layout, int& curOffset, int curBlockNdx
                entry.size                      = 1;
                entry.arrayStride       = 0;
                entry.matrixStride      = 0;
-               entry.blockNdx          = curBlockNdx;
+               entry.blockLayoutNdx= curBlockNdx;
 
                if (glu::isDataTypeMatrix(basicType))
                {
@@ -464,7 +466,7 @@ void computeStd140Layout (UniformLayout& layout, int& curOffset, int curBlockNdx
 
                        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;
@@ -488,7 +490,7 @@ void computeStd140Layout (UniformLayout& layout, int& curOffset, int curBlockNdx
 
                        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;
@@ -551,6 +553,7 @@ void computeStd140Layout (UniformLayout& layout, const ShaderInterface& interfac
                        blockEntry.name = block.getBlockName();
                        blockEntry.size = blockSize;
                        blockEntry.bindingNdx = blockNdx;
+                       blockEntry.blockDeclarationNdx = blockNdx;
                        blockEntry.instanceNdx = instanceNdx;
 
                        // Compute active uniform set for block.
@@ -1131,6 +1134,7 @@ void generateCompareSrc (std::ostringstream&      src,
                                                 const std::string&             srcName,
                                                 const std::string&             apiName,
                                                 const UniformLayout&   layout,
+                                                int                                    blockNdx,
                                                 const void*                    basePtr,
                                                 deUint32                               unusedMask,
                                                 MatrixLoadFlags                matrixLoadFlag)
@@ -1142,7 +1146,7 @@ void generateCompareSrc (std::ostringstream&      src,
                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)
@@ -1168,7 +1172,7 @@ void generateCompareSrc (std::ostringstream&      src,
                        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
@@ -1183,7 +1187,7 @@ void generateCompareSrc (std::ostringstream&      src,
                        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);
                }
        }
 }
@@ -1218,8 +1222,8 @@ void generateCompareSrc (std::ostringstream& src,
                        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++)
                        {
@@ -1230,7 +1234,7 @@ void generateCompareSrc (std::ostringstream& src,
 
                                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);
                        }
                }
        }
index 24ea671..bb7cdef 100644 (file)
@@ -234,13 +234,17 @@ private:
 struct BlockLayoutEntry
 {
        BlockLayoutEntry (void)
-               : size(0)
+               : size                                  (0)
+               , blockDeclarationNdx   (-1)
+               , bindingNdx                    (-1)
+               , instanceNdx                   (-1)
        {
        }
 
        std::string                     name;
        int                                     size;
        std::vector<int>        activeUniformIndices;
+       int                                     blockDeclarationNdx;
        int                                     bindingNdx;
        int                                     instanceNdx;
 };
@@ -250,7 +254,7 @@ struct UniformLayoutEntry
        UniformLayoutEntry (void)
                : type                  (glu::TYPE_LAST)
                , size                  (0)
-               , blockNdx              (-1)
+               , blockLayoutNdx(-1)
                , offset                (-1)
                , arrayStride   (-1)
                , matrixStride  (-1)
@@ -262,7 +266,7 @@ struct UniformLayoutEntry
        std::string                     name;
        glu::DataType           type;
        int                                     size;
-       int                                     blockNdx;
+       int                                     blockLayoutNdx;
        int                                     offset;
        int                                     arrayStride;
        int                                     matrixStride;
@@ -276,8 +280,8 @@ public:
        std::vector<BlockLayoutEntry>           blocks;
        std::vector<UniformLayoutEntry>         uniforms;
 
-       int                                                                     getUniformIndex                 (const std::string& name) const;
-       int                                                                     getBlockIndex                   (const std::string& name) const;
+       int                                                                     getUniformLayoutIndex   (int blockDeclarationNdx, const std::string& name) const;
+       int                                                                     getBlockLayoutIndex             (int blockDeclarationNdx, int instanceNdx) const;
 };
 
 class UniformBlockCase : public vkt::TestCase
index c46c052..ed97d01 100644 (file)
@@ -290,6 +290,37 @@ private:
        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);
@@ -796,6 +827,17 @@ void UniformBlockTests::init (void)
                }
        }
 
+       // .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;