Fix PIPELINE_STAGE_TOP_OF_PIPE_BIT usage in api tests
[platform/upstream/VK-GL-CTS.git] / modules / gles31 / functional / es31fNegativeStateApiTests.cpp
1 /*-------------------------------------------------------------------------
2  * drawElements Quality Program OpenGL ES 3.0 Module
3  * -------------------------------------------------
4  *
5  * Copyright 2014 The Android Open Source Project
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
21  * \brief Negative GL State API tests.
22  *//*--------------------------------------------------------------------*/
23
24 #include "es31fNegativeStateApiTests.hpp"
25
26 #include "gluCallLogWrapper.hpp"
27 #include "gluContextInfo.hpp"
28 #include "gluShaderProgram.hpp"
29
30 #include "glwDefs.hpp"
31 #include "glwEnums.hpp"
32
33 #include "tcuStringTemplate.hpp"
34
35 #include "deMemory.h"
36
37 #include <string>
38 #include <map>
39
40 namespace deqp
41 {
42 namespace gles31
43 {
44 namespace Functional
45 {
46 namespace NegativeTestShared
47 {
48
49 using tcu::TestLog;
50 using glu::CallLogWrapper;
51 using namespace glw;
52
53 static const char* uniformTestVertSource        =       "${GLSL_VERSION_DECL}\n"
54                                                                                                 "uniform mediump vec4 vUnif_vec4;\n"
55                                                                                                 "in mediump vec4 attr;"
56                                                                                                 "layout(shared) uniform Block { mediump vec4 blockVar; };\n"
57                                                                                                 "void main (void)\n"
58                                                                                                 "{\n"
59                                                                                                 "       gl_Position = vUnif_vec4 + blockVar + attr;\n"
60                                                                                                 "}\n\0";
61
62 static const char* uniformTestFragSource        =       "${GLSL_VERSION_DECL}\n"
63                                                                                                 "uniform mediump ivec4 fUnif_ivec4;\n"
64                                                                                                 "uniform mediump uvec4 fUnif_uvec4;\n"
65                                                                                                 "layout(location = 0) out mediump vec4 fragColor;"
66                                                                                                 "void main (void)\n"
67                                                                                                 "{\n"
68                                                                                                 "       fragColor = vec4(vec4(fUnif_ivec4) + vec4(fUnif_uvec4));\n"
69                                                                                                 "}\n\0";
70
71 static std::string getVtxFragVersionSources (const std::string source, NegativeTestContext& ctx)
72 {
73         const bool supportsES32 = glu::contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2));
74
75         std::map<std::string, std::string> args;
76
77         args["GLSL_VERSION_DECL"] = supportsES32 ? getGLSLVersionDeclaration(glu::GLSL_VERSION_320_ES) : getGLSLVersionDeclaration(glu::GLSL_VERSION_300_ES);
78
79         return tcu::StringTemplate(source).specialize(args);
80 }
81
82 // Enabling & disabling states
83 void enable (NegativeTestContext& ctx)
84 {
85         ctx.beginSection("GL_INVALID_ENUM is generated if cap is not one of the allowed values.");
86         ctx.glEnable(-1);
87         ctx.expectError(GL_INVALID_ENUM);
88         ctx.endSection();
89 }
90
91 // Enabling & disabling states
92 void enablei (NegativeTestContext& ctx)
93 {
94         TCU_CHECK_AND_THROW(NotSupportedError, contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)), "This test requires a higher context version.");
95
96         ctx.beginSection("GL_INVALID_ENUM is generated if cap is not one of the allowed values.");
97         ctx.glEnablei(-1, -1);
98         ctx.expectError(GL_INVALID_ENUM);
99         ctx.endSection();
100
101         ctx.beginSection("GL_INVALID_VALUE is generated  if index is greater than or equal to the number of indexed capabilities for cap.");
102         ctx.glEnablei(GL_BLEND, -1);
103         ctx.expectError(GL_INVALID_VALUE);
104         ctx.endSection();
105 }
106
107 void disable (NegativeTestContext& ctx)
108 {
109         ctx.beginSection("GL_INVALID_ENUM is generated if cap is not one of the allowed values.");
110         ctx.glDisable(-1);
111         ctx.expectError(GL_INVALID_ENUM);
112         ctx.endSection();
113 }
114
115 void disablei (NegativeTestContext& ctx)
116 {
117         TCU_CHECK_AND_THROW(NotSupportedError, contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)), "This test requires a higher context version.");
118
119         ctx.beginSection("GL_INVALID_ENUM is generated if cap is not one of the allowed values.");
120         ctx.glDisablei(-1,-1);
121         ctx.expectError(GL_INVALID_ENUM);
122         ctx.endSection();
123
124         ctx.beginSection("GL_INVALID_VALUE is generated  if index is greater than or equal to the number of indexed capabilities for cap.");
125         ctx.glDisablei(GL_BLEND, -1);
126         ctx.expectError(GL_INVALID_VALUE);
127         ctx.endSection();
128 }
129
130 // Simple state queries
131 void get_booleanv (NegativeTestContext& ctx)
132 {
133         ctx.beginSection("GL_INVALID_ENUM is generated if pname is not one of the allowed values.");
134         GLboolean params = GL_FALSE;
135         ctx.glGetBooleanv(-1, &params);
136         ctx.expectError(GL_INVALID_ENUM);
137         ctx.endSection();
138 }
139
140 void get_booleani_v (NegativeTestContext& ctx)
141 {
142         GLboolean       data                                            = -1;
143         GLint           maxUniformBufferBindings        = 0;
144
145         ctx.beginSection("GL_INVALID_ENUM is generated if target is not indexed state queriable with these commands.");
146         ctx.glGetBooleani_v(-1, 0, &data);
147         ctx.expectError(GL_INVALID_ENUM);
148         ctx.endSection();
149
150         ctx.beginSection("GL_INVALID_VALUE is generated if index is outside of the valid range for the indexed state target.");
151         ctx.glGetIntegerv(GL_MAX_UNIFORM_BUFFER_BINDINGS, &maxUniformBufferBindings);
152         ctx.expectError(GL_NO_ERROR);
153         ctx.glGetBooleani_v(GL_UNIFORM_BUFFER_BINDING, maxUniformBufferBindings, &data);
154         ctx.expectError(GL_INVALID_VALUE);
155         ctx.endSection();
156 }
157
158 void get_floatv (NegativeTestContext& ctx)
159 {
160         ctx.beginSection("GL_INVALID_ENUM is generated if pname is not one of the allowed values.");
161         GLfloat params = 0.0f;
162         ctx.glGetFloatv(-1, &params);
163         ctx.expectError(GL_INVALID_ENUM);
164         ctx.endSection();
165 }
166
167 void get_integerv (NegativeTestContext& ctx)
168 {
169         GLint params = -1;
170         ctx.beginSection("GL_INVALID_ENUM is generated if pname is not one of the allowed values.");
171         ctx.glGetIntegerv(-1, &params);
172         ctx.expectError(GL_INVALID_ENUM);
173         ctx.endSection();
174 }
175
176 void get_integer64v (NegativeTestContext& ctx)
177 {
178         GLint64 params = -1;
179         ctx.beginSection("GL_INVALID_ENUM is generated if pname is not one of the allowed values.");
180         ctx.glGetInteger64v(-1, &params);
181         ctx.expectError(GL_INVALID_ENUM);
182         ctx.endSection();
183 }
184
185 void get_integeri_v (NegativeTestContext& ctx)
186 {
187         GLint data                                                              = -1;
188         GLint maxUniformBufferBindings                  =  0;
189         GLint maxShaderStorageBufferBindings    =  0;
190
191         ctx.beginSection("GL_INVALID_ENUM is generated if name is not an accepted value.");
192         ctx.glGetIntegeri_v(-1, 0, &data);
193         ctx.expectError(GL_INVALID_ENUM);
194         ctx.endSection();
195
196         ctx.beginSection("GL_INVALID_VALUE is generated if index is outside of the valid range for the indexed state target.");
197         ctx.glGetIntegerv(GL_MAX_UNIFORM_BUFFER_BINDINGS, &maxUniformBufferBindings);
198         ctx.expectError(GL_NO_ERROR);
199         ctx.glGetIntegeri_v(GL_UNIFORM_BUFFER_BINDING, maxUniformBufferBindings, &data);
200         ctx.expectError(GL_INVALID_VALUE);
201         ctx.endSection();
202
203         ctx.beginSection("GL_INVALID_VALUE is generated if index is outside of the valid range for the indexed state target.");
204         ctx.glGetIntegerv(GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS, &maxShaderStorageBufferBindings);
205         ctx.expectError(GL_NO_ERROR);
206         ctx.glGetIntegeri_v(GL_SHADER_STORAGE_BUFFER_BINDING, maxShaderStorageBufferBindings, &data);
207         ctx.expectError(GL_INVALID_VALUE);
208         ctx.endSection();
209 }
210
211 void get_integer64i_v (NegativeTestContext& ctx)
212 {
213         GLint64 data                                                    = (GLint64)-1;
214         GLint   maxUniformBufferBindings                = 0;
215         GLint   maxShaderStorageBufferBindings  = 0;
216
217         ctx.beginSection("GL_INVALID_ENUM is generated if name is not an accepted value.");
218         ctx.glGetInteger64i_v(-1, 0, &data);
219         ctx.expectError(GL_INVALID_ENUM);
220         ctx.endSection();
221
222         ctx.beginSection("GL_INVALID_VALUE is generated if index is outside of the valid range for the indexed state target.");
223         ctx.glGetIntegerv(GL_MAX_UNIFORM_BUFFER_BINDINGS, &maxUniformBufferBindings);
224         ctx.expectError(GL_NO_ERROR);
225         ctx.glGetInteger64i_v(GL_UNIFORM_BUFFER_START, maxUniformBufferBindings, &data);
226         ctx.expectError(GL_INVALID_VALUE);
227         ctx.endSection();
228
229         ctx.beginSection("GL_INVALID_VALUE is generated if index is outside of the valid range for the indexed state target.");
230         ctx.glGetIntegerv(GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS, &maxShaderStorageBufferBindings);
231         ctx.expectError(GL_NO_ERROR);
232         ctx.glGetInteger64i_v(GL_SHADER_STORAGE_BUFFER_START, maxShaderStorageBufferBindings, &data);
233         ctx.expectError(GL_INVALID_VALUE);
234         ctx.glGetInteger64i_v(GL_SHADER_STORAGE_BUFFER_SIZE, maxShaderStorageBufferBindings, &data);
235         ctx.expectError(GL_INVALID_VALUE);
236         ctx.endSection();
237 }
238
239 void get_string (NegativeTestContext& ctx)
240 {
241         ctx.beginSection("GL_INVALID_ENUM is generated if name is not an accepted value.");
242         ctx.glGetString(-1);
243         ctx.expectError(GL_INVALID_ENUM);
244         ctx.endSection();
245 }
246
247 void get_stringi (NegativeTestContext& ctx)
248 {
249         GLint numExtensions     = 0;
250
251         ctx.beginSection("GL_INVALID_ENUM is generated if name is not an accepted value.");
252         ctx.glGetStringi(-1, 0);
253         ctx.expectError(GL_INVALID_ENUM);
254         ctx.endSection();
255
256         ctx.beginSection("GL_INVALID_VALUE is generated if index is outside the valid range for indexed state name.");
257         ctx.glGetIntegerv(GL_NUM_EXTENSIONS, &numExtensions);
258         ctx.glGetStringi(GL_EXTENSIONS, numExtensions);
259         ctx.expectError(GL_INVALID_VALUE);
260         ctx.endSection();
261 }
262
263 // Enumerated state queries: Shaders
264
265 void get_attached_shaders (NegativeTestContext& ctx)
266 {
267         GLuint  shaders[1]              = { 0 };
268         GLuint  shaderObject    = ctx.glCreateShader(GL_VERTEX_SHADER);
269         GLuint  program                 = ctx.glCreateProgram();
270         GLsizei count[1]                = { 0 };
271
272         ctx.beginSection("GL_INVALID_VALUE is generated if program is not a value generated by OpenGL.");
273         ctx.glGetAttachedShaders(-1, 1, &count[0], &shaders[0]);
274         ctx.expectError(GL_INVALID_VALUE);
275         ctx.endSection();
276
277         ctx.beginSection("GL_INVALID_OPERATION is generated if program is not a program object.");
278         ctx.glGetAttachedShaders(shaderObject, 1, &count[0], &shaders[0]);
279         ctx.expectError(GL_INVALID_OPERATION);
280         ctx.endSection();
281
282         ctx.beginSection("GL_INVALID_VALUE is generated if maxCount is less than 0.");
283         ctx.glGetAttachedShaders(program, -1, &count[0], &shaders[0]);
284         ctx.expectError(GL_INVALID_VALUE);
285         ctx.endSection();
286
287         ctx.glDeleteShader(shaderObject);
288         ctx.glDeleteProgram(program);
289 }
290
291 void get_shaderiv (NegativeTestContext& ctx)
292 {
293         GLboolean       shaderCompilerSupported;
294         GLuint          shader          = ctx.glCreateShader(GL_VERTEX_SHADER);
295         GLuint          program         = ctx.glCreateProgram();
296         GLint           param[1]        = { -1 };
297
298         ctx.glGetBooleanv(GL_SHADER_COMPILER, &shaderCompilerSupported);
299         ctx.getLog() << TestLog::Message << "// GL_SHADER_COMPILER = " << (shaderCompilerSupported ? "GL_TRUE" : "GL_FALSE") << TestLog::EndMessage;
300
301         ctx.beginSection("GL_INVALID_ENUM is generated if pname is not an accepted value.");
302         ctx.glGetShaderiv(shader, -1, &param[0]);
303         ctx.expectError(GL_INVALID_ENUM);
304         ctx.endSection();
305
306         ctx.beginSection("GL_INVALID_VALUE is generated if shader is not a value generated by OpenGL.");
307         ctx.glGetShaderiv(-1, GL_SHADER_TYPE, &param[0]);
308         ctx.expectError(GL_INVALID_VALUE);
309         ctx.endSection();
310
311         ctx.beginSection("GL_INVALID_OPERATION is generated if shader does not refer to a shader object.");
312         ctx.glGetShaderiv(program, GL_SHADER_TYPE, &param[0]);
313         ctx.expectError(GL_INVALID_OPERATION);
314         ctx.endSection();
315
316         ctx.glDeleteShader(shader);
317         ctx.glDeleteProgram(program);
318 }
319
320 void get_shader_info_log (NegativeTestContext& ctx)
321 {
322         GLuint shader           = ctx.glCreateShader(GL_VERTEX_SHADER);
323         GLuint program          = ctx.glCreateProgram();
324         GLsizei length[1]       = { -1 };
325         char infoLog[128]       = { 0 };
326
327         ctx.beginSection("GL_INVALID_VALUE is generated if shader is not a value generated by OpenGL.");
328         ctx.glGetShaderInfoLog(-1, 128, &length[0], &infoLog[0]);
329         ctx.expectError(GL_INVALID_VALUE);
330         ctx.endSection();
331
332         ctx.beginSection("GL_INVALID_OPERATION is generated if shader is not a shader object.");
333         ctx.glGetShaderInfoLog(program, 128, &length[0], &infoLog[0]);
334         ctx.expectError(GL_INVALID_OPERATION);
335         ctx.endSection();
336
337         ctx.beginSection("GL_INVALID_VALUE is generated if maxLength is less than 0.");
338         ctx.glGetShaderInfoLog(shader, -1, &length[0], &infoLog[0]);
339         ctx.expectError(GL_INVALID_VALUE);
340         ctx.endSection();
341
342         ctx.glDeleteShader(shader);
343         ctx.glDeleteProgram(program);
344 }
345
346 void get_shader_precision_format (NegativeTestContext& ctx)
347 {
348         GLboolean       shaderCompilerSupported;
349         GLint           range[2];
350         GLint           precision[1];
351
352         ctx.glGetBooleanv(GL_SHADER_COMPILER, &shaderCompilerSupported);
353         ctx.getLog() << TestLog::Message << "// GL_SHADER_COMPILER = " << (shaderCompilerSupported ? "GL_TRUE" : "GL_FALSE") << TestLog::EndMessage;
354
355         deMemset(&range[0], 0xcd, sizeof(range));
356         deMemset(&precision[0], 0xcd, sizeof(precision));
357
358         ctx.beginSection("GL_INVALID_ENUM is generated if shaderType or precisionType is not an accepted value.");
359         ctx.glGetShaderPrecisionFormat (-1, GL_MEDIUM_FLOAT, &range[0], &precision[0]);
360         ctx.expectError(GL_INVALID_ENUM);
361         ctx.glGetShaderPrecisionFormat (GL_VERTEX_SHADER, -1, &range[0], &precision[0]);
362         ctx.expectError(GL_INVALID_ENUM);
363         ctx.glGetShaderPrecisionFormat (-1, -1, &range[0], &precision[0]);
364         ctx.expectError(GL_INVALID_ENUM);
365         ctx.endSection();
366 }
367
368 void get_shader_source (NegativeTestContext& ctx)
369 {
370         GLsizei length[1]       = { 0 };
371         char    source[1]       = { 0 };
372         GLuint  program         = ctx.glCreateProgram();
373         GLuint  shader          = ctx.glCreateShader(GL_VERTEX_SHADER);
374
375         ctx.beginSection("GL_INVALID_VALUE is generated if shader is not a value generated by OpenGL.");
376         ctx.glGetShaderSource(-1, 1, &length[0], &source[0]);
377         ctx.expectError(GL_INVALID_VALUE);
378         ctx.endSection();
379
380         ctx.beginSection("GL_INVALID_OPERATION is generated if shader is not a shader object.");
381         ctx.glGetShaderSource(program, 1, &length[0], &source[0]);
382         ctx.expectError(GL_INVALID_OPERATION);
383         ctx.endSection();
384
385         ctx.beginSection("GL_INVALID_VALUE is generated if bufSize is less than 0.");
386         ctx.glGetShaderSource(shader, -1, &length[0], &source[0]);
387         ctx.expectError(GL_INVALID_VALUE);
388         ctx.endSection();
389
390         ctx.glDeleteProgram(program);
391         ctx.glDeleteShader(shader);
392 }
393
394 // Enumerated state queries: Programs
395
396 void get_programiv (NegativeTestContext& ctx)
397 {
398         GLuint  program         = ctx.glCreateProgram();
399         GLuint  shader          = ctx.glCreateShader(GL_VERTEX_SHADER);
400         GLint   params[1]       = { 0 };
401
402         ctx.beginSection("GL_INVALID_ENUM is generated if pname is not an accepted value.");
403         ctx.glGetProgramiv(program, -1, &params[0]);
404         ctx.expectError(GL_INVALID_ENUM);
405         ctx.endSection();
406
407         ctx.beginSection("GL_INVALID_VALUE is generated if program is not a value generated by OpenGL.");
408         ctx.glGetProgramiv(-1, GL_LINK_STATUS, &params[0]);
409         ctx.expectError(GL_INVALID_VALUE);
410         ctx.endSection();
411
412         ctx.beginSection("GL_INVALID_OPERATION is generated if program does not refer to a program object.");
413         ctx.glGetProgramiv(shader, GL_LINK_STATUS, &params[0]);
414         ctx.expectError(GL_INVALID_OPERATION);
415         ctx.endSection();
416
417         ctx.glDeleteProgram(program);
418         ctx.glDeleteShader(shader);
419 }
420
421 void get_program_info_log (NegativeTestContext& ctx)
422 {
423         GLuint  program         = ctx.glCreateProgram();
424         GLuint  shader          = ctx.glCreateShader(GL_VERTEX_SHADER);
425         GLsizei length[1]       = { 0 };
426         char    infoLog[1]      = { 'x' };
427
428         ctx.beginSection("GL_INVALID_VALUE is generated if program is not a value generated by OpenGL.");
429         ctx.glGetProgramInfoLog (-1, 1, &length[0], &infoLog[0]);
430         ctx.expectError(GL_INVALID_VALUE);
431         ctx.endSection();
432
433         ctx.beginSection("GL_INVALID_OPERATION is generated if program is not a program object.");
434         ctx.glGetProgramInfoLog (shader, 1, &length[0], &infoLog[0]);
435         ctx.expectError(GL_INVALID_OPERATION);
436         ctx.endSection();
437
438         ctx.beginSection("GL_INVALID_VALUE is generated if maxLength is less than 0.");
439         ctx.glGetProgramInfoLog (program, -1, &length[0], &infoLog[0]);
440         ctx.expectError(GL_INVALID_VALUE);
441         ctx.endSection();
442
443         ctx.glDeleteProgram(program);
444         ctx.glDeleteShader(shader);
445 }
446
447 // Enumerated state queries: Shader variables
448
449 void get_tex_parameterfv (NegativeTestContext& ctx)
450 {
451         GLfloat params[1] = { 0 };
452
453         ctx.beginSection("GL_INVALID_ENUM is generated if target or pname is not an accepted value.");
454         ctx.glGetTexParameterfv (-1, GL_TEXTURE_MAG_FILTER, &params[0]);
455         ctx.expectError(GL_INVALID_ENUM);
456         ctx.glGetTexParameterfv (GL_TEXTURE_2D, -1, &params[0]);
457         ctx.expectError(GL_INVALID_ENUM);
458         ctx.glGetTexParameterfv (-1, -1, &params[0]);
459         ctx.expectError(GL_INVALID_ENUM);
460         ctx.endSection();
461 }
462
463 void get_tex_parameteriv (NegativeTestContext& ctx)
464 {
465         GLint params[1] = { 0 };
466
467         ctx.beginSection("GL_INVALID_ENUM is generated if target or pname is not an accepted value.");
468         ctx.glGetTexParameteriv (-1, GL_TEXTURE_MAG_FILTER, &params[0]);
469         ctx.expectError(GL_INVALID_ENUM);
470         ctx.glGetTexParameteriv (GL_TEXTURE_2D, -1, &params[0]);
471         ctx.expectError(GL_INVALID_ENUM);
472         ctx.glGetTexParameteriv (-1, -1, &params[0]);
473         ctx.expectError(GL_INVALID_ENUM);
474         ctx.endSection();
475 }
476
477 void get_tex_parameteriiv (NegativeTestContext& ctx)
478 {
479         TCU_CHECK_AND_THROW(NotSupportedError, contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)), "This test requires a higher context version.");
480
481         GLint params[1] = { 0 };
482
483         ctx.beginSection("GL_INVALID_ENUM is generated if target or pname is not an accepted value.");
484         ctx.glGetTexParameterIiv(-1, GL_TEXTURE_MAG_FILTER, &params[0]);
485         ctx.expectError(GL_INVALID_ENUM);
486         ctx.glGetTexParameterIiv(GL_TEXTURE_2D, -1, &params[0]);
487         ctx.expectError(GL_INVALID_ENUM);
488         ctx.glGetTexParameterIiv(-1, -1, &params[0]);
489         ctx.expectError(GL_INVALID_ENUM);
490         ctx.endSection();
491 }
492
493 void get_tex_parameteriuiv (NegativeTestContext& ctx)
494 {
495         TCU_CHECK_AND_THROW(NotSupportedError, contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)), "This test requires a higher context version.");
496
497         GLuint params[1] = { 0 };
498
499         ctx.beginSection("GL_INVALID_ENUM is generated if target or pname is not an accepted value.");
500         ctx.glGetTexParameterIuiv(-1, GL_TEXTURE_MAG_FILTER, &params[0]);
501         ctx.expectError(GL_INVALID_ENUM);
502         ctx.glGetTexParameterIuiv(GL_TEXTURE_2D, -1, &params[0]);
503         ctx.expectError(GL_INVALID_ENUM);
504         ctx.glGetTexParameterIuiv(-1, -1, &params[0]);
505         ctx.expectError(GL_INVALID_ENUM);
506         ctx.endSection();
507 }
508
509 void get_uniformfv (NegativeTestContext& ctx)
510 {
511         glu::ShaderProgram      program         (ctx.getRenderContext(), glu::makeVtxFragSources(getVtxFragVersionSources(uniformTestVertSource, ctx), getVtxFragVersionSources(uniformTestFragSource, ctx)));
512         GLfloat                         params[4]       = { 0.f };
513         GLuint                          shader;
514         GLuint                          programEmpty;
515         GLint                           unif;
516
517         ctx.glUseProgram(program.getProgram());
518
519         unif = ctx.glGetUniformLocation(program.getProgram(), "vUnif_vec4");    // vec4
520         if (unif == -1)
521                 ctx.fail("Failed to retrieve uniform location");
522
523         shader = ctx.glCreateShader(GL_VERTEX_SHADER);
524         programEmpty = ctx.glCreateProgram();
525
526         ctx.beginSection("GL_INVALID_VALUE is generated if program is not a value generated by OpenGL.");
527         ctx.glGetUniformfv (-1, unif, &params[0]);
528         ctx.expectError(GL_INVALID_VALUE);
529         ctx.endSection();
530
531         ctx.beginSection("GL_INVALID_OPERATION is generated if program is not a program object.");
532         ctx.glGetUniformfv (shader, unif, &params[0]);
533         ctx.expectError(GL_INVALID_OPERATION);
534         ctx.endSection();
535
536         ctx.beginSection("GL_INVALID_OPERATION is generated if program has not been successfully linked.");
537         ctx.glGetUniformfv (programEmpty, unif, &params[0]);
538         ctx.expectError(GL_INVALID_OPERATION);
539         ctx.endSection();
540
541         ctx.beginSection("GL_INVALID_OPERATION is generated if location does not correspond to a valid uniform variable location for the specified program object.");
542         ctx.glGetUniformfv (program.getProgram(), -1, &params[0]);
543         ctx.expectError(GL_INVALID_OPERATION);
544         ctx.endSection();
545
546         ctx.glDeleteShader(shader);
547         ctx.glDeleteProgram(programEmpty);
548 }
549
550 void get_nuniformfv (NegativeTestContext& ctx)
551 {
552         TCU_CHECK_AND_THROW(NotSupportedError, contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)), "This test requires a higher context version.");
553
554         glu::ShaderProgram      program                 (ctx.getRenderContext(), glu::makeVtxFragSources(getVtxFragVersionSources(uniformTestVertSource, ctx), getVtxFragVersionSources(uniformTestFragSource, ctx)));
555         GLint                           unif                    = ctx.glGetUniformLocation(program.getProgram(), "vUnif_vec4");
556         GLfloat                         params[4]               = { 0.0f, 0.0f, 0.0f, 0.0f };
557         GLuint                          shader;
558         GLuint                          programEmpty;
559         GLsizei                         bufferSize;
560
561         ctx.glUseProgram(program.getProgram());
562
563         if (unif == -1)
564                 ctx.fail("Failed to retrieve uniform location");
565
566         shader                  = ctx.glCreateShader(GL_VERTEX_SHADER);
567         programEmpty    = ctx.glCreateProgram();
568
569         ctx.glGetIntegerv(GL_MAX_COMBINED_UNIFORM_BLOCKS, &bufferSize);
570
571         ctx.beginSection("GL_INVALID_VALUE is generated if program is not a value generated by OpenGL.");
572         ctx.glGetnUniformfv(-1, unif, bufferSize, &params[0]);
573         ctx.expectError(GL_INVALID_VALUE);
574         ctx.endSection();
575
576         ctx.beginSection("GL_INVALID_OPERATION is generated if program is not a program object.");
577         ctx.glGetnUniformfv(shader, unif, bufferSize, &params[0]);
578         ctx.expectError(GL_INVALID_OPERATION);
579         ctx.endSection();
580
581         ctx.beginSection("GL_INVALID_OPERATION is generated if program has not been successfully linked.");
582         ctx.glGetnUniformfv(programEmpty, unif, bufferSize, &params[0]);
583         ctx.expectError(GL_INVALID_OPERATION);
584         ctx.endSection();
585
586         ctx.beginSection("GL_INVALID_OPERATION is generated if location does not correspond to a valid uniform variable location for the specified program object.");
587         ctx.glGetnUniformfv(program.getProgram(), -1, bufferSize, &params[0]);
588         ctx.expectError(GL_INVALID_OPERATION);
589         ctx.endSection();
590
591         ctx.beginSection("GL_INVALID_OPERATION is generated if the buffer size required to store the requested data is greater than bufSize.");
592         ctx.glGetnUniformfv(program.getProgram(), unif, 0, &params[0]);
593         ctx.expectError(GL_INVALID_OPERATION);
594         ctx.endSection();
595
596         ctx.glDeleteShader(shader);
597         ctx.glDeleteProgram(programEmpty);
598 }
599
600 void get_uniformiv (NegativeTestContext& ctx)
601 {
602         glu::ShaderProgram      program                 (ctx.getRenderContext(), glu::makeVtxFragSources(getVtxFragVersionSources(uniformTestVertSource, ctx), getVtxFragVersionSources(uniformTestFragSource, ctx)));
603         GLint                           unif                    = ctx.glGetUniformLocation(program.getProgram(), "fUnif_ivec4");
604         GLint                           params[4]               = { 0, 0, 0, 0 };
605         GLuint                          shader;
606         GLuint                          programEmpty;
607
608         ctx.glUseProgram(program.getProgram());
609
610         if (unif == -1)
611                 ctx.fail("Failed to retrieve uniform location");
612
613         shader = ctx.glCreateShader(GL_VERTEX_SHADER);
614         programEmpty = ctx.glCreateProgram();
615
616         ctx.beginSection("GL_INVALID_VALUE is generated if program is not a value generated by OpenGL.");
617         ctx.glGetUniformiv (-1, unif, &params[0]);
618         ctx.expectError(GL_INVALID_VALUE);
619         ctx.endSection();
620
621         ctx.beginSection("GL_INVALID_OPERATION is generated if program is not a program object.");
622         ctx.glGetUniformiv (shader, unif, &params[0]);
623         ctx.expectError(GL_INVALID_OPERATION);
624         ctx.endSection();
625
626         ctx.beginSection("GL_INVALID_OPERATION is generated if program has not been successfully linked.");
627         ctx.glGetUniformiv (programEmpty, unif, &params[0]);
628         ctx.expectError(GL_INVALID_OPERATION);
629         ctx.endSection();
630
631         ctx.beginSection("GL_INVALID_OPERATION is generated if location does not correspond to a valid uniform variable location for the specified program object.");
632         ctx.glGetUniformiv (program.getProgram(), -1, &params[0]);
633         ctx.expectError(GL_INVALID_OPERATION);
634         ctx.endSection();
635
636         ctx.glDeleteShader(shader);
637         ctx.glDeleteProgram(programEmpty);
638 }
639
640 void get_nuniformiv (NegativeTestContext& ctx)
641 {
642         TCU_CHECK_AND_THROW(NotSupportedError, contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)), "This test requires a higher context version.");
643
644         glu::ShaderProgram      program                 (ctx.getRenderContext(), glu::makeVtxFragSources(getVtxFragVersionSources(uniformTestVertSource, ctx), getVtxFragVersionSources(uniformTestFragSource, ctx)));
645         GLint                           unif                    = ctx.glGetUniformLocation(program.getProgram(), "fUnif_ivec4");
646         GLint                           params[4]               = { 0, 0, 0, 0 };
647         GLuint                          shader;
648         GLuint                          programEmpty;
649         GLsizei                         bufferSize;
650
651         ctx.glUseProgram(program.getProgram());
652
653         if (unif == -1)
654                 ctx.fail("Failed to retrieve uniform location");
655
656         shader = ctx.glCreateShader(GL_VERTEX_SHADER);
657         programEmpty = ctx.glCreateProgram();
658
659         ctx.glGetIntegerv(GL_MAX_COMBINED_UNIFORM_BLOCKS, &bufferSize);
660
661         ctx.beginSection("GL_INVALID_VALUE is generated if program is not a value generated by OpenGL.");
662         ctx.glGetnUniformiv(-1, unif, bufferSize, &params[0]);
663         ctx.expectError(GL_INVALID_VALUE);
664         ctx.endSection();
665
666         ctx.beginSection("GL_INVALID_OPERATION is generated if program is not a program object.");
667         ctx.glGetnUniformiv(shader, unif, bufferSize, &params[0]);
668         ctx.expectError(GL_INVALID_OPERATION);
669         ctx.endSection();
670
671         ctx.beginSection("GL_INVALID_OPERATION is generated if program has not been successfully linked.");
672         ctx.glGetnUniformiv(programEmpty, unif, bufferSize, &params[0]);
673         ctx.expectError(GL_INVALID_OPERATION);
674         ctx.endSection();
675
676         ctx.beginSection("GL_INVALID_OPERATION is generated if location does not correspond to a valid uniform variable location for the specified program object.");
677         ctx.glGetnUniformiv(program.getProgram(), -1, bufferSize, &params[0]);
678         ctx.expectError(GL_INVALID_OPERATION);
679         ctx.endSection();
680
681         ctx.beginSection("GL_INVALID_OPERATION is generated if the buffer size required to store the requested data is greater than bufSize.");
682         ctx.glGetnUniformiv(program.getProgram(), unif, - 1, &params[0]);
683         ctx.expectError(GL_INVALID_OPERATION);
684         ctx.endSection();
685
686         ctx.glDeleteShader(shader);
687         ctx.glDeleteProgram(programEmpty);
688 }
689
690 void get_uniformuiv (NegativeTestContext& ctx)
691 {
692         glu::ShaderProgram      program                 (ctx.getRenderContext(), glu::makeVtxFragSources(getVtxFragVersionSources(uniformTestVertSource, ctx), getVtxFragVersionSources(uniformTestFragSource, ctx)));
693         GLint                           unif                    = ctx.glGetUniformLocation(program.getProgram(), "fUnif_uvec4");
694         GLuint                          params[4]               = { 0, 0, 0, 0 };
695         GLuint                          shader;
696         GLuint                          programEmpty;
697
698         ctx.glUseProgram(program.getProgram());
699
700         if (unif == -1)
701                 ctx.fail("Failed to retrieve uniform location");
702
703         shader = ctx.glCreateShader(GL_VERTEX_SHADER);
704         programEmpty = ctx.glCreateProgram();
705
706         ctx.beginSection("GL_INVALID_VALUE is generated if program is not a value generated by OpenGL.");
707         ctx.glGetUniformuiv (-1, unif, &params[0]);
708         ctx.expectError(GL_INVALID_VALUE);
709         ctx.endSection();
710
711         ctx.beginSection("GL_INVALID_OPERATION is generated if program is not a program object.");
712         ctx.glGetUniformuiv (shader, unif, &params[0]);
713         ctx.expectError(GL_INVALID_OPERATION);
714         ctx.endSection();
715
716         ctx.beginSection("GL_INVALID_OPERATION is generated if program has not been successfully linked.");
717         ctx.glGetUniformuiv (programEmpty, unif, &params[0]);
718         ctx.expectError(GL_INVALID_OPERATION);
719         ctx.endSection();
720
721         ctx.beginSection("GL_INVALID_OPERATION is generated if location does not correspond to a valid uniform variable location for the specified program object.");
722         ctx.glGetUniformuiv (program.getProgram(), -1, &params[0]);
723         ctx.expectError(GL_INVALID_OPERATION);
724         ctx.endSection();
725
726         ctx.glDeleteShader(shader);
727         ctx.glDeleteProgram(programEmpty);
728 }
729
730 void get_nuniformuiv (NegativeTestContext& ctx)
731 {
732         TCU_CHECK_AND_THROW(NotSupportedError, contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)), "This test requires a higher context version.");
733
734         glu::ShaderProgram      program                 (ctx.getRenderContext(), glu::makeVtxFragSources(getVtxFragVersionSources(uniformTestVertSource, ctx), getVtxFragVersionSources(uniformTestFragSource, ctx)));
735         GLint                           unif                    = ctx.glGetUniformLocation(program.getProgram(), "fUnif_ivec4");
736         GLuint                          params[4]               = { 0, 0, 0, 0 };
737         GLuint                          shader;
738         GLuint                          programEmpty;
739         GLsizei                         bufferSize;
740
741         ctx.glUseProgram(program.getProgram());
742
743         if (unif == -1)
744                 ctx.fail("Failed to retrieve uniform location");
745
746         shader = ctx.glCreateShader(GL_VERTEX_SHADER);
747         programEmpty = ctx.glCreateProgram();
748
749         ctx.glGetIntegerv(GL_MAX_COMBINED_UNIFORM_BLOCKS, &bufferSize);
750
751         ctx.beginSection("GL_INVALID_VALUE is generated if program is not a value generated by OpenGL.");
752         ctx.glGetnUniformuiv(-1, unif, bufferSize, &params[0]);
753         ctx.expectError(GL_INVALID_VALUE);
754         ctx.endSection();
755
756         ctx.beginSection("GL_INVALID_OPERATION is generated if program is not a program object.");
757         ctx.glGetnUniformuiv(shader, unif, bufferSize, &params[0]);
758         ctx.expectError(GL_INVALID_OPERATION);
759         ctx.endSection();
760
761         ctx.beginSection("GL_INVALID_OPERATION is generated if program has not been successfully linked.");
762         ctx.glGetnUniformuiv(programEmpty, unif, bufferSize, &params[0]);
763         ctx.expectError(GL_INVALID_OPERATION);
764         ctx.endSection();
765
766         ctx.beginSection("GL_INVALID_OPERATION is generated if location does not correspond to a valid uniform variable location for the specified program object.");
767         ctx.glGetnUniformuiv(program.getProgram(), -1, bufferSize, &params[0]);
768         ctx.expectError(GL_INVALID_OPERATION);
769         ctx.endSection();
770
771         ctx.beginSection("GL_INVALID_OPERATION is generated if the buffer size required to store the requested data is greater than bufSize.");
772         ctx.glGetnUniformuiv(program.getProgram(), unif, -1, &params[0]);
773         ctx.expectError(GL_INVALID_OPERATION);
774         ctx.endSection();
775
776         ctx.glDeleteShader(shader);
777         ctx.glDeleteProgram(programEmpty);
778 }
779
780 void get_active_uniform (NegativeTestContext& ctx)
781 {
782         GLuint                          shader                          = ctx.glCreateShader(GL_VERTEX_SHADER);
783         glu::ShaderProgram      program                         (ctx.getRenderContext(), glu::makeVtxFragSources(getVtxFragVersionSources(uniformTestVertSource, ctx), getVtxFragVersionSources(uniformTestFragSource, ctx)));
784         GLint                           numActiveUniforms       = -1;
785
786         ctx.glGetProgramiv      (program.getProgram(), GL_ACTIVE_UNIFORMS,      &numActiveUniforms);
787         ctx.getLog() << TestLog::Message << "// GL_ACTIVE_UNIFORMS = " << numActiveUniforms << " (expected 4)." << TestLog::EndMessage;
788
789         ctx.beginSection("GL_INVALID_VALUE is generated if program is not a value generated by OpenGL.");
790         ctx.glGetActiveUniform(-1, 0, 0, 0, 0, 0, 0);
791         ctx.expectError(GL_INVALID_VALUE);
792         ctx.endSection();
793
794         ctx.beginSection("GL_INVALID_OPERATION is generated if program is not a program object.");
795         ctx.glGetActiveUniform(shader, 0, 0, 0, 0, 0, 0);
796         ctx.expectError(GL_INVALID_OPERATION);
797         ctx.endSection();
798
799         ctx.beginSection("GL_INVALID_VALUE is generated if index is greater than or equal to the number of active uniform variables in program.");
800         ctx.glUseProgram(program.getProgram());
801         ctx.glGetActiveUniform(program.getProgram(), numActiveUniforms, 0, 0, 0, 0, 0);
802         ctx.expectError(GL_INVALID_VALUE);
803         ctx.endSection();
804
805         ctx.beginSection("GL_INVALID_VALUE is generated if bufSize is less than 0.");
806         ctx.glGetActiveUniform(program.getProgram(), 0, -1, 0, 0, 0, 0);
807         ctx.expectError(GL_INVALID_VALUE);
808         ctx.endSection();
809
810         ctx.glUseProgram(0);
811         ctx.glDeleteShader(shader);
812 }
813
814 void get_active_uniformsiv (NegativeTestContext& ctx)
815 {
816         GLuint                                  shader                          = ctx.glCreateShader(GL_VERTEX_SHADER);
817         glu::ShaderProgram              program                         (ctx.getRenderContext(), glu::makeVtxFragSources(getVtxFragVersionSources(uniformTestVertSource, ctx), getVtxFragVersionSources(uniformTestFragSource, ctx)));
818         GLuint                                  dummyUniformIndex       = 1;
819         GLint                                   dummyParamDst           = -1;
820         GLint                                   numActiveUniforms       = -1;
821
822         ctx.glUseProgram(program.getProgram());
823
824         ctx.glGetProgramiv      (program.getProgram(), GL_ACTIVE_UNIFORMS, &numActiveUniforms);
825         ctx.getLog() << TestLog::Message << "// GL_ACTIVE_UNIFORMS = " << numActiveUniforms << " (expected 4)." << TestLog::EndMessage;
826
827         ctx.beginSection("GL_INVALID_VALUE is generated if program is not a value generated by OpenGL.");
828         ctx.glGetActiveUniformsiv(-1, 1, &dummyUniformIndex, GL_UNIFORM_TYPE, &dummyParamDst);
829         ctx.expectError(GL_INVALID_VALUE);
830         ctx.endSection();
831
832         ctx.beginSection("GL_INVALID_OPERATION is generated if program is not a program object.");
833         ctx.glGetActiveUniformsiv(shader, 1, &dummyUniformIndex, GL_UNIFORM_TYPE, &dummyParamDst);
834         ctx.expectError(GL_INVALID_OPERATION);
835         ctx.endSection();
836
837         ctx.beginSection("GL_INVALID_VALUE is generated if any value in uniformIndices is greater than or equal to the value of GL_ACTIVE_UNIFORMS for program.");
838         for (int excess = 0; excess <= 2; excess++)
839         {
840                 std::vector<GLuint> invalidUniformIndices;
841                 invalidUniformIndices.push_back(1);
842                 invalidUniformIndices.push_back(numActiveUniforms-1+excess);
843                 invalidUniformIndices.push_back(1);
844
845                 std::vector<GLint> dummyParamsDst(invalidUniformIndices.size());
846                 ctx.glGetActiveUniformsiv(program.getProgram(), (GLsizei)invalidUniformIndices.size(), &invalidUniformIndices[0], GL_UNIFORM_TYPE, &dummyParamsDst[0]);
847                 ctx.expectError(excess == 0 ? GL_NO_ERROR : GL_INVALID_VALUE);
848         }
849         ctx.endSection();
850
851         ctx.beginSection("GL_INVALID_ENUM is generated if pname is not an accepted token.");
852         ctx.glGetActiveUniformsiv(program.getProgram(), 1, &dummyUniformIndex, -1, &dummyParamDst);
853         ctx.expectError(GL_INVALID_ENUM);
854         ctx.endSection();
855
856         ctx.glUseProgram(0);
857         ctx.glDeleteShader(shader);
858 }
859
860 void get_active_uniform_blockiv (NegativeTestContext& ctx)
861 {
862         glu::ShaderProgram      program                 (ctx.getRenderContext(), glu::makeVtxFragSources(getVtxFragVersionSources(uniformTestVertSource, ctx), getVtxFragVersionSources(uniformTestFragSource, ctx)));
863         GLuint                          shader                  = ctx.glCreateShader(GL_VERTEX_SHADER);
864         GLint                           params                  = -1;
865         GLint                           numActiveBlocks = -1;
866
867         ctx.glGetProgramiv(program.getProgram(), GL_ACTIVE_UNIFORM_BLOCKS, &numActiveBlocks);
868         ctx.getLog() << TestLog::Message << "// GL_ACTIVE_UNIFORM_BLOCKS = " << numActiveBlocks << " (expected 1)." << TestLog::EndMessage;
869         ctx.expectError(GL_NO_ERROR);
870
871         ctx.beginSection("GL_INVALID_VALUE is generated if program is not the name of either a program or shader object.");
872         ctx.glGetActiveUniformBlockiv(-1, 0, GL_UNIFORM_BLOCK_BINDING, &params);
873         ctx.expectError(GL_INVALID_VALUE);
874         ctx.endSection();
875
876         ctx.beginSection("GL_INVALID_OPERATION is generated if program is the name of a shader object");
877         ctx.glGetActiveUniformBlockiv(shader, 0, GL_UNIFORM_BLOCK_BINDING, &params);
878         ctx.expectError(GL_INVALID_OPERATION);
879         ctx.endSection();
880
881         ctx.beginSection("GL_INVALID_VALUE is generated if uniformBlockIndex is greater than or equal to the value of GL_ACTIVE_UNIFORM_BLOCKS or is not the index of an active uniform block in program.");
882         ctx.glUseProgram(program.getProgram());
883         ctx.expectError(GL_NO_ERROR);
884         ctx.glGetActiveUniformBlockiv(program.getProgram(), numActiveBlocks, GL_UNIFORM_BLOCK_BINDING, &params);
885         ctx.expectError(GL_INVALID_VALUE);
886         ctx.endSection();
887
888         ctx.beginSection("GL_INVALID_ENUM is generated if pname is not one of the accepted tokens.");
889         ctx.glGetActiveUniformBlockiv(program.getProgram(), 0, -1, &params);
890         ctx.expectError(GL_INVALID_ENUM);
891         ctx.endSection();
892
893         ctx.glUseProgram(0);
894 }
895
896 void get_active_uniform_block_name (NegativeTestContext& ctx)
897 {
898         glu::ShaderProgram      program                 (ctx.getRenderContext(), glu::makeVtxFragSources(getVtxFragVersionSources(uniformTestVertSource, ctx), getVtxFragVersionSources(uniformTestFragSource, ctx)));
899         GLuint                          shader                  = ctx.glCreateShader(GL_VERTEX_SHADER);
900         GLsizei                         length                  = -1;
901         GLint                           numActiveBlocks = -1;
902         GLchar                          uniformBlockName[128];
903
904         deMemset(&uniformBlockName[0], 0, sizeof(uniformBlockName));
905
906         ctx.glGetProgramiv(program.getProgram(), GL_ACTIVE_UNIFORM_BLOCKS, &numActiveBlocks);
907         ctx.getLog() << TestLog::Message << "// GL_ACTIVE_UNIFORM_BLOCKS = " << numActiveBlocks << " (expected 1)." << TestLog::EndMessage;
908         ctx.expectError(GL_NO_ERROR);
909
910         ctx.beginSection("GL_INVALID_OPERATION is generated if program is the name of a shader object.");
911         ctx.glGetActiveUniformBlockName(shader, numActiveBlocks, GL_UNIFORM_BLOCK_BINDING, &length, &uniformBlockName[0]);
912         ctx.expectError(GL_INVALID_OPERATION);
913         ctx.endSection();
914
915         ctx.beginSection("GL_INVALID_VALUE is generated if program is not the name of either a program or shader object.");
916         ctx.glGetActiveUniformBlockName(-1, numActiveBlocks, GL_UNIFORM_BLOCK_BINDING, &length, &uniformBlockName[0]);
917         ctx.expectError(GL_INVALID_VALUE);
918         ctx.endSection();
919
920         ctx.beginSection("GL_INVALID_VALUE is generated if uniformBlockIndex is greater than or equal to the value of GL_ACTIVE_UNIFORM_BLOCKS or is not the index of an active uniform block in program.");
921         ctx.glUseProgram(program.getProgram());
922         ctx.expectError(GL_NO_ERROR);
923         ctx.glGetActiveUniformBlockName(program.getProgram(), numActiveBlocks, (int)sizeof(uniformBlockName), &length, &uniformBlockName[0]);
924         ctx.expectError(GL_INVALID_VALUE);
925         ctx.endSection();
926
927         ctx.glUseProgram(0);
928 }
929
930 void get_active_attrib (NegativeTestContext& ctx)
931 {
932         GLuint                          shader                          = ctx.glCreateShader(GL_VERTEX_SHADER);
933         glu::ShaderProgram      program                         (ctx.getRenderContext(), glu::makeVtxFragSources(getVtxFragVersionSources(uniformTestVertSource, ctx), getVtxFragVersionSources(uniformTestFragSource, ctx)));
934         GLint                           numActiveAttributes     = -1;
935         GLsizei                         length                          = -1;
936         GLint                           size                            = -1;
937         GLenum                          type                            = -1;
938         GLchar                          name[32];
939
940         deMemset(&name[0], 0, sizeof(name));
941
942         ctx.glGetProgramiv      (program.getProgram(), GL_ACTIVE_ATTRIBUTES,    &numActiveAttributes);
943         ctx.getLog() << TestLog::Message << "// GL_ACTIVE_ATTRIBUTES = " << numActiveAttributes << " (expected 1)." << TestLog::EndMessage;
944
945         ctx.glUseProgram(program.getProgram());
946
947         ctx.beginSection("GL_INVALID_VALUE is generated if program is not a value generated by OpenGL.");
948         ctx.glGetActiveAttrib(-1, 0, 32, &length, &size, &type, &name[0]);
949         ctx.expectError(GL_INVALID_VALUE);
950         ctx.endSection();
951
952         ctx.beginSection("GL_INVALID_OPERATION is generated if program is not a program object.");
953         ctx.glGetActiveAttrib(shader, 0, 32, &length, &size, &type, &name[0]);
954         ctx.expectError(GL_INVALID_OPERATION);
955         ctx.endSection();
956
957         ctx.beginSection("GL_INVALID_VALUE is generated if index is greater than or equal to GL_ACTIVE_ATTRIBUTES.");
958         ctx.glGetActiveAttrib(program.getProgram(), numActiveAttributes, (int)sizeof(name), &length, &size, &type, &name[0]);
959         ctx.expectError(GL_INVALID_VALUE);
960         ctx.endSection();
961
962         ctx.beginSection("GL_INVALID_VALUE is generated if bufSize is less than 0.");
963         ctx.glGetActiveAttrib(program.getProgram(), 0, -1, &length, &size, &type, &name[0]);
964         ctx.expectError(GL_INVALID_VALUE);
965         ctx.endSection();
966
967         ctx.glUseProgram(0);
968         ctx.glDeleteShader(shader);
969 }
970
971 void get_uniform_indices (NegativeTestContext& ctx)
972 {
973         GLuint                          shader                  = ctx.glCreateShader(GL_VERTEX_SHADER);
974         glu::ShaderProgram      program                 (ctx.getRenderContext(), glu::makeVtxFragSources(getVtxFragVersionSources(uniformTestVertSource, ctx), getVtxFragVersionSources(uniformTestFragSource, ctx)));
975         GLint                           numActiveBlocks = -1;
976         const GLchar*           uniformName             = "Block.blockVar";
977         GLuint                          uniformIndices  = -1;
978         GLuint                          invalid                 = -1;
979
980         ctx.glGetProgramiv(program.getProgram(), GL_ACTIVE_UNIFORM_BLOCKS,      &numActiveBlocks);
981         ctx.getLog() << TestLog::Message << "// GL_ACTIVE_UNIFORM_BLOCKS = "            << numActiveBlocks                      << TestLog::EndMessage;
982         ctx.expectError(GL_NO_ERROR);
983
984         ctx.beginSection("GL_INVALID_OPERATION is generated if program is a name of shader object.");
985         ctx.glGetUniformIndices(shader, 1, &uniformName, &uniformIndices);
986         ctx.expectError(GL_INVALID_OPERATION);
987         ctx.endSection();
988
989         ctx.beginSection("GL_INVALID_VALUE is generated if program is not name of program or shader object.");
990         ctx.glGetUniformIndices(invalid, 1, &uniformName, &uniformIndices);
991         ctx.expectError(GL_INVALID_VALUE);
992         ctx.endSection();
993
994         ctx.glUseProgram(0);
995         ctx.glDeleteShader(shader);
996 }
997
998 void get_vertex_attribfv (NegativeTestContext& ctx)
999 {
1000         GLfloat params                          = 0.0f;
1001         GLint   maxVertexAttribs;
1002
1003         ctx.beginSection("GL_INVALID_ENUM is generated if pname is not an accepted value.");
1004         ctx.glGetVertexAttribfv(0, -1, &params);
1005         ctx.expectError(GL_INVALID_ENUM);
1006         ctx.endSection();
1007
1008         ctx.beginSection("GL_INVALID_VALUE is generated if index is greater than or equal to GL_MAX_VERTEX_ATTRIBS.");
1009         ctx.glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &maxVertexAttribs);
1010         ctx.glGetVertexAttribfv(maxVertexAttribs, GL_VERTEX_ATTRIB_ARRAY_ENABLED, &params);
1011         ctx.expectError(GL_INVALID_VALUE);
1012         ctx.endSection();
1013 }
1014
1015 void get_vertex_attribiv (NegativeTestContext& ctx)
1016 {
1017         GLint   params                          = -1;
1018         GLint   maxVertexAttribs;
1019
1020         ctx.beginSection("GL_INVALID_ENUM is generated if pname is not an accepted value.");
1021         ctx.glGetVertexAttribiv(0, -1, &params);
1022         ctx.expectError(GL_INVALID_ENUM);
1023         ctx.endSection();
1024
1025         ctx.beginSection("GL_INVALID_VALUE is generated if index is greater than or equal to GL_MAX_VERTEX_ATTRIBS.");
1026         ctx.glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &maxVertexAttribs);
1027         ctx.glGetVertexAttribiv(maxVertexAttribs, GL_VERTEX_ATTRIB_ARRAY_ENABLED, &params);
1028         ctx.expectError(GL_INVALID_VALUE);
1029         ctx.endSection();
1030 }
1031
1032 void get_vertex_attribi_iv (NegativeTestContext& ctx)
1033 {
1034         GLint   params                          = -1;
1035         GLint   maxVertexAttribs;
1036
1037         ctx.beginSection("GL_INVALID_ENUM is generated if pname is not an accepted value.");
1038         ctx.glGetVertexAttribIiv(0, -1, &params);
1039         ctx.expectError(GL_INVALID_ENUM);
1040         ctx.endSection();
1041
1042         ctx.beginSection("GL_INVALID_VALUE is generated if index is greater than or equal to GL_MAX_VERTEX_ATTRIBS.");
1043         ctx.glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &maxVertexAttribs);
1044         ctx.glGetVertexAttribIiv(maxVertexAttribs, GL_VERTEX_ATTRIB_ARRAY_ENABLED, &params);
1045         ctx.expectError(GL_INVALID_VALUE);
1046         ctx.endSection();
1047 }
1048
1049 void get_vertex_attribi_uiv (NegativeTestContext& ctx)
1050 {
1051         GLuint  params                          = (GLuint)-1;
1052         GLint   maxVertexAttribs;
1053
1054         ctx.beginSection("GL_INVALID_ENUM is generated if pname is not an accepted value.");
1055         ctx.glGetVertexAttribIuiv(0, -1, &params);
1056         ctx.expectError(GL_INVALID_ENUM);
1057         ctx.endSection();
1058
1059         ctx.beginSection("GL_INVALID_VALUE is generated if index is greater than or equal to GL_MAX_VERTEX_ATTRIBS.");
1060         ctx.glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &maxVertexAttribs);
1061         ctx.glGetVertexAttribIuiv(maxVertexAttribs, GL_VERTEX_ATTRIB_ARRAY_ENABLED, &params);
1062         ctx.expectError(GL_INVALID_VALUE);
1063         ctx.endSection();
1064 }
1065
1066 void get_vertex_attrib_pointerv (NegativeTestContext& ctx)
1067 {
1068         GLvoid* ptr[1]                          = { DE_NULL };
1069         GLint   maxVertexAttribs;
1070
1071         ctx.beginSection("GL_INVALID_ENUM is generated if pname is not an accepted value.");
1072         ctx.glGetVertexAttribPointerv(0, -1, &ptr[0]);
1073         ctx.expectError(GL_INVALID_ENUM);
1074         ctx.endSection();
1075
1076         ctx.beginSection("GL_INVALID_VALUE is generated if index is greater than or equal to GL_MAX_VERTEX_ATTRIBS.");
1077         ctx.glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &maxVertexAttribs);
1078         ctx.glGetVertexAttribPointerv(maxVertexAttribs, GL_VERTEX_ATTRIB_ARRAY_POINTER, &ptr[0]);
1079         ctx.expectError(GL_INVALID_VALUE);
1080         ctx.endSection();
1081 }
1082
1083 void get_frag_data_location (NegativeTestContext& ctx)
1084 {
1085         GLuint shader   = ctx.glCreateShader(GL_VERTEX_SHADER);
1086         GLuint program  = ctx.glCreateProgram();
1087
1088         ctx.beginSection("GL_INVALID_OPERATION is generated if program is the name of a shader object.");
1089         ctx.glGetFragDataLocation(shader, "gl_FragColor");
1090         ctx.expectError(GL_INVALID_OPERATION);
1091         ctx.endSection();
1092
1093         ctx.beginSection("GL_INVALID_OPERATION is generated if program has not been linked.");
1094         ctx.glGetFragDataLocation(program, "gl_FragColor");
1095         ctx.expectError(GL_INVALID_OPERATION);
1096         ctx.endSection();
1097
1098         ctx.glDeleteProgram(program);
1099         ctx.glDeleteShader(shader);
1100 }
1101
1102 // Enumerated state queries: Buffers
1103
1104 void get_buffer_parameteriv (NegativeTestContext& ctx)
1105 {
1106         GLint   params  = -1;
1107         GLuint  buf;
1108         ctx.glGenBuffers(1, &buf);
1109         ctx.glBindBuffer(GL_ARRAY_BUFFER, buf);
1110
1111         ctx.beginSection("GL_INVALID_ENUM is generated if target or value is not an accepted value.");
1112         ctx.glGetBufferParameteriv(-1, GL_BUFFER_SIZE, &params);
1113         ctx.expectError(GL_INVALID_ENUM);
1114         ctx.glGetBufferParameteriv(GL_ARRAY_BUFFER, -1, &params);
1115         ctx.expectError(GL_INVALID_ENUM);
1116         ctx.glGetBufferParameteriv(-1, -1, &params);
1117         ctx.expectError(GL_INVALID_ENUM);
1118         ctx.endSection();
1119
1120         ctx.beginSection("GL_INVALID_OPERATION is generated if the reserved buffer object name 0 is bound to target.");
1121         ctx.glBindBuffer(GL_ARRAY_BUFFER, 0);
1122         ctx.glGetBufferParameteriv(GL_ARRAY_BUFFER, GL_BUFFER_SIZE, &params);
1123         ctx.expectError(GL_INVALID_OPERATION);
1124         ctx.endSection();
1125
1126         ctx.glDeleteBuffers(1, &buf);
1127 }
1128
1129 void get_buffer_parameteri64v (NegativeTestContext& ctx)
1130 {
1131         GLint64 params  = -1;
1132         GLuint  buf;
1133         ctx.glGenBuffers(1, &buf);
1134         ctx.glBindBuffer(GL_ARRAY_BUFFER, buf);
1135
1136         ctx.beginSection("GL_INVALID_ENUM is generated if target or value is not an accepted value.");
1137         ctx.glGetBufferParameteri64v(-1, GL_BUFFER_SIZE, &params);
1138         ctx.expectError(GL_INVALID_ENUM);
1139         ctx.glGetBufferParameteri64v(GL_ARRAY_BUFFER , -1, &params);
1140         ctx.expectError(GL_INVALID_ENUM);
1141         ctx.glGetBufferParameteri64v(-1, -1, &params);
1142         ctx.expectError(GL_INVALID_ENUM);
1143         ctx.endSection();
1144
1145         ctx.beginSection("GL_INVALID_OPERATION is generated if the reserved buffer object name 0 is bound to target.");
1146         ctx.glBindBuffer(GL_ARRAY_BUFFER, 0);
1147         ctx.glGetBufferParameteri64v(GL_ARRAY_BUFFER, GL_BUFFER_SIZE, &params);
1148         ctx.expectError(GL_INVALID_OPERATION);
1149         ctx.endSection();
1150
1151         ctx.glDeleteBuffers(1, &buf);
1152 }
1153
1154 void get_buffer_pointerv (NegativeTestContext& ctx)
1155 {
1156         GLvoid* params  = DE_NULL;
1157         GLuint  buf;
1158         ctx.glGenBuffers(1, &buf);
1159         ctx.glBindBuffer(GL_ARRAY_BUFFER, buf);
1160
1161         ctx.beginSection("GL_INVALID_ENUM is generated if target or pname is not an accepted value.");
1162         ctx.glGetBufferPointerv(GL_ARRAY_BUFFER, -1, &params);
1163         ctx.expectError(GL_INVALID_ENUM);
1164         ctx.glGetBufferPointerv(-1, GL_BUFFER_MAP_POINTER, &params);
1165         ctx.expectError(GL_INVALID_ENUM);
1166         ctx.endSection();
1167
1168         ctx.beginSection("GL_INVALID_OPERATION is generated if the reserved buffer object name 0 is bound to target.");
1169         ctx.glBindBuffer(GL_ARRAY_BUFFER, 0);
1170         ctx.glGetBufferPointerv(GL_ARRAY_BUFFER, GL_BUFFER_MAP_POINTER, &params);
1171         ctx.expectError(GL_INVALID_OPERATION);
1172         ctx.endSection();
1173
1174         ctx.glDeleteBuffers(1, &buf);
1175 }
1176
1177 void get_framebuffer_attachment_parameteriv (NegativeTestContext& ctx)
1178 {
1179         GLint   params[1]       = { -1 };
1180         GLuint  fbo;
1181         GLuint  rbo[2];
1182
1183         ctx.glGenFramebuffers                   (1, &fbo);
1184         ctx.glGenRenderbuffers                  (2, rbo);
1185
1186         ctx.glBindFramebuffer                   (GL_FRAMEBUFFER,        fbo);
1187         ctx.glBindRenderbuffer                  (GL_RENDERBUFFER,       rbo[0]);
1188         ctx.glRenderbufferStorage               (GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, 16, 16);
1189         ctx.glFramebufferRenderbuffer   (GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, rbo[0]);
1190         ctx.glBindRenderbuffer                  (GL_RENDERBUFFER,       rbo[1]);
1191         ctx.glRenderbufferStorage               (GL_RENDERBUFFER, GL_STENCIL_INDEX8, 16, 16);
1192         ctx.glFramebufferRenderbuffer   (GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, rbo[1]);
1193         ctx.glCheckFramebufferStatus    (GL_FRAMEBUFFER);
1194         ctx.expectError                                 (GL_NO_ERROR);
1195
1196         ctx.beginSection("GL_INVALID_ENUM is generated if target is not one of the accepted tokens.");
1197         ctx.glGetFramebufferAttachmentParameteriv(-1, GL_DEPTH_ATTACHMENT, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, &params[0]);                                  // TYPE is GL_RENDERBUFFER
1198         ctx.expectError(GL_INVALID_ENUM);
1199         ctx.endSection();
1200
1201         ctx.beginSection("GL_INVALID_ENUM is generated if pname is not valid for the value of GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE.");
1202         ctx.glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL, &params[0]);    // TYPE is GL_RENDERBUFFER
1203         ctx.expectError(GL_INVALID_ENUM);
1204         ctx.glBindFramebuffer(GL_FRAMEBUFFER, 0);
1205         ctx.glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_BACK, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, &params[0]);                                  // TYPE is GL_FRAMEBUFFER_DEFAULT
1206         ctx.expectError(GL_INVALID_ENUM);
1207         ctx.glBindFramebuffer(GL_FRAMEBUFFER, fbo);
1208         ctx.endSection();
1209
1210         ctx.beginSection("GL_INVALID_OPERATION is generated if attachment is GL_DEPTH_STENCIL_ATTACHMENT and different objects are bound to the depth and stencil attachment points of target.");
1211         ctx.glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, &params[0]);
1212         ctx.expectError(GL_INVALID_OPERATION);
1213         ctx.endSection();
1214
1215         ctx.beginSection("GL_INVALID_OPERATION is generated if the value of GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE is GL_NONE and pname is not GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME.");
1216         ctx.glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, &params[0]);             // TYPE is GL_NONE
1217         ctx.expectError(GL_NO_ERROR);
1218         ctx.glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE, &params[0]);  // TYPE is GL_NONE
1219         ctx.expectError(GL_INVALID_OPERATION);
1220         ctx.endSection();
1221
1222         ctx.beginSection("GL_INVALID_OPERATION or GL_INVALID_ENUM is generated if attachment is not one of the accepted values for the current binding of target.");
1223         ctx.glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_BACK, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, &params[0]);                                  // A FBO is bound so GL_BACK is invalid
1224         ctx.expectError(GL_INVALID_OPERATION, GL_INVALID_ENUM);
1225         ctx.glBindFramebuffer(GL_FRAMEBUFFER, 0);
1226         ctx.glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, &params[0]);             // Default framebuffer is bound so GL_COLOR_ATTACHMENT0 is invalid
1227         ctx.expectError(GL_INVALID_OPERATION, GL_INVALID_ENUM);
1228         ctx.endSection();
1229
1230         ctx.glDeleteFramebuffers(1, &fbo);
1231 }
1232
1233 void get_renderbuffer_parameteriv (NegativeTestContext& ctx)
1234 {
1235         GLint   params[1] = { -1 };
1236         GLuint  rbo;
1237         ctx.glGenRenderbuffers(1, &rbo);
1238         ctx.glBindRenderbuffer(GL_RENDERBUFFER, rbo);
1239
1240         ctx.beginSection("GL_INVALID_ENUM is generated if target is not GL_RENDERBUFFER.");
1241         ctx.glGetRenderbufferParameteriv(-1, GL_RENDERBUFFER_WIDTH, &params[0]);
1242         ctx.expectError(GL_INVALID_ENUM);
1243         ctx.endSection();
1244
1245         ctx.beginSection("GL_INVALID_ENUM is generated if pname is not one of the accepted tokens.");
1246         ctx.glGetRenderbufferParameteriv(GL_RENDERBUFFER, -1, &params[0]);
1247         ctx.expectError(GL_INVALID_ENUM);
1248         ctx.endSection();
1249
1250         ctx.beginSection("GL_INVALID_OPERATION  is generated if the renderbuffer currently bound to target is zero.");
1251         ctx.glBindRenderbuffer(GL_RENDERBUFFER, 0);
1252         ctx.expectError(GL_NO_ERROR);
1253         ctx.glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &params[0]);
1254         ctx.expectError(GL_INVALID_OPERATION);
1255         ctx.endSection();
1256
1257         ctx.glDeleteRenderbuffers(1, &rbo);
1258         ctx.glBindRenderbuffer(GL_RENDERBUFFER, 0);
1259 }
1260
1261 void get_internalformativ (NegativeTestContext& ctx)
1262 {
1263         GLint params[16];
1264
1265         deMemset(&params[0], 0xcd, sizeof(params));
1266
1267         ctx.beginSection("GL_INVALID_VALUE is generated if bufSize is negative.");
1268         ctx.glGetInternalformativ       (GL_RENDERBUFFER, GL_RGBA8, GL_NUM_SAMPLE_COUNTS, -1, &params[0]);
1269         ctx.expectError                         (GL_INVALID_VALUE);
1270         ctx.endSection();
1271
1272         ctx.beginSection("GL_INVALID_ENUM is generated if pname is not GL_SAMPLES or GL_NUM_SAMPLE_COUNTS.");
1273         ctx.glGetInternalformativ       (GL_RENDERBUFFER, GL_RGBA8, -1, 16, &params[0]);
1274         ctx.expectError                         (GL_INVALID_ENUM);
1275         ctx.endSection();
1276
1277         ctx.beginSection("GL_INVALID_ENUM is generated if internalformat is not color-, depth-, or stencil-renderable.");
1278
1279         if (!ctx.getContextInfo().isExtensionSupported("GL_EXT_render_snorm"))
1280         {
1281                 ctx.glGetInternalformativ       (GL_RENDERBUFFER, GL_RG8_SNORM, GL_NUM_SAMPLE_COUNTS, 16, &params[0]);
1282                 ctx.expectError                         (GL_INVALID_ENUM);
1283         }
1284
1285         ctx.glGetInternalformativ       (GL_RENDERBUFFER, GL_COMPRESSED_RGB8_ETC2, GL_NUM_SAMPLE_COUNTS, 16, &params[0]);
1286         ctx.expectError                         (GL_INVALID_ENUM);
1287         ctx.endSection();
1288
1289         ctx.beginSection("GL_INVALID_ENUM is generated if target is not GL_RENDERBUFFER.");
1290         ctx.glGetInternalformativ       (-1, GL_RGBA8, GL_NUM_SAMPLE_COUNTS, 16, &params[0]);
1291         ctx.expectError                         (GL_INVALID_ENUM);
1292         ctx.glGetInternalformativ       (GL_FRAMEBUFFER, GL_RGBA8, GL_NUM_SAMPLE_COUNTS, 16, &params[0]);
1293         ctx.expectError                         (GL_INVALID_ENUM);
1294
1295         if (!ctx.getContextInfo().isExtensionSupported("GL_EXT_sparse_texture"))
1296         {
1297                 ctx.glGetInternalformativ       (GL_TEXTURE_2D, GL_RGBA8, GL_NUM_SAMPLE_COUNTS, 16, &params[0]);
1298                 ctx.expectError                         (GL_INVALID_ENUM);
1299         }
1300
1301         ctx.endSection();
1302 }
1303
1304 // Query object queries
1305
1306 void get_queryiv (NegativeTestContext& ctx)
1307 {
1308         GLint params = -1;
1309
1310         ctx.beginSection("GL_INVALID_ENUM is generated if target or pname is not an accepted value.");
1311         ctx.glGetQueryiv        (GL_ANY_SAMPLES_PASSED, -1, &params);
1312         ctx.expectError         (GL_INVALID_ENUM);
1313         ctx.glGetQueryiv        (-1, GL_CURRENT_QUERY, &params);
1314         ctx.expectError         (GL_INVALID_ENUM);
1315         ctx.glGetQueryiv        (-1, -1, &params);
1316         ctx.expectError         (GL_INVALID_ENUM);
1317         ctx.endSection();
1318 }
1319
1320 void get_query_objectuiv (NegativeTestContext& ctx)
1321 {
1322         GLuint params   = -1;
1323         GLuint id;
1324         ctx.glGenQueries                (1, &id);
1325
1326         ctx.beginSection("GL_INVALID_OPERATION is generated if id is not the name of a query object.");
1327         ctx.glGetQueryObjectuiv (-1, GL_QUERY_RESULT_AVAILABLE, &params);
1328         ctx.expectError                 (GL_INVALID_OPERATION);
1329         ctx.getLog() << TestLog::Message << "// Note: " << id << " is not a query object yet, since it hasn't been used by glBeginQuery" << TestLog::EndMessage;
1330         ctx.glGetQueryObjectuiv (id, GL_QUERY_RESULT_AVAILABLE, &params);
1331         ctx.expectError                 (GL_INVALID_OPERATION);
1332         ctx.endSection();
1333
1334         ctx.glBeginQuery                (GL_ANY_SAMPLES_PASSED, id);
1335         ctx.glEndQuery                  (GL_ANY_SAMPLES_PASSED);
1336
1337         ctx.beginSection("GL_INVALID_ENUM is generated if pname is not an accepted value.");
1338         ctx.glGetQueryObjectuiv (id, -1, &params);
1339         ctx.expectError                 (GL_INVALID_ENUM);
1340         ctx.endSection();
1341
1342         ctx.beginSection("GL_INVALID_OPERATION is generated if id is the name of a currently active query object.");
1343         ctx.glBeginQuery                (GL_ANY_SAMPLES_PASSED, id);
1344         ctx.expectError                 (GL_NO_ERROR);
1345         ctx.glGetQueryObjectuiv (id, GL_QUERY_RESULT_AVAILABLE, &params);
1346         ctx.expectError                 (GL_INVALID_OPERATION);
1347         ctx.glEndQuery                  (GL_ANY_SAMPLES_PASSED);
1348         ctx.expectError                 (GL_NO_ERROR);
1349         ctx.endSection();
1350
1351         ctx.glDeleteQueries             (1, &id);
1352 }
1353
1354 // Sync object queries
1355
1356 void get_synciv (NegativeTestContext& ctx)
1357 {
1358         GLsizei length          = -1;
1359         GLint   values[32];
1360         GLsync  sync;
1361
1362         deMemset(&values[0], 0xcd, sizeof(values));
1363
1364         ctx.beginSection("GL_INVALID_VALUE is generated if sync is not the name of a sync object.");
1365         ctx.glGetSynciv(0, GL_OBJECT_TYPE, 32, &length, &values[0]);
1366         ctx.expectError(GL_INVALID_VALUE);
1367         ctx.endSection();
1368
1369         ctx.beginSection("GL_INVALID_ENUM is generated if pname is not one of the accepted tokens.");
1370         sync = ctx.glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0);
1371         ctx.expectError(GL_NO_ERROR);
1372         ctx.glGetSynciv(sync, -1, 32, &length, &values[0]);
1373         ctx.expectError(GL_INVALID_ENUM);
1374         ctx.endSection();
1375
1376         ctx.glDeleteSync(sync);
1377
1378         ctx.beginSection("GL_INVALID_VALUE is generated if bufSize is negative.");
1379         sync = ctx.glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0);
1380         ctx.expectError(GL_NO_ERROR);
1381         ctx.glGetSynciv(sync, GL_OBJECT_TYPE, -1, &length, &values[0]);
1382         ctx.expectError(GL_INVALID_VALUE);
1383         ctx.endSection();
1384
1385         ctx.glDeleteSync(sync);
1386 }
1387
1388 // Enumerated boolean state queries
1389
1390 void is_enabled (NegativeTestContext& ctx)
1391 {
1392         ctx.beginSection("GL_INVALID_ENUM is generated if cap is not an accepted value.");
1393         ctx.glIsEnabled(-1);
1394         ctx.expectError(GL_INVALID_ENUM);
1395         ctx.glIsEnabled(GL_TRIANGLES);
1396         ctx.expectError(GL_INVALID_ENUM);
1397         ctx.endSection();
1398 }
1399
1400 void is_enabledi (NegativeTestContext& ctx)
1401 {
1402         TCU_CHECK_AND_THROW(NotSupportedError, contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)), "This test requires a higher context version.");
1403
1404         ctx.beginSection("GL_INVALID_ENUM is generated if cap is not an accepted value.");
1405         ctx.glIsEnabledi(-1, 1);
1406         ctx.expectError(GL_INVALID_ENUM);
1407         ctx.glIsEnabledi(GL_TRIANGLES, 1);
1408         ctx.expectError(GL_INVALID_ENUM);
1409         ctx.endSection();
1410
1411         ctx.beginSection("GL_INVALID_VALUE is generated if index is outside the valid range for the indexed state cap.");
1412         ctx.glIsEnabledi(GL_BLEND, -1);
1413         ctx.expectError(GL_INVALID_VALUE);
1414         ctx.endSection();
1415 }
1416
1417 // Hints
1418
1419 void hint (NegativeTestContext& ctx)
1420 {
1421         ctx.beginSection("GL_INVALID_ENUM is generated if either target or mode is not an accepted value.");
1422         ctx.glHint(GL_GENERATE_MIPMAP_HINT, -1);
1423         ctx.expectError(GL_INVALID_ENUM);
1424         ctx.glHint(-1, GL_FASTEST);
1425         ctx.expectError(GL_INVALID_ENUM);
1426         ctx.glHint(-1, -1);
1427         ctx.expectError(GL_INVALID_ENUM);
1428         ctx.endSection();
1429 }
1430
1431 std::vector<FunctionContainer> getNegativeStateApiTestFunctions ()
1432 {
1433         const FunctionContainer funcs[] =
1434         {
1435                 {enable,                                                                        "enable",                                                                       "Invalid glEnable() usage"                                                              },
1436                 {disable,                                                                       "disable",                                                                      "Invalid glDisable() usage"                                                             },
1437                 {get_booleanv,                                                          "get_booleanv",                                                         "Invalid glGetBooleanv() usage"                                                 },
1438                 {get_floatv,                                                            "get_floatv",                                                           "Invalid glGetFloatv() usage"                                                   },
1439                 {get_integerv,                                                          "get_integerv",                                                         "Invalid glGetIntegerv() usage"                                                 },
1440                 {get_integer64v,                                                        "get_integer64v",                                                       "Invalid glGetInteger64v() usage"                                               },
1441                 {get_integeri_v,                                                        "get_integeri_v",                                                       "Invalid glGetIntegeri_v() usage"                                               },
1442                 {get_booleani_v,                                                        "get_booleani_v",                                                       "Invalid glGetBooleani_v() usage"                                               },
1443                 {get_integer64i_v,                                                      "get_integer64i_v",                                                     "Invalid glGetInteger64i_v() usage"                                             },
1444                 {get_string,                                                            "get_string",                                                           "Invalid glGetString() usage"                                                   },
1445                 {get_stringi,                                                           "get_stringi",                                                          "Invalid glGetStringi() usage"                                                  },
1446                 {get_attached_shaders,                                          "get_attached_shaders",                                         "Invalid glGetAttachedShaders() usage"                                  },
1447                 {get_shaderiv,                                                          "get_shaderiv",                                                         "Invalid glGetShaderiv() usage"                                                 },
1448                 {get_shader_info_log,                                           "get_shader_info_log",                                          "Invalid glGetShaderInfoLog() usage"                                    },
1449                 {get_shader_precision_format,                           "get_shader_precision_format",                          "Invalid glGetShaderPrecisionFormat() usage"                    },
1450                 {get_shader_source,                                                     "get_shader_source",                                            "Invalid glGetShaderSource() usage"                                             },
1451                 {get_programiv,                                                         "get_programiv",                                                        "Invalid glGetProgramiv() usage"                                                },
1452                 {get_program_info_log,                                          "get_program_info_log",                                         "Invalid glGetProgramInfoLog() usage"                                   },
1453                 {get_tex_parameterfv,                                           "get_tex_parameterfv",                                          "Invalid glGetTexParameterfv() usage"                                   },
1454                 {get_tex_parameteriv,                                           "get_tex_parameteriv",                                          "Invalid glGetTexParameteriv() usage"                                   },
1455                 {get_uniformfv,                                                         "get_uniformfv",                                                        "Invalid glGetUniformfv() usage"                                                },
1456                 {get_uniformiv,                                                         "get_uniformiv",                                                        "Invalid glGetUniformiv() usage"                                                },
1457                 {get_uniformuiv,                                                        "get_uniformuiv",                                                       "Invalid glGetUniformuiv() usage"                                               },
1458                 {get_active_uniform,                                            "get_active_uniform",                                           "Invalid glGetActiveUniform() usage"                                    },
1459                 {get_active_uniformsiv,                                         "get_active_uniformsiv",                                        "Invalid glGetActiveUniformsiv() usage"                                 },
1460                 {get_active_uniform_blockiv,                            "get_active_uniform_blockiv",                           "Invalid glGetActiveUniformBlockiv() usage"                             },
1461                 {get_active_uniform_block_name,                         "get_active_uniform_block_name",                        "Invalid glGetActiveUniformBlockName() usage"                   },
1462                 {get_active_attrib,                                                     "get_active_attrib",                                            "Invalid glGetActiveAttrib() usage"                                             },
1463                 {get_uniform_indices,                                           "get_uniform_indices",                                          "Invalid glGetUniformIndices() usage"                                   },
1464                 {get_vertex_attribfv,                                           "get_vertex_attribfv",                                          "Invalid glGetVertexAttribfv() usage"                                   },
1465                 {get_vertex_attribiv,                                           "get_vertex_attribiv",                                          "Invalid glGetVertexAttribiv() usage"                                   },
1466                 {get_vertex_attribi_iv,                                         "get_vertex_attribi_iv",                                        "Invalid glGetVertexAttribIiv() usage"                                  },
1467                 {get_vertex_attribi_uiv,                                        "get_vertex_attribi_uiv",                                       "Invalid glGetVertexAttribIuiv() usage"                                 },
1468                 {get_vertex_attrib_pointerv,                            "get_vertex_attrib_pointerv",                           "Invalid glGetVertexAttribPointerv() usage"                             },
1469                 {get_frag_data_location,                                        "get_frag_data_location",                                       "Invalid glGetFragDataLocation() usage"                                 },
1470                 {get_buffer_parameteriv,                                        "get_buffer_parameteriv",                                       "Invalid glGetBufferParameteriv() usage"                                },
1471                 {get_buffer_parameteri64v,                                      "get_buffer_parameteri64v",                                     "Invalid glGetBufferParameteri64v() usage"                              },
1472                 {get_buffer_pointerv,                                           "get_buffer_pointerv",                                          "Invalid glGetBufferPointerv() usage"                                   },
1473                 {get_framebuffer_attachment_parameteriv,        "get_framebuffer_attachment_parameteriv",       "Invalid glGetFramebufferAttachmentParameteriv() usage" },
1474                 {get_renderbuffer_parameteriv,                          "get_renderbuffer_parameteriv",                         "Invalid glGetRenderbufferParameteriv() usage"                  },
1475                 {get_internalformativ,                                          "get_internalformativ",                                         "Invalid glGetInternalformativ() usage"                                 },
1476                 {get_queryiv,                                                           "get_queryiv",                                                          "Invalid glGetQueryiv() usage"                                                  },
1477                 {get_query_objectuiv,                                           "get_query_objectuiv",                                          "Invalid glGetQueryObjectuiv() usage"                                   },
1478                 {get_synciv,                                                            "get_synciv",                                                           "Invalid glGetSynciv() usage"                                                   },
1479                 {is_enabled,                                                            "is_enabled",                                                           "Invalid glIsEnabled() usage"                                                   },
1480                 {hint,                                                                          "hint",                                                                         "Invalid glHint() usage"                                                                },
1481                 {enablei,                                                                       "enablei",                                                                      "Invalid glEnablei() usage"                                                             },
1482                 {disablei,                                                                      "disablei",                                                                     "Invalid glDisablei() usage"                                                    },
1483                 {get_tex_parameteriiv,                                          "get_tex_parameteriiv",                                         "Invalid glGetTexParameterIiv() usage"                                  },
1484                 {get_tex_parameteriuiv,                                         "get_tex_parameteriuiv",                                        "Invalid glGetTexParameterIuiv() usage"                                 },
1485                 {get_nuniformfv,                                                        "get_nuniformfv",                                                       "Invalid glGetnUniformfv() usage"                                               },
1486                 {get_nuniformiv,                                                        "get_nuniformiv",                                                       "Invalid glGetnUniformiv() usage"                                               },
1487                 {get_nuniformuiv,                                                       "get_nuniformuiv",                                                      "Invalid glGetnUniformuiv() usage"                                              },
1488                 {is_enabledi,                                                           "is_enabledi",                                                          "Invalid glIsEnabledi() usage"                                                  },
1489         };
1490
1491         return std::vector<FunctionContainer>(DE_ARRAY_BEGIN(funcs), DE_ARRAY_END(funcs));
1492 }
1493
1494 } // NegativeTestShared
1495 } // Functional
1496 } // gles3
1497 } // deqp