1*35238bceSAndroid Build Coastguard Worker #ifndef _GLSUNIFORMBLOCKCASE_HPP 2*35238bceSAndroid Build Coastguard Worker #define _GLSUNIFORMBLOCKCASE_HPP 3*35238bceSAndroid Build Coastguard Worker /*------------------------------------------------------------------------- 4*35238bceSAndroid Build Coastguard Worker * drawElements Quality Program OpenGL (ES) Module 5*35238bceSAndroid Build Coastguard Worker * ----------------------------------------------- 6*35238bceSAndroid Build Coastguard Worker * 7*35238bceSAndroid Build Coastguard Worker * Copyright 2014 The Android Open Source Project 8*35238bceSAndroid Build Coastguard Worker * 9*35238bceSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 10*35238bceSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 11*35238bceSAndroid Build Coastguard Worker * You may obtain a copy of the License at 12*35238bceSAndroid Build Coastguard Worker * 13*35238bceSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 14*35238bceSAndroid Build Coastguard Worker * 15*35238bceSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 16*35238bceSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 17*35238bceSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 18*35238bceSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 19*35238bceSAndroid Build Coastguard Worker * limitations under the License. 20*35238bceSAndroid Build Coastguard Worker * 21*35238bceSAndroid Build Coastguard Worker *//*! 22*35238bceSAndroid Build Coastguard Worker * \file 23*35238bceSAndroid Build Coastguard Worker * \brief Uniform block tests. 24*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/ 25*35238bceSAndroid Build Coastguard Worker 26*35238bceSAndroid Build Coastguard Worker #include "tcuDefs.hpp" 27*35238bceSAndroid Build Coastguard Worker #include "tcuTestCase.hpp" 28*35238bceSAndroid Build Coastguard Worker #include "gluShaderUtil.hpp" 29*35238bceSAndroid Build Coastguard Worker 30*35238bceSAndroid Build Coastguard Worker namespace glu 31*35238bceSAndroid Build Coastguard Worker { 32*35238bceSAndroid Build Coastguard Worker class RenderContext; 33*35238bceSAndroid Build Coastguard Worker } 34*35238bceSAndroid Build Coastguard Worker 35*35238bceSAndroid Build Coastguard Worker namespace deqp 36*35238bceSAndroid Build Coastguard Worker { 37*35238bceSAndroid Build Coastguard Worker namespace gls 38*35238bceSAndroid Build Coastguard Worker { 39*35238bceSAndroid Build Coastguard Worker 40*35238bceSAndroid Build Coastguard Worker // Uniform block details. 41*35238bceSAndroid Build Coastguard Worker namespace ub 42*35238bceSAndroid Build Coastguard Worker { 43*35238bceSAndroid Build Coastguard Worker 44*35238bceSAndroid Build Coastguard Worker enum UniformFlags 45*35238bceSAndroid Build Coastguard Worker { 46*35238bceSAndroid Build Coastguard Worker PRECISION_LOW = (1 << 0), 47*35238bceSAndroid Build Coastguard Worker PRECISION_MEDIUM = (1 << 1), 48*35238bceSAndroid Build Coastguard Worker PRECISION_HIGH = (1 << 2), 49*35238bceSAndroid Build Coastguard Worker PRECISION_MASK = PRECISION_LOW | PRECISION_MEDIUM | PRECISION_HIGH, 50*35238bceSAndroid Build Coastguard Worker 51*35238bceSAndroid Build Coastguard Worker LAYOUT_SHARED = (1 << 3), 52*35238bceSAndroid Build Coastguard Worker LAYOUT_PACKED = (1 << 4), 53*35238bceSAndroid Build Coastguard Worker LAYOUT_STD140 = (1 << 5), 54*35238bceSAndroid Build Coastguard Worker LAYOUT_ROW_MAJOR = (1 << 6), 55*35238bceSAndroid Build Coastguard Worker LAYOUT_COLUMN_MAJOR = (1 << 7), //!< \note Lack of both flags means column-major matrix. 56*35238bceSAndroid Build Coastguard Worker LAYOUT_MASK = LAYOUT_SHARED | LAYOUT_PACKED | LAYOUT_STD140 | LAYOUT_ROW_MAJOR | LAYOUT_COLUMN_MAJOR, 57*35238bceSAndroid Build Coastguard Worker 58*35238bceSAndroid Build Coastguard Worker DECLARE_VERTEX = (1 << 8), 59*35238bceSAndroid Build Coastguard Worker DECLARE_FRAGMENT = (1 << 9), 60*35238bceSAndroid Build Coastguard Worker DECLARE_BOTH = DECLARE_VERTEX | DECLARE_FRAGMENT, 61*35238bceSAndroid Build Coastguard Worker 62*35238bceSAndroid Build Coastguard Worker UNUSED_VERTEX = (1 << 10), //!< Uniform or struct member is not read in vertex shader. 63*35238bceSAndroid Build Coastguard Worker UNUSED_FRAGMENT = (1 << 11), //!< Uniform or struct member is not read in fragment shader. 64*35238bceSAndroid Build Coastguard Worker UNUSED_BOTH = UNUSED_VERTEX | UNUSED_FRAGMENT 65*35238bceSAndroid Build Coastguard Worker }; 66*35238bceSAndroid Build Coastguard Worker 67*35238bceSAndroid Build Coastguard Worker // \todo [2012-07-25 pyry] Use glu::VarType. 68*35238bceSAndroid Build Coastguard Worker 69*35238bceSAndroid Build Coastguard Worker class StructType; 70*35238bceSAndroid Build Coastguard Worker 71*35238bceSAndroid Build Coastguard Worker class VarType 72*35238bceSAndroid Build Coastguard Worker { 73*35238bceSAndroid Build Coastguard Worker public: 74*35238bceSAndroid Build Coastguard Worker VarType(void); 75*35238bceSAndroid Build Coastguard Worker VarType(const VarType &other); 76*35238bceSAndroid Build Coastguard Worker VarType(glu::DataType basicType, uint32_t flags); 77*35238bceSAndroid Build Coastguard Worker VarType(const VarType &elementType, int arraySize); 78*35238bceSAndroid Build Coastguard Worker explicit VarType(const StructType *structPtr, uint32_t flags = 0u); 79*35238bceSAndroid Build Coastguard Worker ~VarType(void); 80*35238bceSAndroid Build Coastguard Worker isBasicType(void) const81*35238bceSAndroid Build Coastguard Worker bool isBasicType(void) const 82*35238bceSAndroid Build Coastguard Worker { 83*35238bceSAndroid Build Coastguard Worker return m_type == TYPE_BASIC; 84*35238bceSAndroid Build Coastguard Worker } isArrayType(void) const85*35238bceSAndroid Build Coastguard Worker bool isArrayType(void) const 86*35238bceSAndroid Build Coastguard Worker { 87*35238bceSAndroid Build Coastguard Worker return m_type == TYPE_ARRAY; 88*35238bceSAndroid Build Coastguard Worker } isStructType(void) const89*35238bceSAndroid Build Coastguard Worker bool isStructType(void) const 90*35238bceSAndroid Build Coastguard Worker { 91*35238bceSAndroid Build Coastguard Worker return m_type == TYPE_STRUCT; 92*35238bceSAndroid Build Coastguard Worker } 93*35238bceSAndroid Build Coastguard Worker getFlags(void) const94*35238bceSAndroid Build Coastguard Worker uint32_t getFlags(void) const 95*35238bceSAndroid Build Coastguard Worker { 96*35238bceSAndroid Build Coastguard Worker return m_flags; 97*35238bceSAndroid Build Coastguard Worker } getBasicType(void) const98*35238bceSAndroid Build Coastguard Worker glu::DataType getBasicType(void) const 99*35238bceSAndroid Build Coastguard Worker { 100*35238bceSAndroid Build Coastguard Worker return m_data.basicType; 101*35238bceSAndroid Build Coastguard Worker } 102*35238bceSAndroid Build Coastguard Worker getElementType(void) const103*35238bceSAndroid Build Coastguard Worker const VarType &getElementType(void) const 104*35238bceSAndroid Build Coastguard Worker { 105*35238bceSAndroid Build Coastguard Worker return *m_data.array.elementType; 106*35238bceSAndroid Build Coastguard Worker } getArraySize(void) const107*35238bceSAndroid Build Coastguard Worker int getArraySize(void) const 108*35238bceSAndroid Build Coastguard Worker { 109*35238bceSAndroid Build Coastguard Worker return m_data.array.size; 110*35238bceSAndroid Build Coastguard Worker } 111*35238bceSAndroid Build Coastguard Worker getStruct(void) const112*35238bceSAndroid Build Coastguard Worker const StructType &getStruct(void) const 113*35238bceSAndroid Build Coastguard Worker { 114*35238bceSAndroid Build Coastguard Worker return *m_data.structPtr; 115*35238bceSAndroid Build Coastguard Worker } 116*35238bceSAndroid Build Coastguard Worker 117*35238bceSAndroid Build Coastguard Worker VarType &operator=(const VarType &other); 118*35238bceSAndroid Build Coastguard Worker 119*35238bceSAndroid Build Coastguard Worker private: 120*35238bceSAndroid Build Coastguard Worker enum Type 121*35238bceSAndroid Build Coastguard Worker { 122*35238bceSAndroid Build Coastguard Worker TYPE_BASIC, 123*35238bceSAndroid Build Coastguard Worker TYPE_ARRAY, 124*35238bceSAndroid Build Coastguard Worker TYPE_STRUCT, 125*35238bceSAndroid Build Coastguard Worker 126*35238bceSAndroid Build Coastguard Worker TYPE_LAST 127*35238bceSAndroid Build Coastguard Worker }; 128*35238bceSAndroid Build Coastguard Worker 129*35238bceSAndroid Build Coastguard Worker Type m_type; 130*35238bceSAndroid Build Coastguard Worker uint32_t m_flags; 131*35238bceSAndroid Build Coastguard Worker union Data 132*35238bceSAndroid Build Coastguard Worker { 133*35238bceSAndroid Build Coastguard Worker glu::DataType basicType; 134*35238bceSAndroid Build Coastguard Worker struct 135*35238bceSAndroid Build Coastguard Worker { 136*35238bceSAndroid Build Coastguard Worker VarType *elementType; 137*35238bceSAndroid Build Coastguard Worker int size; 138*35238bceSAndroid Build Coastguard Worker } array; 139*35238bceSAndroid Build Coastguard Worker const StructType *structPtr; 140*35238bceSAndroid Build Coastguard Worker Data(void)141*35238bceSAndroid Build Coastguard Worker Data(void) 142*35238bceSAndroid Build Coastguard Worker { 143*35238bceSAndroid Build Coastguard Worker array.elementType = DE_NULL; 144*35238bceSAndroid Build Coastguard Worker array.size = 0; 145*35238bceSAndroid Build Coastguard Worker } 146*35238bceSAndroid Build Coastguard Worker } m_data; 147*35238bceSAndroid Build Coastguard Worker }; 148*35238bceSAndroid Build Coastguard Worker 149*35238bceSAndroid Build Coastguard Worker class StructMember 150*35238bceSAndroid Build Coastguard Worker { 151*35238bceSAndroid Build Coastguard Worker public: StructMember(const char * name,const VarType & type,uint32_t flags)152*35238bceSAndroid Build Coastguard Worker StructMember(const char *name, const VarType &type, uint32_t flags) : m_name(name), m_type(type), m_flags(flags) 153*35238bceSAndroid Build Coastguard Worker { 154*35238bceSAndroid Build Coastguard Worker } StructMember(void)155*35238bceSAndroid Build Coastguard Worker StructMember(void) : m_flags(0) 156*35238bceSAndroid Build Coastguard Worker { 157*35238bceSAndroid Build Coastguard Worker } 158*35238bceSAndroid Build Coastguard Worker getName(void) const159*35238bceSAndroid Build Coastguard Worker const char *getName(void) const 160*35238bceSAndroid Build Coastguard Worker { 161*35238bceSAndroid Build Coastguard Worker return m_name.c_str(); 162*35238bceSAndroid Build Coastguard Worker } getType(void) const163*35238bceSAndroid Build Coastguard Worker const VarType &getType(void) const 164*35238bceSAndroid Build Coastguard Worker { 165*35238bceSAndroid Build Coastguard Worker return m_type; 166*35238bceSAndroid Build Coastguard Worker } getFlags(void) const167*35238bceSAndroid Build Coastguard Worker uint32_t getFlags(void) const 168*35238bceSAndroid Build Coastguard Worker { 169*35238bceSAndroid Build Coastguard Worker return m_flags; 170*35238bceSAndroid Build Coastguard Worker } 171*35238bceSAndroid Build Coastguard Worker 172*35238bceSAndroid Build Coastguard Worker private: 173*35238bceSAndroid Build Coastguard Worker std::string m_name; 174*35238bceSAndroid Build Coastguard Worker VarType m_type; 175*35238bceSAndroid Build Coastguard Worker uint32_t m_flags; 176*35238bceSAndroid Build Coastguard Worker }; 177*35238bceSAndroid Build Coastguard Worker 178*35238bceSAndroid Build Coastguard Worker class StructType 179*35238bceSAndroid Build Coastguard Worker { 180*35238bceSAndroid Build Coastguard Worker public: 181*35238bceSAndroid Build Coastguard Worker typedef std::vector<StructMember>::iterator Iterator; 182*35238bceSAndroid Build Coastguard Worker typedef std::vector<StructMember>::const_iterator ConstIterator; 183*35238bceSAndroid Build Coastguard Worker StructType(const char * typeName)184*35238bceSAndroid Build Coastguard Worker StructType(const char *typeName) : m_typeName(typeName) 185*35238bceSAndroid Build Coastguard Worker { 186*35238bceSAndroid Build Coastguard Worker } ~StructType(void)187*35238bceSAndroid Build Coastguard Worker ~StructType(void) 188*35238bceSAndroid Build Coastguard Worker { 189*35238bceSAndroid Build Coastguard Worker } 190*35238bceSAndroid Build Coastguard Worker getTypeName(void) const191*35238bceSAndroid Build Coastguard Worker const char *getTypeName(void) const 192*35238bceSAndroid Build Coastguard Worker { 193*35238bceSAndroid Build Coastguard Worker return m_typeName.empty() ? DE_NULL : m_typeName.c_str(); 194*35238bceSAndroid Build Coastguard Worker } 195*35238bceSAndroid Build Coastguard Worker begin(void)196*35238bceSAndroid Build Coastguard Worker inline Iterator begin(void) 197*35238bceSAndroid Build Coastguard Worker { 198*35238bceSAndroid Build Coastguard Worker return m_members.begin(); 199*35238bceSAndroid Build Coastguard Worker } begin(void) const200*35238bceSAndroid Build Coastguard Worker inline ConstIterator begin(void) const 201*35238bceSAndroid Build Coastguard Worker { 202*35238bceSAndroid Build Coastguard Worker return m_members.begin(); 203*35238bceSAndroid Build Coastguard Worker } end(void)204*35238bceSAndroid Build Coastguard Worker inline Iterator end(void) 205*35238bceSAndroid Build Coastguard Worker { 206*35238bceSAndroid Build Coastguard Worker return m_members.end(); 207*35238bceSAndroid Build Coastguard Worker } end(void) const208*35238bceSAndroid Build Coastguard Worker inline ConstIterator end(void) const 209*35238bceSAndroid Build Coastguard Worker { 210*35238bceSAndroid Build Coastguard Worker return m_members.end(); 211*35238bceSAndroid Build Coastguard Worker } 212*35238bceSAndroid Build Coastguard Worker 213*35238bceSAndroid Build Coastguard Worker void addMember(const char *name, const VarType &type, uint32_t flags = 0); 214*35238bceSAndroid Build Coastguard Worker 215*35238bceSAndroid Build Coastguard Worker private: 216*35238bceSAndroid Build Coastguard Worker std::string m_typeName; 217*35238bceSAndroid Build Coastguard Worker std::vector<StructMember> m_members; 218*35238bceSAndroid Build Coastguard Worker }; 219*35238bceSAndroid Build Coastguard Worker 220*35238bceSAndroid Build Coastguard Worker class Uniform 221*35238bceSAndroid Build Coastguard Worker { 222*35238bceSAndroid Build Coastguard Worker public: 223*35238bceSAndroid Build Coastguard Worker Uniform(const char *name, const VarType &type, uint32_t flags = 0); 224*35238bceSAndroid Build Coastguard Worker getName(void) const225*35238bceSAndroid Build Coastguard Worker const char *getName(void) const 226*35238bceSAndroid Build Coastguard Worker { 227*35238bceSAndroid Build Coastguard Worker return m_name.c_str(); 228*35238bceSAndroid Build Coastguard Worker } getType(void) const229*35238bceSAndroid Build Coastguard Worker const VarType &getType(void) const 230*35238bceSAndroid Build Coastguard Worker { 231*35238bceSAndroid Build Coastguard Worker return m_type; 232*35238bceSAndroid Build Coastguard Worker } getFlags(void) const233*35238bceSAndroid Build Coastguard Worker uint32_t getFlags(void) const 234*35238bceSAndroid Build Coastguard Worker { 235*35238bceSAndroid Build Coastguard Worker return m_flags; 236*35238bceSAndroid Build Coastguard Worker } 237*35238bceSAndroid Build Coastguard Worker 238*35238bceSAndroid Build Coastguard Worker private: 239*35238bceSAndroid Build Coastguard Worker std::string m_name; 240*35238bceSAndroid Build Coastguard Worker VarType m_type; 241*35238bceSAndroid Build Coastguard Worker uint32_t m_flags; 242*35238bceSAndroid Build Coastguard Worker }; 243*35238bceSAndroid Build Coastguard Worker 244*35238bceSAndroid Build Coastguard Worker class UniformBlock 245*35238bceSAndroid Build Coastguard Worker { 246*35238bceSAndroid Build Coastguard Worker public: 247*35238bceSAndroid Build Coastguard Worker typedef std::vector<Uniform>::iterator Iterator; 248*35238bceSAndroid Build Coastguard Worker typedef std::vector<Uniform>::const_iterator ConstIterator; 249*35238bceSAndroid Build Coastguard Worker 250*35238bceSAndroid Build Coastguard Worker UniformBlock(const char *blockName); 251*35238bceSAndroid Build Coastguard Worker getBlockName(void) const252*35238bceSAndroid Build Coastguard Worker const char *getBlockName(void) const 253*35238bceSAndroid Build Coastguard Worker { 254*35238bceSAndroid Build Coastguard Worker return m_blockName.c_str(); 255*35238bceSAndroid Build Coastguard Worker } getInstanceName(void) const256*35238bceSAndroid Build Coastguard Worker const char *getInstanceName(void) const 257*35238bceSAndroid Build Coastguard Worker { 258*35238bceSAndroid Build Coastguard Worker return m_instanceName.empty() ? DE_NULL : m_instanceName.c_str(); 259*35238bceSAndroid Build Coastguard Worker } isArray(void) const260*35238bceSAndroid Build Coastguard Worker bool isArray(void) const 261*35238bceSAndroid Build Coastguard Worker { 262*35238bceSAndroid Build Coastguard Worker return m_arraySize > 0; 263*35238bceSAndroid Build Coastguard Worker } getArraySize(void) const264*35238bceSAndroid Build Coastguard Worker int getArraySize(void) const 265*35238bceSAndroid Build Coastguard Worker { 266*35238bceSAndroid Build Coastguard Worker return m_arraySize; 267*35238bceSAndroid Build Coastguard Worker } getFlags(void) const268*35238bceSAndroid Build Coastguard Worker uint32_t getFlags(void) const 269*35238bceSAndroid Build Coastguard Worker { 270*35238bceSAndroid Build Coastguard Worker return m_flags; 271*35238bceSAndroid Build Coastguard Worker } 272*35238bceSAndroid Build Coastguard Worker setInstanceName(const char * name)273*35238bceSAndroid Build Coastguard Worker void setInstanceName(const char *name) 274*35238bceSAndroid Build Coastguard Worker { 275*35238bceSAndroid Build Coastguard Worker m_instanceName = name; 276*35238bceSAndroid Build Coastguard Worker } setFlags(uint32_t flags)277*35238bceSAndroid Build Coastguard Worker void setFlags(uint32_t flags) 278*35238bceSAndroid Build Coastguard Worker { 279*35238bceSAndroid Build Coastguard Worker m_flags = flags; 280*35238bceSAndroid Build Coastguard Worker } setArraySize(int arraySize)281*35238bceSAndroid Build Coastguard Worker void setArraySize(int arraySize) 282*35238bceSAndroid Build Coastguard Worker { 283*35238bceSAndroid Build Coastguard Worker m_arraySize = arraySize; 284*35238bceSAndroid Build Coastguard Worker } addUniform(const Uniform & uniform)285*35238bceSAndroid Build Coastguard Worker void addUniform(const Uniform &uniform) 286*35238bceSAndroid Build Coastguard Worker { 287*35238bceSAndroid Build Coastguard Worker m_uniforms.push_back(uniform); 288*35238bceSAndroid Build Coastguard Worker } 289*35238bceSAndroid Build Coastguard Worker begin(void)290*35238bceSAndroid Build Coastguard Worker inline Iterator begin(void) 291*35238bceSAndroid Build Coastguard Worker { 292*35238bceSAndroid Build Coastguard Worker return m_uniforms.begin(); 293*35238bceSAndroid Build Coastguard Worker } begin(void) const294*35238bceSAndroid Build Coastguard Worker inline ConstIterator begin(void) const 295*35238bceSAndroid Build Coastguard Worker { 296*35238bceSAndroid Build Coastguard Worker return m_uniforms.begin(); 297*35238bceSAndroid Build Coastguard Worker } end(void)298*35238bceSAndroid Build Coastguard Worker inline Iterator end(void) 299*35238bceSAndroid Build Coastguard Worker { 300*35238bceSAndroid Build Coastguard Worker return m_uniforms.end(); 301*35238bceSAndroid Build Coastguard Worker } end(void) const302*35238bceSAndroid Build Coastguard Worker inline ConstIterator end(void) const 303*35238bceSAndroid Build Coastguard Worker { 304*35238bceSAndroid Build Coastguard Worker return m_uniforms.end(); 305*35238bceSAndroid Build Coastguard Worker } 306*35238bceSAndroid Build Coastguard Worker 307*35238bceSAndroid Build Coastguard Worker private: 308*35238bceSAndroid Build Coastguard Worker std::string m_blockName; 309*35238bceSAndroid Build Coastguard Worker std::string m_instanceName; 310*35238bceSAndroid Build Coastguard Worker std::vector<Uniform> m_uniforms; 311*35238bceSAndroid Build Coastguard Worker int m_arraySize; //!< Array size or 0 if not interface block array. 312*35238bceSAndroid Build Coastguard Worker uint32_t m_flags; 313*35238bceSAndroid Build Coastguard Worker }; 314*35238bceSAndroid Build Coastguard Worker 315*35238bceSAndroid Build Coastguard Worker class ShaderInterface 316*35238bceSAndroid Build Coastguard Worker { 317*35238bceSAndroid Build Coastguard Worker public: 318*35238bceSAndroid Build Coastguard Worker ShaderInterface(void); 319*35238bceSAndroid Build Coastguard Worker ~ShaderInterface(void); 320*35238bceSAndroid Build Coastguard Worker 321*35238bceSAndroid Build Coastguard Worker StructType &allocStruct(const char *name); 322*35238bceSAndroid Build Coastguard Worker const StructType *findStruct(const char *name) const; 323*35238bceSAndroid Build Coastguard Worker void getNamedStructs(std::vector<const StructType *> &structs) const; 324*35238bceSAndroid Build Coastguard Worker 325*35238bceSAndroid Build Coastguard Worker UniformBlock &allocBlock(const char *name); 326*35238bceSAndroid Build Coastguard Worker getNumUniformBlocks(void) const327*35238bceSAndroid Build Coastguard Worker int getNumUniformBlocks(void) const 328*35238bceSAndroid Build Coastguard Worker { 329*35238bceSAndroid Build Coastguard Worker return (int)m_uniformBlocks.size(); 330*35238bceSAndroid Build Coastguard Worker } getUniformBlock(int ndx) const331*35238bceSAndroid Build Coastguard Worker const UniformBlock &getUniformBlock(int ndx) const 332*35238bceSAndroid Build Coastguard Worker { 333*35238bceSAndroid Build Coastguard Worker return *m_uniformBlocks[ndx]; 334*35238bceSAndroid Build Coastguard Worker } 335*35238bceSAndroid Build Coastguard Worker 336*35238bceSAndroid Build Coastguard Worker private: 337*35238bceSAndroid Build Coastguard Worker std::vector<StructType *> m_structs; 338*35238bceSAndroid Build Coastguard Worker std::vector<UniformBlock *> m_uniformBlocks; 339*35238bceSAndroid Build Coastguard Worker }; 340*35238bceSAndroid Build Coastguard Worker 341*35238bceSAndroid Build Coastguard Worker class UniformLayout; 342*35238bceSAndroid Build Coastguard Worker 343*35238bceSAndroid Build Coastguard Worker } // namespace ub 344*35238bceSAndroid Build Coastguard Worker 345*35238bceSAndroid Build Coastguard Worker class UniformBlockCase : public tcu::TestCase 346*35238bceSAndroid Build Coastguard Worker { 347*35238bceSAndroid Build Coastguard Worker public: 348*35238bceSAndroid Build Coastguard Worker enum BufferMode 349*35238bceSAndroid Build Coastguard Worker { 350*35238bceSAndroid Build Coastguard Worker BUFFERMODE_SINGLE = 0, //!< Single buffer shared between uniform blocks. 351*35238bceSAndroid Build Coastguard Worker BUFFERMODE_PER_BLOCK, //!< Per-block buffers 352*35238bceSAndroid Build Coastguard Worker 353*35238bceSAndroid Build Coastguard Worker BUFFERMODE_LAST 354*35238bceSAndroid Build Coastguard Worker }; 355*35238bceSAndroid Build Coastguard Worker 356*35238bceSAndroid Build Coastguard Worker UniformBlockCase(tcu::TestContext &testCtx, glu::RenderContext &renderCtx, const char *name, 357*35238bceSAndroid Build Coastguard Worker const char *description, glu::GLSLVersion glslVersion, BufferMode bufferMode); 358*35238bceSAndroid Build Coastguard Worker ~UniformBlockCase(void); 359*35238bceSAndroid Build Coastguard Worker 360*35238bceSAndroid Build Coastguard Worker IterateResult iterate(void); 361*35238bceSAndroid Build Coastguard Worker 362*35238bceSAndroid Build Coastguard Worker protected: 363*35238bceSAndroid Build Coastguard Worker bool compareStd140Blocks(const ub::UniformLayout &refLayout, const ub::UniformLayout &cmpLayout) const; 364*35238bceSAndroid Build Coastguard Worker bool compareSharedBlocks(const ub::UniformLayout &refLayout, const ub::UniformLayout &cmpLayout) const; 365*35238bceSAndroid Build Coastguard Worker bool compareTypes(const ub::UniformLayout &refLayout, const ub::UniformLayout &cmpLayout) const; 366*35238bceSAndroid Build Coastguard Worker bool checkLayoutIndices(const ub::UniformLayout &layout) const; 367*35238bceSAndroid Build Coastguard Worker bool checkLayoutBounds(const ub::UniformLayout &layout) const; 368*35238bceSAndroid Build Coastguard Worker bool checkIndexQueries(uint32_t program, const ub::UniformLayout &layout) const; 369*35238bceSAndroid Build Coastguard Worker 370*35238bceSAndroid Build Coastguard Worker bool render(uint32_t program) const; 371*35238bceSAndroid Build Coastguard Worker 372*35238bceSAndroid Build Coastguard Worker glu::RenderContext &m_renderCtx; 373*35238bceSAndroid Build Coastguard Worker glu::GLSLVersion m_glslVersion; 374*35238bceSAndroid Build Coastguard Worker BufferMode m_bufferMode; 375*35238bceSAndroid Build Coastguard Worker ub::ShaderInterface m_interface; 376*35238bceSAndroid Build Coastguard Worker }; 377*35238bceSAndroid Build Coastguard Worker 378*35238bceSAndroid Build Coastguard Worker } // namespace gls 379*35238bceSAndroid Build Coastguard Worker } // namespace deqp 380*35238bceSAndroid Build Coastguard Worker 381*35238bceSAndroid Build Coastguard Worker #endif // _GLSUNIFORMBLOCKCASE_HPP 382