1e5c31af7Sopenharmony_ci/*------------------------------------------------------------------------- 2e5c31af7Sopenharmony_ci * drawElements Quality Program OpenGL ES 3.1 Module 3e5c31af7Sopenharmony_ci * ------------------------------------------------- 4e5c31af7Sopenharmony_ci * 5e5c31af7Sopenharmony_ci * Copyright 2014 The Android Open Source Project 6e5c31af7Sopenharmony_ci * 7e5c31af7Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 8e5c31af7Sopenharmony_ci * you may not use this file except in compliance with the License. 9e5c31af7Sopenharmony_ci * You may obtain a copy of the License at 10e5c31af7Sopenharmony_ci * 11e5c31af7Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 12e5c31af7Sopenharmony_ci * 13e5c31af7Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 14e5c31af7Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 15e5c31af7Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16e5c31af7Sopenharmony_ci * See the License for the specific language governing permissions and 17e5c31af7Sopenharmony_ci * limitations under the License. 18e5c31af7Sopenharmony_ci * 19e5c31af7Sopenharmony_ci *//*! 20e5c31af7Sopenharmony_ci * \file 21e5c31af7Sopenharmony_ci * \brief Uniform block tests. 22e5c31af7Sopenharmony_ci *//*--------------------------------------------------------------------*/ 23e5c31af7Sopenharmony_ci 24e5c31af7Sopenharmony_ci#include "es31fUniformBlockTests.hpp" 25e5c31af7Sopenharmony_ci#include "glsUniformBlockCase.hpp" 26e5c31af7Sopenharmony_ci#include "glsRandomUniformBlockCase.hpp" 27e5c31af7Sopenharmony_ci#include "tcuCommandLine.hpp" 28e5c31af7Sopenharmony_ci#include "deRandom.hpp" 29e5c31af7Sopenharmony_ci#include "deStringUtil.hpp" 30e5c31af7Sopenharmony_ci 31e5c31af7Sopenharmony_ciusing std::string; 32e5c31af7Sopenharmony_ciusing std::vector; 33e5c31af7Sopenharmony_ci 34e5c31af7Sopenharmony_cinamespace deqp 35e5c31af7Sopenharmony_ci{ 36e5c31af7Sopenharmony_cinamespace gles31 37e5c31af7Sopenharmony_ci{ 38e5c31af7Sopenharmony_cinamespace Functional 39e5c31af7Sopenharmony_ci{ 40e5c31af7Sopenharmony_cinamespace 41e5c31af7Sopenharmony_ci{ 42e5c31af7Sopenharmony_ci 43e5c31af7Sopenharmony_ciusing gls::UniformBlockCase; 44e5c31af7Sopenharmony_ciusing gls::RandomUniformBlockCase; 45e5c31af7Sopenharmony_ciusing namespace gls::ub; 46e5c31af7Sopenharmony_ci 47e5c31af7Sopenharmony_civoid createRandomCaseGroup (tcu::TestCaseGroup* parentGroup, Context& context, const char* groupName, const char* description, UniformBlockCase::BufferMode bufferMode, deUint32 features, int numCases, deUint32 baseSeed) 48e5c31af7Sopenharmony_ci{ 49e5c31af7Sopenharmony_ci tcu::TestCaseGroup* group = new tcu::TestCaseGroup(context.getTestContext(), groupName, description); 50e5c31af7Sopenharmony_ci parentGroup->addChild(group); 51e5c31af7Sopenharmony_ci 52e5c31af7Sopenharmony_ci baseSeed += (deUint32)context.getTestContext().getCommandLine().getBaseSeed(); 53e5c31af7Sopenharmony_ci 54e5c31af7Sopenharmony_ci for (int ndx = 0; ndx < numCases; ndx++) 55e5c31af7Sopenharmony_ci group->addChild(new RandomUniformBlockCase(context.getTestContext(), context.getRenderContext(), glu::GLSL_VERSION_310_ES, 56e5c31af7Sopenharmony_ci de::toString(ndx).c_str(), "", bufferMode, features, (deUint32)ndx+baseSeed)); 57e5c31af7Sopenharmony_ci} 58e5c31af7Sopenharmony_ci 59e5c31af7Sopenharmony_ciclass BlockBasicTypeCase : public UniformBlockCase 60e5c31af7Sopenharmony_ci{ 61e5c31af7Sopenharmony_cipublic: 62e5c31af7Sopenharmony_ci BlockBasicTypeCase (Context& context, const char* name, const char* description, const VarType& type, deUint32 layoutFlags, int numInstances) 63e5c31af7Sopenharmony_ci : UniformBlockCase(context.getTestContext(), context.getRenderContext(), name, description, glu::GLSL_VERSION_310_ES, BUFFERMODE_PER_BLOCK) 64e5c31af7Sopenharmony_ci { 65e5c31af7Sopenharmony_ci UniformBlock& block = m_interface.allocBlock("Block"); 66e5c31af7Sopenharmony_ci block.addUniform(Uniform("var", type, 0)); 67e5c31af7Sopenharmony_ci block.setFlags(layoutFlags); 68e5c31af7Sopenharmony_ci 69e5c31af7Sopenharmony_ci if (numInstances > 0) 70e5c31af7Sopenharmony_ci { 71e5c31af7Sopenharmony_ci block.setArraySize(numInstances); 72e5c31af7Sopenharmony_ci block.setInstanceName("block"); 73e5c31af7Sopenharmony_ci } 74e5c31af7Sopenharmony_ci } 75e5c31af7Sopenharmony_ci}; 76e5c31af7Sopenharmony_ci 77e5c31af7Sopenharmony_cistatic void createBlockBasicTypeCases (tcu::TestCaseGroup* group, Context& context, const char* name, const VarType& type, deUint32 layoutFlags, int numInstances = 0) 78e5c31af7Sopenharmony_ci{ 79e5c31af7Sopenharmony_ci group->addChild(new BlockBasicTypeCase(context, (string(name) + "_vertex").c_str(), "", type, layoutFlags|DECLARE_VERTEX, numInstances)); 80e5c31af7Sopenharmony_ci group->addChild(new BlockBasicTypeCase(context, (string(name) + "_fragment").c_str(), "", type, layoutFlags|DECLARE_FRAGMENT, numInstances)); 81e5c31af7Sopenharmony_ci 82e5c31af7Sopenharmony_ci if (!(layoutFlags & LAYOUT_PACKED)) 83e5c31af7Sopenharmony_ci group->addChild(new BlockBasicTypeCase(context, (string(name) + "_both").c_str(), "", type, layoutFlags|DECLARE_VERTEX|DECLARE_FRAGMENT, numInstances)); 84e5c31af7Sopenharmony_ci} 85e5c31af7Sopenharmony_ci 86e5c31af7Sopenharmony_ciclass Block2LevelStructArrayCase : public UniformBlockCase 87e5c31af7Sopenharmony_ci{ 88e5c31af7Sopenharmony_cipublic: 89e5c31af7Sopenharmony_ci Block2LevelStructArrayCase (Context& context, const char* name, const char* description, deUint32 layoutFlags, BufferMode bufferMode, int numInstances) 90e5c31af7Sopenharmony_ci : UniformBlockCase (context.getTestContext(), context.getRenderContext(), name, description, glu::GLSL_VERSION_310_ES, bufferMode) 91e5c31af7Sopenharmony_ci , m_layoutFlags (layoutFlags) 92e5c31af7Sopenharmony_ci , m_numInstances (numInstances) 93e5c31af7Sopenharmony_ci { 94e5c31af7Sopenharmony_ci } 95e5c31af7Sopenharmony_ci 96e5c31af7Sopenharmony_ci void init (void) 97e5c31af7Sopenharmony_ci { 98e5c31af7Sopenharmony_ci StructType& typeS = m_interface.allocStruct("S"); 99e5c31af7Sopenharmony_ci typeS.addMember("a", VarType(glu::TYPE_UINT_VEC3, PRECISION_HIGH), UNUSED_BOTH); 100e5c31af7Sopenharmony_ci typeS.addMember("b", VarType(VarType(glu::TYPE_FLOAT_MAT2, PRECISION_MEDIUM), 4)); 101e5c31af7Sopenharmony_ci typeS.addMember("c", VarType(glu::TYPE_UINT, PRECISION_LOW)); 102e5c31af7Sopenharmony_ci 103e5c31af7Sopenharmony_ci UniformBlock& block = m_interface.allocBlock("Block"); 104e5c31af7Sopenharmony_ci block.addUniform(Uniform("u", VarType(glu::TYPE_INT, PRECISION_MEDIUM))); 105e5c31af7Sopenharmony_ci block.addUniform(Uniform("s", VarType(VarType(VarType(&typeS), 3), 2))); 106e5c31af7Sopenharmony_ci block.addUniform(Uniform("v", VarType(glu::TYPE_FLOAT_VEC2, PRECISION_MEDIUM))); 107e5c31af7Sopenharmony_ci block.setFlags(m_layoutFlags); 108e5c31af7Sopenharmony_ci 109e5c31af7Sopenharmony_ci if (m_numInstances > 0) 110e5c31af7Sopenharmony_ci { 111e5c31af7Sopenharmony_ci block.setInstanceName("block"); 112e5c31af7Sopenharmony_ci block.setArraySize(m_numInstances); 113e5c31af7Sopenharmony_ci } 114e5c31af7Sopenharmony_ci } 115e5c31af7Sopenharmony_ci 116e5c31af7Sopenharmony_ciprivate: 117e5c31af7Sopenharmony_ci deUint32 m_layoutFlags; 118e5c31af7Sopenharmony_ci int m_numInstances; 119e5c31af7Sopenharmony_ci}; 120e5c31af7Sopenharmony_ci 121e5c31af7Sopenharmony_ci} // anonymous 122e5c31af7Sopenharmony_ci 123e5c31af7Sopenharmony_ciUniformBlockTests::UniformBlockTests (Context& context) 124e5c31af7Sopenharmony_ci : TestCaseGroup(context, "ubo", "Uniform Block tests") 125e5c31af7Sopenharmony_ci{ 126e5c31af7Sopenharmony_ci} 127e5c31af7Sopenharmony_ci 128e5c31af7Sopenharmony_ciUniformBlockTests::~UniformBlockTests (void) 129e5c31af7Sopenharmony_ci{ 130e5c31af7Sopenharmony_ci} 131e5c31af7Sopenharmony_ci 132e5c31af7Sopenharmony_civoid UniformBlockTests::init (void) 133e5c31af7Sopenharmony_ci{ 134e5c31af7Sopenharmony_ci static const glu::DataType basicTypes[] = 135e5c31af7Sopenharmony_ci { 136e5c31af7Sopenharmony_ci glu::TYPE_FLOAT, 137e5c31af7Sopenharmony_ci glu::TYPE_FLOAT_VEC2, 138e5c31af7Sopenharmony_ci glu::TYPE_FLOAT_VEC3, 139e5c31af7Sopenharmony_ci glu::TYPE_FLOAT_VEC4, 140e5c31af7Sopenharmony_ci glu::TYPE_INT, 141e5c31af7Sopenharmony_ci glu::TYPE_INT_VEC2, 142e5c31af7Sopenharmony_ci glu::TYPE_INT_VEC3, 143e5c31af7Sopenharmony_ci glu::TYPE_INT_VEC4, 144e5c31af7Sopenharmony_ci glu::TYPE_UINT, 145e5c31af7Sopenharmony_ci glu::TYPE_UINT_VEC2, 146e5c31af7Sopenharmony_ci glu::TYPE_UINT_VEC3, 147e5c31af7Sopenharmony_ci glu::TYPE_UINT_VEC4, 148e5c31af7Sopenharmony_ci glu::TYPE_BOOL, 149e5c31af7Sopenharmony_ci glu::TYPE_BOOL_VEC2, 150e5c31af7Sopenharmony_ci glu::TYPE_BOOL_VEC3, 151e5c31af7Sopenharmony_ci glu::TYPE_BOOL_VEC4, 152e5c31af7Sopenharmony_ci glu::TYPE_FLOAT_MAT2, 153e5c31af7Sopenharmony_ci glu::TYPE_FLOAT_MAT3, 154e5c31af7Sopenharmony_ci glu::TYPE_FLOAT_MAT4, 155e5c31af7Sopenharmony_ci glu::TYPE_FLOAT_MAT2X3, 156e5c31af7Sopenharmony_ci glu::TYPE_FLOAT_MAT2X4, 157e5c31af7Sopenharmony_ci glu::TYPE_FLOAT_MAT3X2, 158e5c31af7Sopenharmony_ci glu::TYPE_FLOAT_MAT3X4, 159e5c31af7Sopenharmony_ci glu::TYPE_FLOAT_MAT4X2, 160e5c31af7Sopenharmony_ci glu::TYPE_FLOAT_MAT4X3 161e5c31af7Sopenharmony_ci }; 162e5c31af7Sopenharmony_ci 163e5c31af7Sopenharmony_ci static const struct 164e5c31af7Sopenharmony_ci { 165e5c31af7Sopenharmony_ci const char* name; 166e5c31af7Sopenharmony_ci deUint32 flags; 167e5c31af7Sopenharmony_ci } layoutFlags[] = 168e5c31af7Sopenharmony_ci { 169e5c31af7Sopenharmony_ci { "shared", LAYOUT_SHARED }, 170e5c31af7Sopenharmony_ci { "packed", LAYOUT_PACKED }, 171e5c31af7Sopenharmony_ci { "std140", LAYOUT_STD140 } 172e5c31af7Sopenharmony_ci }; 173e5c31af7Sopenharmony_ci 174e5c31af7Sopenharmony_ci static const struct 175e5c31af7Sopenharmony_ci { 176e5c31af7Sopenharmony_ci const char* name; 177e5c31af7Sopenharmony_ci deUint32 flags; 178e5c31af7Sopenharmony_ci } matrixFlags[] = 179e5c31af7Sopenharmony_ci { 180e5c31af7Sopenharmony_ci { "row_major", LAYOUT_ROW_MAJOR }, 181e5c31af7Sopenharmony_ci { "column_major", LAYOUT_COLUMN_MAJOR } 182e5c31af7Sopenharmony_ci }; 183e5c31af7Sopenharmony_ci 184e5c31af7Sopenharmony_ci static const struct 185e5c31af7Sopenharmony_ci { 186e5c31af7Sopenharmony_ci const char* name; 187e5c31af7Sopenharmony_ci UniformBlockCase::BufferMode mode; 188e5c31af7Sopenharmony_ci } bufferModes[] = 189e5c31af7Sopenharmony_ci { 190e5c31af7Sopenharmony_ci { "per_block_buffer", UniformBlockCase::BUFFERMODE_PER_BLOCK }, 191e5c31af7Sopenharmony_ci { "single_buffer", UniformBlockCase::BUFFERMODE_SINGLE } 192e5c31af7Sopenharmony_ci }; 193e5c31af7Sopenharmony_ci 194e5c31af7Sopenharmony_ci // ubo.2_level_array 195e5c31af7Sopenharmony_ci { 196e5c31af7Sopenharmony_ci tcu::TestCaseGroup* nestedArrayGroup = new tcu::TestCaseGroup(m_testCtx, "2_level_array", "2-level basic array variable in single buffer"); 197e5c31af7Sopenharmony_ci addChild(nestedArrayGroup); 198e5c31af7Sopenharmony_ci 199e5c31af7Sopenharmony_ci for (int layoutFlagNdx = 0; layoutFlagNdx < DE_LENGTH_OF_ARRAY(layoutFlags); layoutFlagNdx++) 200e5c31af7Sopenharmony_ci { 201e5c31af7Sopenharmony_ci tcu::TestCaseGroup* layoutGroup = new tcu::TestCaseGroup(m_testCtx, layoutFlags[layoutFlagNdx].name, ""); 202e5c31af7Sopenharmony_ci nestedArrayGroup->addChild(layoutGroup); 203e5c31af7Sopenharmony_ci 204e5c31af7Sopenharmony_ci for (int basicTypeNdx = 0; basicTypeNdx < DE_LENGTH_OF_ARRAY(basicTypes); basicTypeNdx++) 205e5c31af7Sopenharmony_ci { 206e5c31af7Sopenharmony_ci const glu::DataType type = basicTypes[basicTypeNdx]; 207e5c31af7Sopenharmony_ci const char* typeName = glu::getDataTypeName(type); 208e5c31af7Sopenharmony_ci const int childSize = 4; 209e5c31af7Sopenharmony_ci const int parentSize = 3; 210e5c31af7Sopenharmony_ci const VarType childType (VarType(type, glu::isDataTypeBoolOrBVec(type) ? 0 : PRECISION_HIGH), childSize); 211e5c31af7Sopenharmony_ci const VarType parentType (childType, parentSize); 212e5c31af7Sopenharmony_ci 213e5c31af7Sopenharmony_ci createBlockBasicTypeCases(layoutGroup, m_context, typeName, parentType, layoutFlags[layoutFlagNdx].flags); 214e5c31af7Sopenharmony_ci 215e5c31af7Sopenharmony_ci if (glu::isDataTypeMatrix(type)) 216e5c31af7Sopenharmony_ci { 217e5c31af7Sopenharmony_ci for (int matFlagNdx = 0; matFlagNdx < DE_LENGTH_OF_ARRAY(matrixFlags); matFlagNdx++) 218e5c31af7Sopenharmony_ci createBlockBasicTypeCases(layoutGroup, m_context, (string(matrixFlags[matFlagNdx].name) + "_" + typeName).c_str(), 219e5c31af7Sopenharmony_ci parentType, layoutFlags[layoutFlagNdx].flags|matrixFlags[matFlagNdx].flags); 220e5c31af7Sopenharmony_ci } 221e5c31af7Sopenharmony_ci } 222e5c31af7Sopenharmony_ci } 223e5c31af7Sopenharmony_ci } 224e5c31af7Sopenharmony_ci 225e5c31af7Sopenharmony_ci // ubo.3_level_array 226e5c31af7Sopenharmony_ci { 227e5c31af7Sopenharmony_ci tcu::TestCaseGroup* nestedArrayGroup = new tcu::TestCaseGroup(m_testCtx, "3_level_array", "3-level basic array variable in single buffer"); 228e5c31af7Sopenharmony_ci addChild(nestedArrayGroup); 229e5c31af7Sopenharmony_ci 230e5c31af7Sopenharmony_ci for (int layoutFlagNdx = 0; layoutFlagNdx < DE_LENGTH_OF_ARRAY(layoutFlags); layoutFlagNdx++) 231e5c31af7Sopenharmony_ci { 232e5c31af7Sopenharmony_ci tcu::TestCaseGroup* layoutGroup = new tcu::TestCaseGroup(m_testCtx, layoutFlags[layoutFlagNdx].name, ""); 233e5c31af7Sopenharmony_ci nestedArrayGroup->addChild(layoutGroup); 234e5c31af7Sopenharmony_ci 235e5c31af7Sopenharmony_ci for (int basicTypeNdx = 0; basicTypeNdx < DE_LENGTH_OF_ARRAY(basicTypes); basicTypeNdx++) 236e5c31af7Sopenharmony_ci { 237e5c31af7Sopenharmony_ci const glu::DataType type = basicTypes[basicTypeNdx]; 238e5c31af7Sopenharmony_ci const char* typeName = glu::getDataTypeName(type); 239e5c31af7Sopenharmony_ci const int childSize0 = 2; 240e5c31af7Sopenharmony_ci const int childSize1 = 4; 241e5c31af7Sopenharmony_ci const int parentSize = 3; 242e5c31af7Sopenharmony_ci const VarType childType0 (VarType(type, glu::isDataTypeBoolOrBVec(type) ? 0 : PRECISION_HIGH), childSize0); 243e5c31af7Sopenharmony_ci const VarType childType1 (childType0, childSize1); 244e5c31af7Sopenharmony_ci const VarType parentType (childType1, parentSize); 245e5c31af7Sopenharmony_ci 246e5c31af7Sopenharmony_ci createBlockBasicTypeCases(layoutGroup, m_context, typeName, parentType, layoutFlags[layoutFlagNdx].flags); 247e5c31af7Sopenharmony_ci 248e5c31af7Sopenharmony_ci if (glu::isDataTypeMatrix(type)) 249e5c31af7Sopenharmony_ci { 250e5c31af7Sopenharmony_ci for (int matFlagNdx = 0; matFlagNdx < DE_LENGTH_OF_ARRAY(matrixFlags); matFlagNdx++) 251e5c31af7Sopenharmony_ci createBlockBasicTypeCases(layoutGroup, m_context, (string(matrixFlags[matFlagNdx].name) + "_" + typeName).c_str(), 252e5c31af7Sopenharmony_ci parentType, layoutFlags[layoutFlagNdx].flags|matrixFlags[matFlagNdx].flags); 253e5c31af7Sopenharmony_ci } 254e5c31af7Sopenharmony_ci } 255e5c31af7Sopenharmony_ci } 256e5c31af7Sopenharmony_ci } 257e5c31af7Sopenharmony_ci 258e5c31af7Sopenharmony_ci // ubo.2_level_struct_array 259e5c31af7Sopenharmony_ci { 260e5c31af7Sopenharmony_ci tcu::TestCaseGroup* structArrayArrayGroup = new tcu::TestCaseGroup(m_testCtx, "2_level_struct_array", "Struct array in one uniform block"); 261e5c31af7Sopenharmony_ci addChild(structArrayArrayGroup); 262e5c31af7Sopenharmony_ci 263e5c31af7Sopenharmony_ci for (int modeNdx = 0; modeNdx < DE_LENGTH_OF_ARRAY(bufferModes); modeNdx++) 264e5c31af7Sopenharmony_ci { 265e5c31af7Sopenharmony_ci tcu::TestCaseGroup* modeGroup = new tcu::TestCaseGroup(m_testCtx, bufferModes[modeNdx].name, ""); 266e5c31af7Sopenharmony_ci structArrayArrayGroup->addChild(modeGroup); 267e5c31af7Sopenharmony_ci 268e5c31af7Sopenharmony_ci for (int layoutFlagNdx = 0; layoutFlagNdx < DE_LENGTH_OF_ARRAY(layoutFlags); layoutFlagNdx++) 269e5c31af7Sopenharmony_ci { 270e5c31af7Sopenharmony_ci for (int isArray = 0; isArray < 2; isArray++) 271e5c31af7Sopenharmony_ci { 272e5c31af7Sopenharmony_ci std::string baseName = layoutFlags[layoutFlagNdx].name; 273e5c31af7Sopenharmony_ci deUint32 baseFlags = layoutFlags[layoutFlagNdx].flags; 274e5c31af7Sopenharmony_ci 275e5c31af7Sopenharmony_ci if (bufferModes[modeNdx].mode == UniformBlockCase::BUFFERMODE_SINGLE && isArray == 0) 276e5c31af7Sopenharmony_ci continue; // Doesn't make sense to add this variant. 277e5c31af7Sopenharmony_ci 278e5c31af7Sopenharmony_ci if (isArray) 279e5c31af7Sopenharmony_ci baseName += "_instance_array"; 280e5c31af7Sopenharmony_ci 281e5c31af7Sopenharmony_ci modeGroup->addChild(new Block2LevelStructArrayCase(m_context, (baseName + "_vertex").c_str(), "", baseFlags|DECLARE_VERTEX, bufferModes[modeNdx].mode, isArray ? 3 : 0)); 282e5c31af7Sopenharmony_ci modeGroup->addChild(new Block2LevelStructArrayCase(m_context, (baseName + "_fragment").c_str(), "", baseFlags|DECLARE_FRAGMENT, bufferModes[modeNdx].mode, isArray ? 3 : 0)); 283e5c31af7Sopenharmony_ci 284e5c31af7Sopenharmony_ci if (!(baseFlags & LAYOUT_PACKED)) 285e5c31af7Sopenharmony_ci modeGroup->addChild(new Block2LevelStructArrayCase(m_context, (baseName + "_both").c_str(), "", baseFlags|DECLARE_VERTEX|DECLARE_FRAGMENT, bufferModes[modeNdx].mode, isArray ? 3 : 0)); 286e5c31af7Sopenharmony_ci } 287e5c31af7Sopenharmony_ci } 288e5c31af7Sopenharmony_ci } 289e5c31af7Sopenharmony_ci } 290e5c31af7Sopenharmony_ci 291e5c31af7Sopenharmony_ci // ubo.random 292e5c31af7Sopenharmony_ci { 293e5c31af7Sopenharmony_ci const deUint32 allShaders = FEATURE_VERTEX_BLOCKS|FEATURE_FRAGMENT_BLOCKS|FEATURE_SHARED_BLOCKS; 294e5c31af7Sopenharmony_ci const deUint32 allLayouts = FEATURE_PACKED_LAYOUT|FEATURE_SHARED_LAYOUT|FEATURE_STD140_LAYOUT; 295e5c31af7Sopenharmony_ci const deUint32 allBasicTypes = FEATURE_VECTORS|FEATURE_MATRICES; 296e5c31af7Sopenharmony_ci const deUint32 unused = FEATURE_UNUSED_MEMBERS|FEATURE_UNUSED_UNIFORMS; 297e5c31af7Sopenharmony_ci const deUint32 matFlags = FEATURE_MATRIX_LAYOUT; 298e5c31af7Sopenharmony_ci const deUint32 basicTypeArrays = allShaders|allLayouts|unused|allBasicTypes|matFlags|FEATURE_ARRAYS|FEATURE_ARRAYS_OF_ARRAYS; 299e5c31af7Sopenharmony_ci const deUint32 allFeatures = ~0u; 300e5c31af7Sopenharmony_ci 301e5c31af7Sopenharmony_ci tcu::TestCaseGroup* randomGroup = new tcu::TestCaseGroup(m_testCtx, "random", "Random Uniform Block cases"); 302e5c31af7Sopenharmony_ci addChild(randomGroup); 303e5c31af7Sopenharmony_ci 304e5c31af7Sopenharmony_ci createRandomCaseGroup(randomGroup, m_context, "basic_type_arrays", "Arrays, per-block buffers", UniformBlockCase::BUFFERMODE_PER_BLOCK, basicTypeArrays, 25, 1150); 305e5c31af7Sopenharmony_ci createRandomCaseGroup(randomGroup, m_context, "all_per_block_buffers", "All random features, per-block buffers", UniformBlockCase::BUFFERMODE_PER_BLOCK, allFeatures, 50, 11200); 306e5c31af7Sopenharmony_ci createRandomCaseGroup(randomGroup, m_context, "all_shared_buffer", "All random features, shared buffer", UniformBlockCase::BUFFERMODE_SINGLE, allFeatures, 50, 11250); 307e5c31af7Sopenharmony_ci } 308e5c31af7Sopenharmony_ci} 309e5c31af7Sopenharmony_ci 310e5c31af7Sopenharmony_ci} // Functional 311e5c31af7Sopenharmony_ci} // gles31 312e5c31af7Sopenharmony_ci} // deqp 313