1 #ifndef _GLCUNIFORMBLOCKCASE_HPP
2 #define _GLCUNIFORMBLOCKCASE_HPP
3 /*-------------------------------------------------------------------------
4 * OpenGL Conformance Test Suite
5 * -----------------------------
7 * Copyright (c) 2016 Google Inc.
8 * Copyright (c) 2016 The Khronos Group Inc.
10 * Licensed under the Apache License, Version 2.0 (the "License");
11 * you may not use this file except in compliance with the License.
12 * You may obtain a copy of the License at
14 * http://www.apache.org/licenses/LICENSE-2.0
16 * Unless required by applicable law or agreed to in writing, software
17 * distributed under the License is distributed on an "AS IS" BASIS,
18 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
19 * See the License for the specific language governing permissions and
20 * limitations under the License.
24 * \brief Uniform block tests.
25 */ /*-------------------------------------------------------------------*/
27 #include "glcTestCase.hpp"
28 #include "gluShaderProgram.hpp"
29 #include "gluShaderUtil.hpp"
30 #include "tcuDefs.hpp"
35 // Uniform block details.
41 PRECISION_LOW = (1 << 0),
42 PRECISION_MEDIUM = (1 << 1),
43 PRECISION_HIGH = (1 << 2),
44 PRECISION_MASK = PRECISION_LOW | PRECISION_MEDIUM | PRECISION_HIGH,
46 LAYOUT_SHARED = (1 << 3),
47 LAYOUT_PACKED = (1 << 4),
48 LAYOUT_STD140 = (1 << 5),
49 LAYOUT_ROW_MAJOR = (1 << 6),
50 LAYOUT_COLUMN_MAJOR = (1 << 7), //!< \note Lack of both flags means column-major matrix.
51 LAYOUT_MASK = LAYOUT_SHARED | LAYOUT_PACKED | LAYOUT_STD140 | LAYOUT_ROW_MAJOR | LAYOUT_COLUMN_MAJOR,
53 DECLARE_VERTEX = (1 << 8),
54 DECLARE_FRAGMENT = (1 << 9),
55 DECLARE_BOTH = DECLARE_VERTEX | DECLARE_FRAGMENT,
57 UNUSED_VERTEX = (1 << 10), //!< Uniform or struct member is not read in vertex shader.
58 UNUSED_FRAGMENT = (1 << 11), //!< Uniform or struct member is not read in fragment shader.
59 UNUSED_BOTH = UNUSED_VERTEX | UNUSED_FRAGMENT
62 // \todo [2012-07-25 pyry] Use glu::VarType.
70 VarType(const VarType& other);
71 VarType(glu::DataType basicType, deUint32 flags);
72 VarType(const VarType& elementType, int arraySize);
73 explicit VarType(const StructType* structPtr);
76 bool isBasicType(void) const
78 return m_type == TYPE_BASIC;
80 bool isArrayType(void) const
82 return m_type == TYPE_ARRAY;
84 bool isStructType(void) const
86 return m_type == TYPE_STRUCT;
89 deUint32 getFlags(void) const
93 glu::DataType getBasicType(void) const
95 return m_data.basicType;
98 const VarType& getElementType(void) const
100 return *m_data.array.elementType;
102 int getArraySize(void) const
104 return m_data.array.size;
107 const StructType& getStruct(void) const
109 return *m_data.structPtr;
112 VarType& operator=(const VarType& other);
127 glu::DataType basicType;
130 VarType* elementType;
133 const StructType* structPtr;
137 array.elementType = DE_NULL;
146 StructMember(const char* name, const VarType& type, deUint32 flags) : m_name(name), m_type(type), m_flags(flags)
149 StructMember(void) : m_flags(0)
153 const char* getName(void) const
155 return m_name.c_str();
157 const VarType& getType(void) const
161 deUint32 getFlags(void) const
175 typedef std::vector<StructMember>::iterator Iterator;
176 typedef std::vector<StructMember>::const_iterator ConstIterator;
178 StructType(const char* typeName) : m_typeName(typeName)
185 const char* getTypeName(void) const
187 return m_typeName.empty() ? DE_NULL : m_typeName.c_str();
190 inline Iterator begin(void)
192 return m_members.begin();
194 inline ConstIterator begin(void) const
196 return m_members.begin();
198 inline Iterator end(void)
200 return m_members.end();
202 inline ConstIterator end(void) const
204 return m_members.end();
207 void addMember(const char* name, const VarType& type, deUint32 flags = 0);
210 std::string m_typeName;
211 std::vector<StructMember> m_members;
217 Uniform(const char* name, const VarType& type, deUint32 flags = 0);
219 const char* getName(void) const
221 return m_name.c_str();
223 const VarType& getType(void) const
227 deUint32 getFlags(void) const
241 typedef std::vector<Uniform>::iterator Iterator;
242 typedef std::vector<Uniform>::const_iterator ConstIterator;
244 UniformBlock(const char* blockName);
246 const char* getBlockName(void) const
248 return m_blockName.c_str();
250 const char* getInstanceName(void) const
252 return m_instanceName.empty() ? DE_NULL : m_instanceName.c_str();
254 bool isArray(void) const
256 return m_arraySize > 0;
258 int getArraySize(void) const
262 deUint32 getFlags(void) const
267 void setInstanceName(const char* name)
269 m_instanceName = name;
271 void setFlags(deUint32 flags)
275 void setArraySize(int arraySize)
277 m_arraySize = arraySize;
279 void addUniform(const Uniform& uniform)
281 m_uniforms.push_back(uniform);
284 inline Iterator begin(void)
286 return m_uniforms.begin();
288 inline ConstIterator begin(void) const
290 return m_uniforms.begin();
292 inline Iterator end(void)
294 return m_uniforms.end();
296 inline ConstIterator end(void) const
298 return m_uniforms.end();
302 std::string m_blockName;
303 std::string m_instanceName;
304 std::vector<Uniform> m_uniforms;
305 int m_arraySize; //!< Array size or 0 if not interface block array.
309 class ShaderInterface
312 ShaderInterface(void);
313 ~ShaderInterface(void);
315 StructType& allocStruct(const char* name);
316 const StructType* findStruct(const char* name) const;
317 void getNamedStructs(std::vector<const StructType*>& structs) const;
319 UniformBlock& allocBlock(const char* name);
321 int getNumUniformBlocks(void) const
323 return (int)m_uniformBlocks.size();
325 const UniformBlock& getUniformBlock(int ndx) const
327 return *m_uniformBlocks[ndx];
331 std::vector<StructType*> m_structs;
332 std::vector<UniformBlock*> m_uniformBlocks;
339 class UniformBlockCase : public TestCase
344 BUFFERMODE_SINGLE = 0, //!< Single buffer shared between uniform blocks.
345 BUFFERMODE_PER_BLOCK, //!< Per-block buffers
350 UniformBlockCase(Context& context, const char* name, const char* description, glu::GLSLVersion glslVersion,
351 BufferMode bufferMode);
352 ~UniformBlockCase(void);
354 IterateResult iterate(void);
357 bool compareStd140Blocks(const ub::UniformLayout& refLayout, const ub::UniformLayout& cmpLayout) const;
358 bool compareSharedBlocks(const ub::UniformLayout& refLayout, const ub::UniformLayout& cmpLayout) const;
359 bool compareTypes(const ub::UniformLayout& refLayout, const ub::UniformLayout& cmpLayout) const;
360 bool checkLayoutIndices(const ub::UniformLayout& layout) const;
361 bool checkLayoutBounds(const ub::UniformLayout& layout) const;
362 bool checkIndexQueries(deUint32 program, const ub::UniformLayout& layout) const;
364 bool render(glu::ShaderProgram& program) const;
366 glu::GLSLVersion m_glslVersion;
367 BufferMode m_bufferMode;
368 ub::ShaderInterface m_interface;
373 #endif // _GLCUNIFORMBLOCKCASE_HPP