xref: /aosp_15_r20/external/deqp/modules/glshared/glsUniformBlockCase.hpp (revision 35238bce31c2a825756842865a792f8cf7f89930)
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