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
27using namespace glw;
28
29namespace gl4cts
30{
31
32template <typename Type>
33struct 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 **/
46LimitsTests::LimitsTests(deqp::Context& context) : TestCaseGroup(context, "limits", "Verifies all limits")
47{
48}
49
50void 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,	1, "" },
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