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