1*35238bceSAndroid Build Coastguard Worker #ifndef _ES31FSSBOLAYOUTCASE_HPP 2*35238bceSAndroid Build Coastguard Worker #define _ES31FSSBOLAYOUTCASE_HPP 3*35238bceSAndroid Build Coastguard Worker /*------------------------------------------------------------------------- 4*35238bceSAndroid Build Coastguard Worker * drawElements Quality Program OpenGL ES 3.1 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 SSBO layout 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 #include "gluVarType.hpp" 30*35238bceSAndroid Build Coastguard Worker 31*35238bceSAndroid Build Coastguard Worker namespace glu 32*35238bceSAndroid Build Coastguard Worker { 33*35238bceSAndroid Build Coastguard Worker class RenderContext; 34*35238bceSAndroid Build Coastguard Worker } 35*35238bceSAndroid Build Coastguard Worker 36*35238bceSAndroid Build Coastguard Worker namespace deqp 37*35238bceSAndroid Build Coastguard Worker { 38*35238bceSAndroid Build Coastguard Worker namespace gles31 39*35238bceSAndroid Build Coastguard Worker { 40*35238bceSAndroid Build Coastguard Worker 41*35238bceSAndroid Build Coastguard Worker // Buffer block details. 42*35238bceSAndroid Build Coastguard Worker namespace bb 43*35238bceSAndroid Build Coastguard Worker { 44*35238bceSAndroid Build Coastguard Worker 45*35238bceSAndroid Build Coastguard Worker enum BufferVarFlags 46*35238bceSAndroid Build Coastguard Worker { 47*35238bceSAndroid Build Coastguard Worker LAYOUT_SHARED = (1 << 0), 48*35238bceSAndroid Build Coastguard Worker LAYOUT_PACKED = (1 << 1), 49*35238bceSAndroid Build Coastguard Worker LAYOUT_STD140 = (1 << 2), 50*35238bceSAndroid Build Coastguard Worker LAYOUT_STD430 = (1 << 3), 51*35238bceSAndroid Build Coastguard Worker LAYOUT_ROW_MAJOR = (1 << 4), 52*35238bceSAndroid Build Coastguard Worker LAYOUT_COLUMN_MAJOR = (1 << 5), //!< \note Lack of both flags means column-major matrix. 53*35238bceSAndroid Build Coastguard Worker LAYOUT_MASK = 54*35238bceSAndroid Build Coastguard Worker LAYOUT_SHARED | LAYOUT_PACKED | LAYOUT_STD140 | LAYOUT_STD430 | LAYOUT_ROW_MAJOR | LAYOUT_COLUMN_MAJOR, 55*35238bceSAndroid Build Coastguard Worker 56*35238bceSAndroid Build Coastguard Worker // \todo [2013-10-14 pyry] Investigate adding these. 57*35238bceSAndroid Build Coastguard Worker /* QUALIFIER_COHERENT = (1<<6), 58*35238bceSAndroid Build Coastguard Worker QUALIFIER_VOLATILE = (1<<7), 59*35238bceSAndroid Build Coastguard Worker QUALIFIER_RESTRICT = (1<<8), 60*35238bceSAndroid Build Coastguard Worker QUALIFIER_READONLY = (1<<9), 61*35238bceSAndroid Build Coastguard Worker QUALIFIER_WRITEONLY = (1<<10),*/ 62*35238bceSAndroid Build Coastguard Worker 63*35238bceSAndroid Build Coastguard Worker ACCESS_READ = (1 << 11), //!< Buffer variable is read in the shader. 64*35238bceSAndroid Build Coastguard Worker ACCESS_WRITE = (1 << 12), //!< Buffer variable is written in the shader. 65*35238bceSAndroid Build Coastguard Worker }; 66*35238bceSAndroid Build Coastguard Worker 67*35238bceSAndroid Build Coastguard Worker class BufferVar 68*35238bceSAndroid Build Coastguard Worker { 69*35238bceSAndroid Build Coastguard Worker public: 70*35238bceSAndroid Build Coastguard Worker BufferVar(const char *name, const glu::VarType &type, uint32_t flags); 71*35238bceSAndroid Build Coastguard Worker getName(void) const72*35238bceSAndroid Build Coastguard Worker const char *getName(void) const 73*35238bceSAndroid Build Coastguard Worker { 74*35238bceSAndroid Build Coastguard Worker return m_name.c_str(); 75*35238bceSAndroid Build Coastguard Worker } getType(void) const76*35238bceSAndroid Build Coastguard Worker const glu::VarType &getType(void) const 77*35238bceSAndroid Build Coastguard Worker { 78*35238bceSAndroid Build Coastguard Worker return m_type; 79*35238bceSAndroid Build Coastguard Worker } getFlags(void) const80*35238bceSAndroid Build Coastguard Worker uint32_t getFlags(void) const 81*35238bceSAndroid Build Coastguard Worker { 82*35238bceSAndroid Build Coastguard Worker return m_flags; 83*35238bceSAndroid Build Coastguard Worker } 84*35238bceSAndroid Build Coastguard Worker 85*35238bceSAndroid Build Coastguard Worker private: 86*35238bceSAndroid Build Coastguard Worker std::string m_name; 87*35238bceSAndroid Build Coastguard Worker glu::VarType m_type; 88*35238bceSAndroid Build Coastguard Worker uint32_t m_flags; 89*35238bceSAndroid Build Coastguard Worker }; 90*35238bceSAndroid Build Coastguard Worker 91*35238bceSAndroid Build Coastguard Worker class BufferBlock 92*35238bceSAndroid Build Coastguard Worker { 93*35238bceSAndroid Build Coastguard Worker public: 94*35238bceSAndroid Build Coastguard Worker typedef std::vector<BufferVar>::iterator iterator; 95*35238bceSAndroid Build Coastguard Worker typedef std::vector<BufferVar>::const_iterator const_iterator; 96*35238bceSAndroid Build Coastguard Worker 97*35238bceSAndroid Build Coastguard Worker BufferBlock(const char *blockName); 98*35238bceSAndroid Build Coastguard Worker getBlockName(void) const99*35238bceSAndroid Build Coastguard Worker const char *getBlockName(void) const 100*35238bceSAndroid Build Coastguard Worker { 101*35238bceSAndroid Build Coastguard Worker return m_blockName.c_str(); 102*35238bceSAndroid Build Coastguard Worker } getInstanceName(void) const103*35238bceSAndroid Build Coastguard Worker const char *getInstanceName(void) const 104*35238bceSAndroid Build Coastguard Worker { 105*35238bceSAndroid Build Coastguard Worker return m_instanceName.empty() ? DE_NULL : m_instanceName.c_str(); 106*35238bceSAndroid Build Coastguard Worker } isArray(void) const107*35238bceSAndroid Build Coastguard Worker bool isArray(void) const 108*35238bceSAndroid Build Coastguard Worker { 109*35238bceSAndroid Build Coastguard Worker return m_arraySize > 0; 110*35238bceSAndroid Build Coastguard Worker } getArraySize(void) const111*35238bceSAndroid Build Coastguard Worker int getArraySize(void) const 112*35238bceSAndroid Build Coastguard Worker { 113*35238bceSAndroid Build Coastguard Worker return m_arraySize; 114*35238bceSAndroid Build Coastguard Worker } getFlags(void) const115*35238bceSAndroid Build Coastguard Worker uint32_t getFlags(void) const 116*35238bceSAndroid Build Coastguard Worker { 117*35238bceSAndroid Build Coastguard Worker return m_flags; 118*35238bceSAndroid Build Coastguard Worker } 119*35238bceSAndroid Build Coastguard Worker setInstanceName(const char * name)120*35238bceSAndroid Build Coastguard Worker void setInstanceName(const char *name) 121*35238bceSAndroid Build Coastguard Worker { 122*35238bceSAndroid Build Coastguard Worker m_instanceName = name; 123*35238bceSAndroid Build Coastguard Worker } setFlags(uint32_t flags)124*35238bceSAndroid Build Coastguard Worker void setFlags(uint32_t flags) 125*35238bceSAndroid Build Coastguard Worker { 126*35238bceSAndroid Build Coastguard Worker m_flags = flags; 127*35238bceSAndroid Build Coastguard Worker } addMember(const BufferVar & var)128*35238bceSAndroid Build Coastguard Worker void addMember(const BufferVar &var) 129*35238bceSAndroid Build Coastguard Worker { 130*35238bceSAndroid Build Coastguard Worker m_variables.push_back(var); 131*35238bceSAndroid Build Coastguard Worker } 132*35238bceSAndroid Build Coastguard Worker void setArraySize(int arraySize); 133*35238bceSAndroid Build Coastguard Worker getLastUnsizedArraySize(int instanceNdx) const134*35238bceSAndroid Build Coastguard Worker int getLastUnsizedArraySize(int instanceNdx) const 135*35238bceSAndroid Build Coastguard Worker { 136*35238bceSAndroid Build Coastguard Worker return m_lastUnsizedArraySizes[instanceNdx]; 137*35238bceSAndroid Build Coastguard Worker } setLastUnsizedArraySize(int instanceNdx,int size)138*35238bceSAndroid Build Coastguard Worker void setLastUnsizedArraySize(int instanceNdx, int size) 139*35238bceSAndroid Build Coastguard Worker { 140*35238bceSAndroid Build Coastguard Worker m_lastUnsizedArraySizes[instanceNdx] = size; 141*35238bceSAndroid Build Coastguard Worker } 142*35238bceSAndroid Build Coastguard Worker begin(void)143*35238bceSAndroid Build Coastguard Worker inline iterator begin(void) 144*35238bceSAndroid Build Coastguard Worker { 145*35238bceSAndroid Build Coastguard Worker return m_variables.begin(); 146*35238bceSAndroid Build Coastguard Worker } begin(void) const147*35238bceSAndroid Build Coastguard Worker inline const_iterator begin(void) const 148*35238bceSAndroid Build Coastguard Worker { 149*35238bceSAndroid Build Coastguard Worker return m_variables.begin(); 150*35238bceSAndroid Build Coastguard Worker } end(void)151*35238bceSAndroid Build Coastguard Worker inline iterator end(void) 152*35238bceSAndroid Build Coastguard Worker { 153*35238bceSAndroid Build Coastguard Worker return m_variables.end(); 154*35238bceSAndroid Build Coastguard Worker } end(void) const155*35238bceSAndroid Build Coastguard Worker inline const_iterator end(void) const 156*35238bceSAndroid Build Coastguard Worker { 157*35238bceSAndroid Build Coastguard Worker return m_variables.end(); 158*35238bceSAndroid Build Coastguard Worker } 159*35238bceSAndroid Build Coastguard Worker 160*35238bceSAndroid Build Coastguard Worker private: 161*35238bceSAndroid Build Coastguard Worker std::string m_blockName; 162*35238bceSAndroid Build Coastguard Worker std::string m_instanceName; 163*35238bceSAndroid Build Coastguard Worker std::vector<BufferVar> m_variables; 164*35238bceSAndroid Build Coastguard Worker int m_arraySize; //!< Array size or 0 if not interface block array. 165*35238bceSAndroid Build Coastguard Worker std::vector<int> m_lastUnsizedArraySizes; //!< Sizes of last unsized array element, can be different per instance. 166*35238bceSAndroid Build Coastguard Worker uint32_t m_flags; 167*35238bceSAndroid Build Coastguard Worker }; 168*35238bceSAndroid Build Coastguard Worker 169*35238bceSAndroid Build Coastguard Worker class ShaderInterface 170*35238bceSAndroid Build Coastguard Worker { 171*35238bceSAndroid Build Coastguard Worker public: 172*35238bceSAndroid Build Coastguard Worker ShaderInterface(void); 173*35238bceSAndroid Build Coastguard Worker ~ShaderInterface(void); 174*35238bceSAndroid Build Coastguard Worker 175*35238bceSAndroid Build Coastguard Worker glu::StructType &allocStruct(const char *name); 176*35238bceSAndroid Build Coastguard Worker const glu::StructType *findStruct(const char *name) const; 177*35238bceSAndroid Build Coastguard Worker void getNamedStructs(std::vector<const glu::StructType *> &structs) const; 178*35238bceSAndroid Build Coastguard Worker 179*35238bceSAndroid Build Coastguard Worker BufferBlock &allocBlock(const char *name); 180*35238bceSAndroid Build Coastguard Worker getNumBlocks(void) const181*35238bceSAndroid Build Coastguard Worker int getNumBlocks(void) const 182*35238bceSAndroid Build Coastguard Worker { 183*35238bceSAndroid Build Coastguard Worker return (int)m_bufferBlocks.size(); 184*35238bceSAndroid Build Coastguard Worker } getBlock(int ndx) const185*35238bceSAndroid Build Coastguard Worker const BufferBlock &getBlock(int ndx) const 186*35238bceSAndroid Build Coastguard Worker { 187*35238bceSAndroid Build Coastguard Worker return *m_bufferBlocks[ndx]; 188*35238bceSAndroid Build Coastguard Worker } 189*35238bceSAndroid Build Coastguard Worker 190*35238bceSAndroid Build Coastguard Worker private: 191*35238bceSAndroid Build Coastguard Worker ShaderInterface(const ShaderInterface &); 192*35238bceSAndroid Build Coastguard Worker ShaderInterface &operator=(const ShaderInterface &); 193*35238bceSAndroid Build Coastguard Worker 194*35238bceSAndroid Build Coastguard Worker std::vector<glu::StructType *> m_structs; 195*35238bceSAndroid Build Coastguard Worker std::vector<BufferBlock *> m_bufferBlocks; 196*35238bceSAndroid Build Coastguard Worker }; 197*35238bceSAndroid Build Coastguard Worker 198*35238bceSAndroid Build Coastguard Worker class BufferLayout; 199*35238bceSAndroid Build Coastguard Worker 200*35238bceSAndroid Build Coastguard Worker } // namespace bb 201*35238bceSAndroid Build Coastguard Worker 202*35238bceSAndroid Build Coastguard Worker class SSBOLayoutCase : public tcu::TestCase 203*35238bceSAndroid Build Coastguard Worker { 204*35238bceSAndroid Build Coastguard Worker public: 205*35238bceSAndroid Build Coastguard Worker enum BufferMode 206*35238bceSAndroid Build Coastguard Worker { 207*35238bceSAndroid Build Coastguard Worker BUFFERMODE_SINGLE = 0, //!< Single buffer shared between uniform blocks. 208*35238bceSAndroid Build Coastguard Worker BUFFERMODE_PER_BLOCK, //!< Per-block buffers 209*35238bceSAndroid Build Coastguard Worker 210*35238bceSAndroid Build Coastguard Worker BUFFERMODE_LAST 211*35238bceSAndroid Build Coastguard Worker }; 212*35238bceSAndroid Build Coastguard Worker 213*35238bceSAndroid Build Coastguard Worker SSBOLayoutCase(tcu::TestContext &testCtx, glu::RenderContext &renderCtx, const char *name, const char *description, 214*35238bceSAndroid Build Coastguard Worker glu::GLSLVersion glslVersion, BufferMode bufferMode); 215*35238bceSAndroid Build Coastguard Worker ~SSBOLayoutCase(void); 216*35238bceSAndroid Build Coastguard Worker 217*35238bceSAndroid Build Coastguard Worker IterateResult iterate(void); 218*35238bceSAndroid Build Coastguard Worker 219*35238bceSAndroid Build Coastguard Worker protected: 220*35238bceSAndroid Build Coastguard Worker bool compareStdBlocks(const bb::BufferLayout &refLayout, const bb::BufferLayout &cmpLayout) const; 221*35238bceSAndroid Build Coastguard Worker bool compareSharedBlocks(const bb::BufferLayout &refLayout, const bb::BufferLayout &cmpLayout) const; 222*35238bceSAndroid Build Coastguard Worker bool compareTypes(const bb::BufferLayout &refLayout, const bb::BufferLayout &cmpLayout) const; 223*35238bceSAndroid Build Coastguard Worker bool checkLayoutIndices(const bb::BufferLayout &layout) const; 224*35238bceSAndroid Build Coastguard Worker bool checkLayoutBounds(const bb::BufferLayout &layout) const; 225*35238bceSAndroid Build Coastguard Worker bool checkIndexQueries(uint32_t program, const bb::BufferLayout &layout) const; 226*35238bceSAndroid Build Coastguard Worker 227*35238bceSAndroid Build Coastguard Worker bool execute(uint32_t program); 228*35238bceSAndroid Build Coastguard Worker 229*35238bceSAndroid Build Coastguard Worker glu::RenderContext &m_renderCtx; 230*35238bceSAndroid Build Coastguard Worker glu::GLSLVersion m_glslVersion; 231*35238bceSAndroid Build Coastguard Worker BufferMode m_bufferMode; 232*35238bceSAndroid Build Coastguard Worker bb::ShaderInterface m_interface; 233*35238bceSAndroid Build Coastguard Worker 234*35238bceSAndroid Build Coastguard Worker private: 235*35238bceSAndroid Build Coastguard Worker SSBOLayoutCase(const SSBOLayoutCase &); 236*35238bceSAndroid Build Coastguard Worker SSBOLayoutCase &operator=(const SSBOLayoutCase &); 237*35238bceSAndroid Build Coastguard Worker }; 238*35238bceSAndroid Build Coastguard Worker 239*35238bceSAndroid Build Coastguard Worker } // namespace gles31 240*35238bceSAndroid Build Coastguard Worker } // namespace deqp 241*35238bceSAndroid Build Coastguard Worker 242*35238bceSAndroid Build Coastguard Worker #endif // _ES31FSSBOLAYOUTCASE_HPP 243