13c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*------------------------------------------------------------------------- 23c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * drawElements Quality Program OpenGL ES 3.1 Module 33c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * ------------------------------------------------- 43c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * 53c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Copyright 2014 The Android Open Source Project 63c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * 73c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Licensed under the Apache License, Version 2.0 (the "License"); 83c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * you may not use this file except in compliance with the License. 93c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * You may obtain a copy of the License at 103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * 113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * http://www.apache.org/licenses/LICENSE-2.0 123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * 133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Unless required by applicable law or agreed to in writing, software 143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * distributed under the License is distributed on an "AS IS" BASIS, 153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * See the License for the specific language governing permissions and 173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * limitations under the License. 183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * 193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*! 203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \file 213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief Uniform block tests. 223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/ 233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "es31fUniformBlockTests.hpp" 253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "glsUniformBlockCase.hpp" 263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "glsRandomUniformBlockCase.hpp" 273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuCommandLine.hpp" 283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "deRandom.hpp" 293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "deStringUtil.hpp" 303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 313c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing std::string; 323c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing std::vector; 333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 343c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace deqp 353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 363c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace gles31 373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 383c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace Functional 393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 403c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace 413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 433c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing gls::UniformBlockCase; 443c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing gls::RandomUniformBlockCase; 453c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing namespace gls::ub; 463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 473c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid createRandomCaseGroup (tcu::TestCaseGroup* parentGroup, Context& context, const char* groupName, const char* description, UniformBlockCase::BufferMode bufferMode, deUint32 features, int numCases, deUint32 baseSeed) 483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::TestCaseGroup* group = new tcu::TestCaseGroup(context.getTestContext(), groupName, description); 503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry parentGroup->addChild(group); 513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry baseSeed += (deUint32)context.getTestContext().getCommandLine().getBaseSeed(); 533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int ndx = 0; ndx < numCases; ndx++) 553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry group->addChild(new RandomUniformBlockCase(context.getTestContext(), context.getRenderContext(), glu::GLSL_VERSION_310_ES, 563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry de::toString(ndx).c_str(), "", bufferMode, features, (deUint32)ndx+baseSeed)); 573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 593c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass BlockBasicTypeCase : public UniformBlockCase 603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 613c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic: 623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry BlockBasicTypeCase (Context& context, const char* name, const char* description, const VarType& type, deUint32 layoutFlags, int numInstances) 633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry : UniformBlockCase(context.getTestContext(), context.getRenderContext(), name, description, glu::GLSL_VERSION_310_ES, BUFFERMODE_PER_BLOCK) 643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry UniformBlock& block = m_interface.allocBlock("Block"); 663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry block.addUniform(Uniform("var", type, 0)); 673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry block.setFlags(layoutFlags); 683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (numInstances > 0) 703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry block.setArraySize(numInstances); 723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry block.setInstanceName("block"); 733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}; 763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 773c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void createBlockBasicTypeCases (tcu::TestCaseGroup* group, Context& context, const char* name, const VarType& type, deUint32 layoutFlags, int numInstances = 0) 783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry group->addChild(new BlockBasicTypeCase(context, (string(name) + "_vertex").c_str(), "", type, layoutFlags|DECLARE_VERTEX, numInstances)); 803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry group->addChild(new BlockBasicTypeCase(context, (string(name) + "_fragment").c_str(), "", type, layoutFlags|DECLARE_FRAGMENT, numInstances)); 813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (!(layoutFlags & LAYOUT_PACKED)) 833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry group->addChild(new BlockBasicTypeCase(context, (string(name) + "_both").c_str(), "", type, layoutFlags|DECLARE_VERTEX|DECLARE_FRAGMENT, numInstances)); 843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 863c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass Block2LevelStructArrayCase : public UniformBlockCase 873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 883c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic: 893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry Block2LevelStructArrayCase (Context& context, const char* name, const char* description, deUint32 layoutFlags, BufferMode bufferMode, int numInstances) 903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry : UniformBlockCase (context.getTestContext(), context.getRenderContext(), name, description, glu::GLSL_VERSION_310_ES, bufferMode) 913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , m_layoutFlags (layoutFlags) 923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , m_numInstances (numInstances) 933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry void init (void) 973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry StructType& typeS = m_interface.allocStruct("S"); 993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry typeS.addMember("a", VarType(glu::TYPE_UINT_VEC3, PRECISION_HIGH), UNUSED_BOTH); 1003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry typeS.addMember("b", VarType(VarType(glu::TYPE_FLOAT_MAT2, PRECISION_MEDIUM), 4)); 1013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry typeS.addMember("c", VarType(glu::TYPE_UINT, PRECISION_LOW)); 1023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry UniformBlock& block = m_interface.allocBlock("Block"); 1043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry block.addUniform(Uniform("u", VarType(glu::TYPE_INT, PRECISION_MEDIUM))); 1053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry block.addUniform(Uniform("s", VarType(VarType(VarType(&typeS), 3), 2))); 1063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry block.addUniform(Uniform("v", VarType(glu::TYPE_FLOAT_VEC2, PRECISION_MEDIUM))); 1073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry block.setFlags(m_layoutFlags); 1083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (m_numInstances > 0) 1103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 1113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry block.setInstanceName("block"); 1123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry block.setArraySize(m_numInstances); 1133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 1143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 1153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1163c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate: 1173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry deUint32 m_layoutFlags; 1183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry int m_numInstances; 1193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}; 1203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // anonymous 1223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1233c827367444ee418f129b2c238299f49d3264554Jarkko PoyryUniformBlockTests::UniformBlockTests (Context& context) 1243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry : TestCaseGroup(context, "ubo", "Uniform Block tests") 1253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 1263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 1273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1283c827367444ee418f129b2c238299f49d3264554Jarkko PoyryUniformBlockTests::~UniformBlockTests (void) 1293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 1303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 1313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1323c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid UniformBlockTests::init (void) 1333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 1343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const glu::DataType basicTypes[] = 1353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 1363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry glu::TYPE_FLOAT, 1373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry glu::TYPE_FLOAT_VEC2, 1383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry glu::TYPE_FLOAT_VEC3, 1393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry glu::TYPE_FLOAT_VEC4, 1403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry glu::TYPE_INT, 1413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry glu::TYPE_INT_VEC2, 1423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry glu::TYPE_INT_VEC3, 1433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry glu::TYPE_INT_VEC4, 1443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry glu::TYPE_UINT, 1453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry glu::TYPE_UINT_VEC2, 1463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry glu::TYPE_UINT_VEC3, 1473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry glu::TYPE_UINT_VEC4, 1483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry glu::TYPE_BOOL, 1493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry glu::TYPE_BOOL_VEC2, 1503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry glu::TYPE_BOOL_VEC3, 1513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry glu::TYPE_BOOL_VEC4, 1523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry glu::TYPE_FLOAT_MAT2, 1533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry glu::TYPE_FLOAT_MAT3, 1543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry glu::TYPE_FLOAT_MAT4, 1553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry glu::TYPE_FLOAT_MAT2X3, 1563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry glu::TYPE_FLOAT_MAT2X4, 1573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry glu::TYPE_FLOAT_MAT3X2, 1583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry glu::TYPE_FLOAT_MAT3X4, 1593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry glu::TYPE_FLOAT_MAT4X2, 1603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry glu::TYPE_FLOAT_MAT4X3 1613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }; 1623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const struct 1643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 1653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const char* name; 1663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry deUint32 flags; 1673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } layoutFlags[] = 1683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 1693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { "shared", LAYOUT_SHARED }, 1703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { "packed", LAYOUT_PACKED }, 1713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { "std140", LAYOUT_STD140 } 1723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }; 1733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const struct 1753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 1763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const char* name; 1773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry deUint32 flags; 1783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } matrixFlags[] = 1793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 1803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { "row_major", LAYOUT_ROW_MAJOR }, 1813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { "column_major", LAYOUT_COLUMN_MAJOR } 1823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }; 1833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const struct 1853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 1863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const char* name; 1873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry UniformBlockCase::BufferMode mode; 1883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } bufferModes[] = 1893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 1903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { "per_block_buffer", UniformBlockCase::BUFFERMODE_PER_BLOCK }, 1913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { "single_buffer", UniformBlockCase::BUFFERMODE_SINGLE } 1923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }; 1933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // ubo.2_level_array 1953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 1963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::TestCaseGroup* nestedArrayGroup = new tcu::TestCaseGroup(m_testCtx, "2_level_array", "2-level basic array variable in single buffer"); 1973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry addChild(nestedArrayGroup); 1983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int layoutFlagNdx = 0; layoutFlagNdx < DE_LENGTH_OF_ARRAY(layoutFlags); layoutFlagNdx++) 2003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 2013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::TestCaseGroup* layoutGroup = new tcu::TestCaseGroup(m_testCtx, layoutFlags[layoutFlagNdx].name, ""); 2023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry nestedArrayGroup->addChild(layoutGroup); 2033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int basicTypeNdx = 0; basicTypeNdx < DE_LENGTH_OF_ARRAY(basicTypes); basicTypeNdx++) 2053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 2063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const glu::DataType type = basicTypes[basicTypeNdx]; 2073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const char* typeName = glu::getDataTypeName(type); 2083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const int childSize = 4; 2093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const int parentSize = 3; 2103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const VarType childType (VarType(type, glu::isDataTypeBoolOrBVec(type) ? 0 : PRECISION_HIGH), childSize); 2113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const VarType parentType (childType, parentSize); 2123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry createBlockBasicTypeCases(layoutGroup, m_context, typeName, parentType, layoutFlags[layoutFlagNdx].flags); 2143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (glu::isDataTypeMatrix(type)) 2163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 2173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int matFlagNdx = 0; matFlagNdx < DE_LENGTH_OF_ARRAY(matrixFlags); matFlagNdx++) 2183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry createBlockBasicTypeCases(layoutGroup, m_context, (string(matrixFlags[matFlagNdx].name) + "_" + typeName).c_str(), 2193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry parentType, layoutFlags[layoutFlagNdx].flags|matrixFlags[matFlagNdx].flags); 2203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 2213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 2223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 2233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 2243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // ubo.3_level_array 2263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 2273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::TestCaseGroup* nestedArrayGroup = new tcu::TestCaseGroup(m_testCtx, "3_level_array", "3-level basic array variable in single buffer"); 2283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry addChild(nestedArrayGroup); 2293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int layoutFlagNdx = 0; layoutFlagNdx < DE_LENGTH_OF_ARRAY(layoutFlags); layoutFlagNdx++) 2313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 2323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::TestCaseGroup* layoutGroup = new tcu::TestCaseGroup(m_testCtx, layoutFlags[layoutFlagNdx].name, ""); 2333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry nestedArrayGroup->addChild(layoutGroup); 2343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int basicTypeNdx = 0; basicTypeNdx < DE_LENGTH_OF_ARRAY(basicTypes); basicTypeNdx++) 2363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 2373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const glu::DataType type = basicTypes[basicTypeNdx]; 2383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const char* typeName = glu::getDataTypeName(type); 2393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const int childSize0 = 2; 2403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const int childSize1 = 4; 2413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const int parentSize = 3; 2423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const VarType childType0 (VarType(type, glu::isDataTypeBoolOrBVec(type) ? 0 : PRECISION_HIGH), childSize0); 2433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const VarType childType1 (childType0, childSize1); 2443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const VarType parentType (childType1, parentSize); 2453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry createBlockBasicTypeCases(layoutGroup, m_context, typeName, parentType, layoutFlags[layoutFlagNdx].flags); 2473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (glu::isDataTypeMatrix(type)) 2493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 2503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int matFlagNdx = 0; matFlagNdx < DE_LENGTH_OF_ARRAY(matrixFlags); matFlagNdx++) 2513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry createBlockBasicTypeCases(layoutGroup, m_context, (string(matrixFlags[matFlagNdx].name) + "_" + typeName).c_str(), 2523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry parentType, layoutFlags[layoutFlagNdx].flags|matrixFlags[matFlagNdx].flags); 2533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 2543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 2553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 2563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 2573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // ubo.2_level_struct_array 2593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 2603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::TestCaseGroup* structArrayArrayGroup = new tcu::TestCaseGroup(m_testCtx, "2_level_struct_array", "Struct array in one uniform block"); 2613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry addChild(structArrayArrayGroup); 2623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int modeNdx = 0; modeNdx < DE_LENGTH_OF_ARRAY(bufferModes); modeNdx++) 2643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 2653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::TestCaseGroup* modeGroup = new tcu::TestCaseGroup(m_testCtx, bufferModes[modeNdx].name, ""); 2663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry structArrayArrayGroup->addChild(modeGroup); 2673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int layoutFlagNdx = 0; layoutFlagNdx < DE_LENGTH_OF_ARRAY(layoutFlags); layoutFlagNdx++) 2693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 2703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int isArray = 0; isArray < 2; isArray++) 2713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 2723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry std::string baseName = layoutFlags[layoutFlagNdx].name; 2733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry deUint32 baseFlags = layoutFlags[layoutFlagNdx].flags; 2743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (bufferModes[modeNdx].mode == UniformBlockCase::BUFFERMODE_SINGLE && isArray == 0) 2763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry continue; // Doesn't make sense to add this variant. 2773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (isArray) 2793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry baseName += "_instance_array"; 2803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry modeGroup->addChild(new Block2LevelStructArrayCase(m_context, (baseName + "_vertex").c_str(), "", baseFlags|DECLARE_VERTEX, bufferModes[modeNdx].mode, isArray ? 3 : 0)); 2823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry modeGroup->addChild(new Block2LevelStructArrayCase(m_context, (baseName + "_fragment").c_str(), "", baseFlags|DECLARE_FRAGMENT, bufferModes[modeNdx].mode, isArray ? 3 : 0)); 2833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (!(baseFlags & LAYOUT_PACKED)) 2853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry modeGroup->addChild(new Block2LevelStructArrayCase(m_context, (baseName + "_both").c_str(), "", baseFlags|DECLARE_VERTEX|DECLARE_FRAGMENT, bufferModes[modeNdx].mode, isArray ? 3 : 0)); 2863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 2873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 2883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 2893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 2903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // ubo.random 2923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 2933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const deUint32 allShaders = FEATURE_VERTEX_BLOCKS|FEATURE_FRAGMENT_BLOCKS|FEATURE_SHARED_BLOCKS; 2943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const deUint32 allLayouts = FEATURE_PACKED_LAYOUT|FEATURE_SHARED_LAYOUT|FEATURE_STD140_LAYOUT; 2953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const deUint32 allBasicTypes = FEATURE_VECTORS|FEATURE_MATRICES; 2963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const deUint32 unused = FEATURE_UNUSED_MEMBERS|FEATURE_UNUSED_UNIFORMS; 2973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const deUint32 matFlags = FEATURE_MATRIX_LAYOUT; 2983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const deUint32 basicTypeArrays = allShaders|allLayouts|unused|allBasicTypes|matFlags|FEATURE_ARRAYS|FEATURE_ARRAYS_OF_ARRAYS; 2993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const deUint32 allFeatures = ~0u; 3003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::TestCaseGroup* randomGroup = new tcu::TestCaseGroup(m_testCtx, "random", "Random Uniform Block cases"); 3023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry addChild(randomGroup); 3033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry createRandomCaseGroup(randomGroup, m_context, "basic_type_arrays", "Arrays, per-block buffers", UniformBlockCase::BUFFERMODE_PER_BLOCK, basicTypeArrays, 25, 1150); 3053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry createRandomCaseGroup(randomGroup, m_context, "all_per_block_buffers", "All random features, per-block buffers", UniformBlockCase::BUFFERMODE_PER_BLOCK, allFeatures, 50, 11200); 3063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry createRandomCaseGroup(randomGroup, m_context, "all_shared_buffer", "All random features, shared buffer", UniformBlockCase::BUFFERMODE_SINGLE, allFeatures, 50, 11250); 3073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 3083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 3093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // Functional 3113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // gles31 3123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // deqp 313