• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*-------------------------------------------------------------------------
2  * OpenGL Conformance Test Suite
3  * -----------------------------
4  *
5  * Copyright (c) 2017 The Khronos Group Inc.
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  *
19  */ /*!
20  * \file gl4cLimitsTests.cpp
21  * \brief Verifies all limits
22  */ /*-------------------------------------------------------------------*/
23 
24 #include "gl4cLimitsTests.hpp"
25 #include "glcLimitTest.hpp"
26 
27 using namespace glw;
28 
29 namespace gl4cts
30 {
31 
32 template <typename Type>
33 struct Limit
34 {
35 	const char* name;
36 	deUint32	token;
37 	Type		boundry;
38 	bool		isMaximum; // when true boundry is maximal acceptable value
39 	const char* builtin;
40 };
41 
42 /** Constructor.
43  *
44  *  @param context Rendering context.
45  **/
LimitsTests(deqp::Context & context)46 LimitsTests::LimitsTests(deqp::Context& context) : TestCaseGroup(context, "limits", "Verifies all limits")
47 {
48 }
49 
init(void)50 void LimitsTests::init(void)
51 {
52 	const GLint	minVertexUniformBlocks		= 14;
53 	const GLint	minVertexUniformComponents	= 1024;
54 
55 	const GLint	minGeometryUniformBlocks		= 14;
56 	const GLint	minGeometryUniformComponents	= 1024;
57 
58 	const GLint	minTessControlUniformBlocks		= 14;
59 	const GLint	minTessControlUniformComponents	= 1024;
60 
61 	const GLint	minTessEvaluationUniformBlocks		= 14;
62 	const GLint	minTessEvaluationUniformComponents	= 1024;
63 
64 	const GLint	minFragmentUniformBlocks		= 14;
65 	const GLint	minFragmentUniformComponents	= 1024;
66 
67 	const GLint	minUniformBlockSize	= 16384;
68 
69 	const GLint	cvuc  = (minVertexUniformBlocks*minUniformBlockSize)/4 + minVertexUniformComponents;
70 	const GLint	cguc  = (minGeometryUniformBlocks*minUniformBlockSize)/4 + minGeometryUniformComponents;
71 	const GLint	ctcuc = (minTessControlUniformBlocks*minUniformBlockSize)/4 + minTessControlUniformComponents;
72 	const GLint	cteuc = (minTessEvaluationUniformBlocks*minUniformBlockSize)/4 + minTessEvaluationUniformComponents;
73 	const GLint	cfuc  = (minFragmentUniformBlocks*minUniformBlockSize)/4 + minFragmentUniformComponents;
74 
75 	static const Limit<GLint> intLimits[] =
76 	{
77 		{ "max_clip_distances",								 GL_MAX_CLIP_DISTANCES,								 8,		0, "gl_MaxClipDistances" },
78 		{ "max_cull_distances",								 GL_MAX_CULL_DISTANCES,								 8,		0, "gl_MaxCullDistances" },
79 		{ "max_combined_clip_and_cull_distances",			 GL_MAX_COMBINED_CLIP_AND_CULL_DISTANCES,			 8,		0, "gl_MaxCombinedClipAndCullDistances" },
80 		{ "max_3d_texture_size",							 GL_MAX_3D_TEXTURE_SIZE,							 2048,  0, "" },
81 		{ "max_texture_size",								 GL_MAX_TEXTURE_SIZE,								 16384, 0, "" },
82 		{ "max_array_texture_layers",						 GL_MAX_ARRAY_TEXTURE_LAYERS,						 2048,  0, "" },
83 		{ "max_cube_map_texture_size",						 GL_MAX_CUBE_MAP_TEXTURE_SIZE,						 16384, 0, "" },
84 		{ "max_renderbuffer_size",							 GL_MAX_RENDERBUFFER_SIZE,							 16384, 0, "" },
85 		{ "max_viewports",									 GL_MAX_VIEWPORTS,									 16,	0, "gl_MaxViewports" },
86 		{ "max_elements_indices",							 GL_MAX_ELEMENTS_INDICES,							 0,		0, "" }, // there is no minimum
87 		{ "max_elements_vertices",							 GL_MAX_ELEMENTS_VERTICES,							 0,		0, "" },
88 		{ "max_vertex_attrib_relative_offset",				 GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET,				 2047,  0, "" },
89 		{ "max_vertex_attrib_bindings",						 GL_MAX_VERTEX_ATTRIB_BINDINGS,						 16,	0, "" },
90 		{ "max_vertex_attrib_stride",						 GL_MAX_VERTEX_ATTRIB_STRIDE,						 2048,  0, "" },
91 		{ "max_texture_buffer_size",						 GL_MAX_TEXTURE_BUFFER_SIZE,						 65536, 0, "" },
92 		{ "max_rectangle_texture_size",						 GL_MAX_RECTANGLE_TEXTURE_SIZE,						 16384, 0, "" },
93 		{ "min_map_buffer_alignment",						 GL_MIN_MAP_BUFFER_ALIGNMENT,						 64,	0, "" },
94 		{ "max_vertex_attribs",								 GL_MAX_VERTEX_ATTRIBS,								 16,	0, "gl_MaxVertexAttribs" },
95 		{ "max_vertex_uniform_components",					 GL_MAX_VERTEX_UNIFORM_COMPONENTS,					 1024,  0, "gl_MaxVertexUniformComponents" },
96 		{ "max_vertex_uniform_vectors",						 GL_MAX_VERTEX_UNIFORM_VECTORS,						 256,   0, "gl_MaxVertexUniformVectors" },
97 		{ "max_vertex_uniform_blocks",						 GL_MAX_VERTEX_UNIFORM_BLOCKS,						 14,	0, "" },
98 		{ "max_vertex_output_components",					 GL_MAX_VERTEX_OUTPUT_COMPONENTS,					 64,	0, "gl_MaxVertexOutputComponents" },
99 		{ "max_vertex_texture_image_units",					 GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS,					 16,	0, "gl_MaxVertexTextureImageUnits" },
100 		{ "max_vertex_atomic_counter_buffers",				 GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS,				 0,		0, "gl_MaxVertexAtomicCounterBuffers" },
101 		{ "max_vertex_atomic_counters",						 GL_MAX_VERTEX_ATOMIC_COUNTERS,						 0,		0, "gl_MaxVertexAtomicCounters" },
102 		{ "max_vertex_shader_storage_blocks",				 GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS,				 0,		0, "" },
103 		{ "max_tess_gen_level",								 GL_MAX_TESS_GEN_LEVEL,								 64,	0, "gl_MaxTessGenLevel" },
104 		{ "max_patch_vertices",								 GL_MAX_PATCH_VERTICES,								 32,	0, "gl_MaxPatchVertices" },
105 		{ "max_tess_control_uniform_components",			 GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS,			 1024,  0, "gl_MaxTessControlUniformComponents" },
106 		{ "max_tess_control_texture_image_units",			 GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS,			 16,	0, "gl_MaxTessControlTextureImageUnits" },
107 		{ "max_tess_control_output_components",				 GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS,				 128,   0, "gl_MaxTessControlOutputComponents" },
108 		{ "max_tess_patch_components",						 GL_MAX_TESS_PATCH_COMPONENTS,						 120,   0, "gl_MaxTessPatchComponents" },
109 		{ "max_tess_control_total_output_components",		 GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS,		 4096,  0, "gl_MaxTessControlTotalOutputComponents" },
110 		{ "max_tess_control_input_components",				 GL_MAX_TESS_CONTROL_INPUT_COMPONENTS,				 128,   0, "gl_MaxTessControlInputComponents" },
111 		{ "max_tess_control_uniform_blocks",				 GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS,				 14,	0, "" },
112 		{ "max_tess_control_atomic_counter_buffers",		 GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS,		 0,		0, "gl_MaxTessControlAtomicCounterBuffers" },
113 		{ "max_tess_control_atomic_counters",				 GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS,				 0,		0, "gl_MaxTessControlAtomicCounters" },
114 		{ "max_tess_control_shader_storage_blocks",			 GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS,			 0,		0, "" },
115 		{ "max_tess_evaluation_uniform_components",			 GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS,			 1024,  0, "gl_MaxTessEvaluationUniformComponents" },
116 		{ "max_tess_evaluation_texture_image_units",		 GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS,		 16,	0, "gl_MaxTessEvaluationTextureImageUnits" },
117 		{ "max_tess_evaluation_output_components",			 GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS,			 128,	0, "gl_MaxTessEvaluationOutputComponents" },
118 		{ "max_tess_evaluation_input_components",			 GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS,			 128,	0, "gl_MaxTessEvaluationInputComponents" },
119 		{ "max_tess_evaluation_uniform_blocks",				 GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS,				 14,	0, "" },
120 		{ "max_tess_evaluation_atomic_counter_buffers",		 GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS,		 0,		0, "gl_MaxTessEvaluationAtomicCounterBuffers" },
121 		{ "max_tess_evaluation_atomic_counters",			 GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS,			 0,		0, "gl_MaxTessEvaluationAtomicCounters" },
122 		{ "max_tess_evaluation_shader_storage_blocks",		 GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS,		 0,		0, "" },
123 		{ "max_geometry_uniform_components",				 GL_MAX_GEOMETRY_UNIFORM_COMPONENTS,				 1024,  0, "gl_MaxGeometryUniformComponents" },
124 		{ "max_geometry_uniform_blocks",					 GL_MAX_GEOMETRY_UNIFORM_BLOCKS,					 14,	0, "" },
125 		{ "max_geometry_input_components",					 GL_MAX_GEOMETRY_INPUT_COMPONENTS,					 64,	0, "gl_MaxGeometryInputComponents" },
126 		{ "max_geometry_output_components",					 GL_MAX_GEOMETRY_OUTPUT_COMPONENTS,					 128,   0, "gl_MaxGeometryOutputComponents" },
127 		{ "max_geometry_output_vertices",					 GL_MAX_GEOMETRY_OUTPUT_VERTICES,					 256,   0, "gl_MaxGeometryOutputVertices" },
128 		{ "max_geometry_total_output_components",			 GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS,			 1024,  0, "gl_MaxGeometryTotalOutputComponents" },
129 		{ "max_geometry_texture_image_units",				 GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS,				 16,	0, "gl_MaxGeometryTextureImageUnits" },
130 		{ "max_geometry_shader_invocations",				 GL_MAX_GEOMETRY_SHADER_INVOCATIONS,				 32,	0, "" },
131 		{ "max_vertex_streams",								 GL_MAX_VERTEX_STREAMS,								 4,		0, "" },
132 		{ "max_geometry_atomic_counter_buffers",			 GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS,			 0,		0, "gl_MaxGeometryAtomicCounterBuffers" },
133 		{ "max_geometry_atomic_counters",					 GL_MAX_GEOMETRY_ATOMIC_COUNTERS,					 0,		0, "gl_MaxGeometryAtomicCounters" },
134 		{ "max_geometry_shader_storage_blocks",				 GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS,				 0,		0, "" },
135 		{ "max_fragment_uniform_components",				 GL_MAX_FRAGMENT_UNIFORM_COMPONENTS,				 1024,  0, "gl_MaxFragmentUniformComponents" },
136 		{ "max_fragment_uniform_vectors",					 GL_MAX_FRAGMENT_UNIFORM_VECTORS,					 256,   0, "gl_MaxFragmentUniformVectors" },
137 		{ "max_fragment_uniform_blocks",					 GL_MAX_FRAGMENT_UNIFORM_BLOCKS,					 14,	0, "" },
138 		{ "max_fragment_input_components",					 GL_MAX_FRAGMENT_INPUT_COMPONENTS,					 128,   0, "gl_MaxFragmentInputComponents" },
139 		{ "max_texture_image_units",						 GL_MAX_TEXTURE_IMAGE_UNITS,						 16,	0, "gl_MaxTextureImageUnits" },
140 		{ "min_program_texture_gather_offset",				 GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET,				-8,		1, "" },
141 		{ "max_program_texture_gather_offset",				 GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET,				 7,		0, "" },
142 		{ "max_fragment_atomic_counter_buffers",			 GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS,			 1,		0, "gl_MaxFragmentAtomicCounterBuffers" },
143 		{ "max_fragment_atomic_counters",					 GL_MAX_FRAGMENT_ATOMIC_COUNTERS,					 8,		0, "gl_MaxFragmentAtomicCounters" },
144 		{ "max_fragment_shader_storage_blocks",				 GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS,				 8,		0, "" },
145 		{ "max_compute_work_group_invocations",				 GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS,				 1024,	0, "" },
146 		{ "max_compute_uniform_blocks",						 GL_MAX_COMPUTE_UNIFORM_BLOCKS,						 14,	0, "" },
147 		{ "max_compute_texture_image_units",				 GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS,				 16,	0, "gl_MaxComputeTextureImageUnits" },
148 		{ "max_compute_atomic_counter_buffers",				 GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS,				 8,		0, "gl_MaxComputeAtomicCounterBuffers" },
149 		{ "max_compute_atomic_counters",					 GL_MAX_COMPUTE_ATOMIC_COUNTERS,					 8,		0, "gl_MaxComputeAtomicCounters" },
150 		{ "max_compute_shared_memory_size",					 GL_MAX_COMPUTE_SHARED_MEMORY_SIZE,					 32768, 0, "" },
151 		{ "max_compute_uniform_components",					 GL_MAX_COMPUTE_UNIFORM_COMPONENTS,					 1024,  0, "gl_MaxComputeUniformComponents" },
152 		{ "max_compute_image_uniforms",						 GL_MAX_COMPUTE_IMAGE_UNIFORMS,						 8,		0, "gl_MaxComputeImageUniforms" },
153 		{ "max_combined_compute_uniform_components",		 GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS,		 0,		0, "" }, // minimum was not specified
154 		{ "max_compute_shader_storage_blocks",				 GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS,				 8,		0, "" },
155 		{ "min_program_texel_offset",						 GL_MIN_PROGRAM_TEXEL_OFFSET,						-8,		1, "gl_MinProgramTexelOffset" },
156 		{ "max_program_texel_offset",						 GL_MAX_PROGRAM_TEXEL_OFFSET,						 7,		0, "gl_MaxProgramTexelOffset" },
157 		{ "max_uniform_buffer_bindings",					 GL_MAX_UNIFORM_BUFFER_BINDINGS,					 84,	0, "" },
158 		{ "max_uniform_block_size",							 GL_MAX_UNIFORM_BLOCK_SIZE,							 16384, 0, "" },
159 		{ "max_combined_uniform_blocks",					 GL_MAX_COMBINED_UNIFORM_BLOCKS,					 70,	0, "" },
160 		{ "max_varying_components",							 GL_MAX_VARYING_COMPONENTS,							 60,	0, "gl_MaxVaryingComponents" },
161 		{ "max_varying_vectors",							 GL_MAX_VARYING_VECTORS,							 15,	0, "gl_MaxVaryingVectors" },
162 		{ "max_combined_texture_image_units",				 GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS,				 80,	0, "gl_MaxCombinedTextureImageUnits" },
163 		{ "max_subroutines",								 GL_MAX_SUBROUTINES,								 256,	0, "" },
164 		{ "max_subroutine_uniform_locations",				 GL_MAX_SUBROUTINE_UNIFORM_LOCATIONS,				 1024,  0, "" },
165 		{ "max_uniform_locations",							 GL_MAX_UNIFORM_LOCATIONS,							 1024,  0, "" },
166 		{ "max_atomic_counter_buffer_bindings",				 GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS,				 1,		0, "" },
167 		{ "max_atomic_counter_buffer_size",					 GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE,					 32,	0, "gl_MaxAtomicCounterBufferSize" },
168 		{ "max_combined_atomic_counter_buffers",			 GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS,			 1,		0, "gl_MaxCombinedAtomicCounterBuffers" },
169 		{ "max_combined_atomic_counters",					 GL_MAX_COMBINED_ATOMIC_COUNTERS,					 8,		0, "gl_MaxCombinedAtomicCounters" },
170 		{ "max_shader_storage_buffer_bindings",				 GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS,				 8,		0, "" },
171 		{ "max_combined_shader_storage_blocks",				 GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS,				 8,		0, "" },
172 		{ "max_image_units",								 GL_MAX_IMAGE_UNITS,								 8,		0, "gl_MaxImageUnits" },
173 		{ "max_combined_shader_output_resources",			 GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES,			 8,		0, "gl_MaxCombinedShaderOutputResources" },
174 		{ "max_image_samples",								 GL_MAX_IMAGE_SAMPLES,								 0,		0, "gl_MaxImageSamples" },
175 		{ "max_vertex_image_uniforms",						 GL_MAX_VERTEX_IMAGE_UNIFORMS,						 0,		0, "gl_MaxVertexImageUniforms" },
176 		{ "max_tess_control_image_uniforms",				 GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS,				 0,		0, "gl_MaxTessControlImageUniforms" },
177 		{ "max_tess_evaluation_image_uniforms",				 GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS,				 0,		0, "gl_MaxTessEvaluationImageUniforms" },
178 		{ "max_geometry_image_uniforms",					 GL_MAX_GEOMETRY_IMAGE_UNIFORMS,					 0,		0, "gl_MaxGeometryImageUniforms" },
179 		{ "max_fragment_image_uniforms",					 GL_MAX_FRAGMENT_IMAGE_UNIFORMS,					 8,		0, "gl_MaxFragmentImageUniforms" },
180 		{ "max_combined_image_uniforms",					 GL_MAX_COMBINED_IMAGE_UNIFORMS,					 8,		0, "gl_MaxCombinedImageUniforms" },
181 		{ "max_combined_vertex_uniform_components",			 GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS,			 cvuc,	0, "" },
182 		{ "max_combined_geometry_uniform_components",		 GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS,		 cguc,	0, "" },
183 		{ "max_combined_tess_control_uniform_components",	 GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS,	 ctcuc,	0, "" },
184 		{ "max_combined_tess_evaluation_uniform_components", GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS, cteuc, 0, "" },
185 		{ "max_combined_fragment_uniform_components",		 GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS,		 cfuc,	0, "" },
186 		{ "max_debug_message_length",						 GL_MAX_DEBUG_MESSAGE_LENGTH,						 1,		0, "" },
187 		{ "max_debug_logged_messages",						 GL_MAX_DEBUG_LOGGED_MESSAGES,						 1,		0, "" },
188 		{ "max_debug_group_stack_depth",					 GL_MAX_DEBUG_GROUP_STACK_DEPTH,					 64,	0, "" },
189 		{ "max_label_length",								 GL_MAX_LABEL_LENGTH,								 256,	0, "" },
190 		{ "max_framebuffer_width",							 GL_MAX_FRAMEBUFFER_WIDTH,							 16384, 0, "" },
191 		{ "max_framebuffer_height",							 GL_MAX_FRAMEBUFFER_HEIGHT,							 16384, 0, "" },
192 		{ "max_framebuffer_layers",							 GL_MAX_FRAMEBUFFER_LAYERS,							 2048,  0, "" },
193 		{ "max_framebuffer_samples",						 GL_MAX_FRAMEBUFFER_SAMPLES,						 4,		0, "" },
194 		{ "max_sample_mask_words",							 GL_MAX_SAMPLE_MASK_WORDS,							 1,		0, "" },
195 		{ "max_samples",									 GL_MAX_SAMPLES,									 4,		0, "gl_MaxSamples" },
196 		{ "max_color_texture_samples",						 GL_MAX_COLOR_TEXTURE_SAMPLES,						 1,		0, "" },
197 		{ "max_depth_texture_samples",						 GL_MAX_DEPTH_TEXTURE_SAMPLES,						 1,		0, "" },
198 		{ "max_integer_samples",							 GL_MAX_INTEGER_SAMPLES,							 1,		0, "" },
199 		{ "max_draw_buffers",								 GL_MAX_DRAW_BUFFERS,								 8,		0, "gl_MaxDrawBuffers" },
200 		{ "max_dual_source_draw_buffers",					 GL_MAX_DUAL_SOURCE_DRAW_BUFFERS,					 1,		0, "" },
201 		{ "max_color_attachments",							 GL_MAX_COLOR_ATTACHMENTS,							 8,		0, "" },
202 		{ "max_transform_feedback_interleaved_components",   GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS,   64,	0, "gl_MaxTransformFeedbackInterleavedComponents" },
203 		{ "max_transform_feedback_separate_attribs",		 GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS,		 4,		0, "" },
204 		{ "max_transform_feedback_separate_components",		 GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS,		 4,		0, "" },
205 		{ "max_transform_feedback_buffers",					 GL_MAX_TRANSFORM_FEEDBACK_BUFFERS,					 4,		0, "gl_MaxTransformFeedbackBuffers" },
206 		{ "max_atomic_counter_bindings",					 GL_NONE,											 4,		0, "gl_MaxAtomicCounterBindings" },
207 		{ "max_combined_image_units_and_fragment_outputs",	 GL_NONE,											 4,		0, "gl_MaxCombinedImageUnitsAndFragmentOutputs" },
208 		{ "max_geometry_varying_components",				 GL_NONE,											 4,		0, "gl_MaxGeometryVaryingComponents" }
209 	};
210 
211 	static const Limit<GLint64> int64Limits[] =
212 	{
213 		{ "max_shader_storage_block_size",					 GL_MAX_SHADER_STORAGE_BLOCK_SIZE,					 134217728,		0, "" },
214 		{ "max_element_index",								 GL_MAX_ELEMENT_INDEX,								 4294967295LL,	0, "" },
215 	};
216 
217 	static const Limit<GLuint64> uint64Limits[] =
218 	{
219 		{ "max_server_wait_timeout",						 GL_MAX_SERVER_WAIT_TIMEOUT,						 0,				0, "" },
220 	};
221 
222 	static const Limit<GLfloat> floatLimits[] =
223 	{
224 		{ "max_texture_lod_bias",							 GL_MAX_TEXTURE_LOD_BIAS,							 2.0,	0, "" },
225 		{ "min_fragment_interpolation_offset",				 GL_MIN_FRAGMENT_INTERPOLATION_OFFSET,				-0.5,	1, "" },
226 		{ "max_fragment_interpolation_offset",				 GL_MAX_FRAGMENT_INTERPOLATION_OFFSET,				 0.5,	0, "" },
227 	};
228 
229 	static const Limit<tcu::IVec3> ivec3Limits[] =
230 	{
231 		{ "max_compute_work_group_count",					 GL_MAX_COMPUTE_WORK_GROUP_COUNT,	 tcu::IVec3(65535,65535,65535),	 0, "gl_MaxComputeWorkGroupCount" },
232 		{ "max_compute_work_group_size",					 GL_MAX_COMPUTE_WORK_GROUP_SIZE,	 tcu::IVec3(1024, 1024, 64),	 0, "gl_MaxComputeWorkGroupSize" },
233 };
234 
235 	for (int idx = 0; idx < DE_LENGTH_OF_ARRAY(intLimits); idx++)
236 	{
237 		const Limit<GLint>& limit = intLimits[idx];
238 		addChild(new glcts::LimitCase<GLint>(m_context, limit.name, limit.token, limit.boundry, limit.isMaximum, "450", limit.builtin ));
239 	}
240 
241 	for (int idx = 0; idx < DE_LENGTH_OF_ARRAY(int64Limits); idx++)
242 	{
243 		const Limit<GLint64>& limit = int64Limits[idx];
244 		addChild(new glcts::LimitCase<GLint64>(m_context, limit.name, limit.token, limit.boundry, limit.isMaximum, "450", limit.builtin ));
245 	}
246 
247 	for (int idx = 0; idx < DE_LENGTH_OF_ARRAY(uint64Limits); idx++)
248 	{
249 		const Limit<GLuint64>& limit = uint64Limits[idx];
250 		addChild(new glcts::LimitCase<GLuint64>(m_context, limit.name, limit.token, limit.boundry, limit.isMaximum, "450", limit.builtin ));
251 	}
252 
253 	for (int idx = 0; idx < DE_LENGTH_OF_ARRAY(floatLimits); idx++)
254 	{
255 		const Limit<GLfloat>& limit = floatLimits[idx];
256 		addChild(new glcts::LimitCase<GLfloat>(m_context, limit.name, limit.token, limit.boundry, limit.isMaximum, "450", limit.builtin ));
257 	}
258 
259 	for (int idx = 0; idx < DE_LENGTH_OF_ARRAY(ivec3Limits); idx++)
260 	{
261 		const Limit<tcu::IVec3>& limit = ivec3Limits[idx];
262 		addChild(new glcts::LimitCase<tcu::IVec3>(m_context, limit.name, limit.token, limit.boundry, limit.isMaximum, "450", limit.builtin ));
263 	}
264 }
265 
266 } /* glcts namespace */
267