Lower correlation threshold in flush-finish tests again am: 6455e6f987 am: 2e18b48b04...
[platform/upstream/VK-GL-CTS.git] / modules / gles31 / functional / es31fNegativeVertexArrayApiTests.cpp
1 /*-------------------------------------------------------------------------
2  * drawElements Quality Program OpenGL ES 3.1 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 Vertex Array API tests.
22  *//*--------------------------------------------------------------------*/
23
24 #include "es31fNegativeVertexArrayApiTests.hpp"
25 #include "gluCallLogWrapper.hpp"
26 #include "gluContextInfo.hpp"
27 #include "gluShaderProgram.hpp"
28 #include "glwDefs.hpp"
29 #include "glwEnums.hpp"
30 #include "tcuStringTemplate.hpp"
31
32 namespace deqp
33 {
34
35 using std::string;
36 using std::map;
37
38 namespace gles31
39 {
40 namespace Functional
41 {
42 namespace NegativeTestShared
43 {
44
45 using tcu::TestLog;
46 using glu::CallLogWrapper;
47 using namespace glw;
48
49 static const char* vertexShaderSource           =       "${GLSL_VERSION_STRING}\n"
50                                                                                                 "void main (void)\n"
51                                                                                                 "{\n"
52                                                                                                 "       gl_Position = vec4(0.0);\n"
53                                                                                                 "}\n\0";
54
55 static const char* fragmentShaderSource         =       "${GLSL_VERSION_STRING}\n"
56                                                                                                 "layout(location = 0) out mediump vec4 fragColor;"
57                                                                                                 "void main (void)\n"
58                                                                                                 "{\n"
59                                                                                                 "       fragColor = vec4(0.0);\n"
60                                                                                                 "}\n\0";
61
62 static const char* geometryShaderSource         =       "#version 320 es\n"
63                                                                                                 "layout(points) in;\n"
64                                                                                                 "layout(points, max_vertices = 3) out;\n"
65                                                                                                 "void main (void)\n"
66                                                                                                 "{\n"
67                                                                                                 "}\n";
68
69 void vertex_attribf (NegativeTestContext& ctx)
70 {
71         ctx.beginSection("GL_INVALID_VALUE is generated if index is greater than or equal to GL_MAX_VERTEX_ATTRIBS.");
72         int maxVertexAttribs = ctx.getInteger(GL_MAX_VERTEX_ATTRIBS);
73         ctx.glVertexAttrib1f(maxVertexAttribs, 0.0f);
74         ctx.expectError(GL_INVALID_VALUE);
75         ctx.glVertexAttrib2f(maxVertexAttribs, 0.0f, 0.0f);
76         ctx.expectError(GL_INVALID_VALUE);
77         ctx.glVertexAttrib3f(maxVertexAttribs, 0.0f, 0.0f, 0.0f);
78         ctx.expectError(GL_INVALID_VALUE);
79         ctx.glVertexAttrib4f(maxVertexAttribs, 0.0f, 0.0f, 0.0f, 0.0f);
80         ctx.expectError(GL_INVALID_VALUE);
81         ctx.endSection();
82 }
83
84 void vertex_attribfv (NegativeTestContext& ctx)
85 {
86         ctx.beginSection("GL_INVALID_VALUE is generated if index is greater than or equal to GL_MAX_VERTEX_ATTRIBS.");
87         int maxVertexAttribs = ctx.getInteger(GL_MAX_VERTEX_ATTRIBS);
88         float v[4] = {0.0f};
89         ctx.glVertexAttrib1fv(maxVertexAttribs, &v[0]);
90         ctx.expectError(GL_INVALID_VALUE);
91         ctx.glVertexAttrib2fv(maxVertexAttribs, &v[0]);
92         ctx.expectError(GL_INVALID_VALUE);
93         ctx.glVertexAttrib3fv(maxVertexAttribs, &v[0]);
94         ctx.expectError(GL_INVALID_VALUE);
95         ctx.glVertexAttrib4fv(maxVertexAttribs, &v[0]);
96         ctx.expectError(GL_INVALID_VALUE);
97         ctx.endSection();
98 }
99
100 void vertex_attribi4 (NegativeTestContext& ctx)
101 {
102         int maxVertexAttribs    = ctx.getInteger(GL_MAX_VERTEX_ATTRIBS);
103         GLint valInt                    = 0;
104         GLuint valUint                  = 0;
105
106         ctx.beginSection("GL_INVALID_VALUE is generated if index is greater than or equal to GL_MAX_VERTEX_ATTRIBS.");
107         ctx.glVertexAttribI4i(maxVertexAttribs, valInt, valInt, valInt, valInt);
108         ctx.expectError(GL_INVALID_VALUE);
109         ctx.glVertexAttribI4ui(maxVertexAttribs, valUint, valUint, valUint, valUint);
110         ctx.expectError(GL_INVALID_VALUE);
111         ctx.endSection();
112 }
113
114 void vertex_attribi4v (NegativeTestContext& ctx)
115 {
116         int maxVertexAttribs    = ctx.getInteger(GL_MAX_VERTEX_ATTRIBS);
117         GLint valInt[4]                 = { 0 };
118         GLuint valUint[4]               = { 0 };
119
120         ctx.beginSection("GL_INVALID_VALUE is generated if index is greater than or equal to GL_MAX_VERTEX_ATTRIBS.");
121         ctx.glVertexAttribI4iv(maxVertexAttribs, &valInt[0]);
122         ctx.expectError(GL_INVALID_VALUE);
123         ctx.glVertexAttribI4uiv(maxVertexAttribs, &valUint[0]);
124         ctx.expectError(GL_INVALID_VALUE);
125         ctx.endSection();
126 }
127
128 void vertex_attrib_pointer (NegativeTestContext& ctx)
129 {
130         ctx.beginSection("GL_INVALID_ENUM is generated if type is not an accepted value.");
131         ctx.glVertexAttribPointer(0, 1, 0, GL_TRUE, 0, 0);
132         ctx.expectError(GL_INVALID_ENUM);
133         ctx.endSection();
134
135         ctx.beginSection("GL_INVALID_VALUE is generated if index is greater than or equal to GL_MAX_VERTEX_ATTRIBS.");
136         int maxVertexAttribs = ctx.getInteger(GL_MAX_VERTEX_ATTRIBS);
137         ctx.glVertexAttribPointer(maxVertexAttribs, 1, GL_BYTE, GL_TRUE, 0, 0);
138         ctx.expectError(GL_INVALID_VALUE);
139         ctx.endSection();
140
141         ctx.beginSection("GL_INVALID_VALUE is generated if size is not 1, 2, 3, or 4.");
142         ctx.glVertexAttribPointer(0, 0, GL_BYTE, GL_TRUE, 0, 0);
143         ctx.expectError(GL_INVALID_VALUE);
144         ctx.endSection();
145
146         ctx.beginSection("GL_INVALID_VALUE is generated if stride is negative.");
147         ctx.glVertexAttribPointer(0, 1, GL_BYTE, GL_TRUE, -1, 0);
148         ctx.expectError(GL_INVALID_VALUE);
149         ctx.endSection();
150
151         ctx.beginSection("GL_INVALID_OPERATION is generated if type is GL_INT_2_10_10_10_REV or GL_UNSIGNED_INT_2_10_10_10_REV and size is not 4.");
152         ctx.glVertexAttribPointer(0, 2, GL_INT_2_10_10_10_REV, GL_TRUE, 0, 0);
153         ctx.expectError(GL_INVALID_OPERATION);
154         ctx.glVertexAttribPointer(0, 2, GL_UNSIGNED_INT_2_10_10_10_REV, GL_TRUE, 0, 0);
155         ctx.expectError(GL_INVALID_OPERATION);
156         ctx.glVertexAttribPointer(0, 4, GL_INT_2_10_10_10_REV, GL_TRUE, 0, 0);
157         ctx.expectError(GL_NO_ERROR);
158         ctx.glVertexAttribPointer(0, 4, GL_UNSIGNED_INT_2_10_10_10_REV, GL_TRUE, 0, 0);
159         ctx.expectError(GL_NO_ERROR);
160         ctx.endSection();
161
162         ctx.beginSection("GL_INVALID_OPERATION is generated a non-zero vertex array object is bound, zero is bound to the GL_ARRAY_BUFFER buffer object binding point and the pointer argument is not NULL.");
163         GLuint vao = 0;
164         GLbyte offset = 1;
165         ctx.glGenVertexArrays(1, &vao);
166         ctx.glBindVertexArray(vao);
167         ctx.glBindBuffer(GL_ARRAY_BUFFER, 0);
168         ctx.expectError(GL_NO_ERROR);
169
170         ctx.glVertexAttribPointer(0, 1, GL_BYTE, GL_TRUE, 0, &offset);
171         ctx.expectError(GL_INVALID_OPERATION);
172
173         ctx.glBindVertexArray(0);
174         ctx.glDeleteVertexArrays(1, &vao);
175         ctx.expectError(GL_NO_ERROR);
176         ctx.endSection();
177 }
178
179 void vertex_attrib_i_pointer (NegativeTestContext& ctx)
180 {
181         ctx.beginSection("GL_INVALID_ENUM is generated if type is not an accepted value.");
182         ctx.glVertexAttribIPointer(0, 1, 0, 0, 0);
183         ctx.expectError(GL_INVALID_ENUM);
184         ctx.glVertexAttribIPointer(0, 4, GL_INT_2_10_10_10_REV, 0, 0);
185         ctx.expectError(GL_INVALID_ENUM);
186         ctx.glVertexAttribIPointer(0, 4, GL_UNSIGNED_INT_2_10_10_10_REV, 0, 0);
187         ctx.expectError(GL_INVALID_ENUM);
188         ctx.endSection();
189
190         ctx.beginSection("GL_INVALID_VALUE is generated if index is greater than or equal to GL_MAX_VERTEX_ATTRIBS.");
191         int maxVertexAttribs = ctx.getInteger(GL_MAX_VERTEX_ATTRIBS);
192         ctx.glVertexAttribIPointer(maxVertexAttribs, 1, GL_BYTE, 0, 0);
193         ctx.expectError(GL_INVALID_VALUE);
194         ctx.endSection();
195
196         ctx.beginSection("GL_INVALID_VALUE is generated if size is not 1, 2, 3, or 4.");
197         ctx.glVertexAttribIPointer(0, 0, GL_BYTE, 0, 0);
198         ctx.expectError(GL_INVALID_VALUE);
199         ctx.endSection();
200
201         ctx.beginSection("GL_INVALID_VALUE is generated if stride is negative.");
202         ctx.glVertexAttribIPointer(0, 1, GL_BYTE, -1, 0);
203         ctx.expectError(GL_INVALID_VALUE);
204         ctx.endSection();
205
206         ctx.beginSection("GL_INVALID_OPERATION is generated a non-zero vertex array object is bound, zero is bound to the GL_ARRAY_BUFFER buffer object binding point and the pointer argument is not NULL.");
207         GLuint vao = 0;
208         GLbyte offset = 1;
209         ctx.glGenVertexArrays(1, &vao);
210         ctx.glBindVertexArray(vao);
211         ctx.glBindBuffer(GL_ARRAY_BUFFER, 0);
212         ctx.expectError(GL_NO_ERROR);
213
214         ctx.glVertexAttribIPointer(0, 1, GL_BYTE, 0, &offset);
215         ctx.expectError(GL_INVALID_OPERATION);
216
217         ctx.glBindVertexArray(0);
218         ctx.glDeleteVertexArrays(1, &vao);
219         ctx.expectError(GL_NO_ERROR);
220         ctx.endSection();
221 }
222
223 void vertex_attrib_format (NegativeTestContext& ctx)
224 {
225         int             maxVertexAttribs                                = ctx.getInteger(GL_MAX_VERTEX_ATTRIBS);
226         int             maxVertexAttribRelativeOffset   = ctx.getInteger(GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET);
227         GLuint  vao                                                             = 0;
228
229         ctx.beginSection("GL_INVALID_VALUE is generated if attribindex is greater than or equal to the value of MAX_VERTEX_ATTRIBS.");
230         ctx.glGenVertexArrays(1, &vao);
231         ctx.glBindVertexArray(vao);
232         ctx.glBindBuffer(GL_ARRAY_BUFFER, 0);
233         ctx.glVertexAttribFormat(maxVertexAttribs, 4, GL_FLOAT, GL_FALSE, maxVertexAttribRelativeOffset);
234         ctx.expectError(GL_INVALID_VALUE);
235         ctx.endSection();
236
237         ctx.beginSection("GL_INVALID_VALUE is generated if size is not one of 1, 2, 3, 4.");
238         ctx.glGenVertexArrays(1, &vao);
239         ctx.glBindVertexArray(vao);
240         ctx.glBindBuffer(GL_ARRAY_BUFFER, 0);
241         ctx.glVertexAttribFormat(1, 0, GL_FLOAT, GL_FALSE, maxVertexAttribRelativeOffset);
242         ctx.expectError(GL_INVALID_VALUE);
243         ctx.endSection();
244
245         ctx.beginSection("GL_INVALID_ENUM is generated if type is not one of the parameter token names allowed.");
246         ctx.glGenVertexArrays(1, &vao);
247         ctx.glBindVertexArray(vao);
248         ctx.glBindBuffer(GL_ARRAY_BUFFER, 0);
249         ctx.glVertexAttribFormat(1, 4, 1, GL_FALSE, 0);
250         ctx.expectError(GL_INVALID_ENUM);
251         ctx.endSection();
252
253         ctx.beginSection("GL_INVALID_OPERATION is generated if type is not a token name allowed.");
254         ctx.glGenVertexArrays(1, &vao);
255         ctx.glBindVertexArray(0);
256         ctx.glBindBuffer(GL_ARRAY_BUFFER, 0);
257         ctx.glVertexAttribFormat(1, 4, GL_FLOAT, GL_FALSE, 0);
258         ctx.expectError(GL_INVALID_OPERATION);
259         ctx.endSection();
260
261         ctx.beginSection("GL_INVALID_OPERATION is generated if type is GL_INT_2_10_10_10_REV and size is not 4.");
262         ctx.glGenVertexArrays(1, &vao);
263         ctx.glBindVertexArray(vao);
264         ctx.glBindBuffer(GL_ARRAY_BUFFER, 0);
265         ctx.glVertexAttribFormat(1, 3, GL_INT_2_10_10_10_REV, GL_FALSE, 0);
266         ctx.expectError(GL_INVALID_OPERATION);
267         ctx.endSection();
268
269         ctx.beginSection("GL_INVALID_OPERATION is generated if type is GL_UNSIGNED_INT_2_10_10_10_REV and size is not 4.");
270         ctx.glGenVertexArrays(1, &vao);
271         ctx.glBindVertexArray(vao);
272         ctx.glBindBuffer(GL_ARRAY_BUFFER, 0);
273         ctx.glVertexAttribFormat(1, 3, GL_UNSIGNED_INT_2_10_10_10_REV, GL_FALSE, 0);
274         ctx.expectError(GL_INVALID_OPERATION);
275         ctx.endSection();
276
277         ctx.beginSection("GL_INVALID_VALUE is generated if relativeoffset is larger than the value of GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET.");
278         ctx.glGenVertexArrays(1, &vao);
279         ctx.glBindVertexArray(vao);
280         ctx.glBindBuffer(GL_ARRAY_BUFFER, 0);
281         ctx.glVertexAttribFormat(1, 4, GL_FLOAT, GL_FALSE, maxVertexAttribRelativeOffset + 1);
282         ctx.expectError(GL_INVALID_VALUE);
283         ctx.endSection();
284 }
285
286 void vertex_attrib_i_format (NegativeTestContext& ctx)
287 {
288         int             maxVertexAttribs                                = ctx.getInteger(GL_MAX_VERTEX_ATTRIBS);
289         int             maxVertexAttribRelativeOffset   = ctx.getInteger(GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET);
290         GLuint  vao                                                             = 0;
291
292         ctx.beginSection("GL_INVALID_VALUE is generated if attribindex is greater than or equal to the value of GL_MAX_VERTEX_ATTRIBS.");
293         ctx.glGenVertexArrays(1, &vao);
294         ctx.glBindVertexArray(vao);
295         ctx.glBindBuffer(GL_ARRAY_BUFFER, 0);
296         ctx.glVertexAttribIFormat(maxVertexAttribs, 4, GL_INT, 0);
297         ctx.expectError(GL_INVALID_VALUE);
298         ctx.endSection();
299
300         ctx.beginSection("GL_INVALID_VALUE is generated if size is not one the values 1, 2, 3, 4.");
301         ctx.glGenVertexArrays(1, &vao);
302         ctx.glBindVertexArray(vao);
303         ctx.glBindBuffer(GL_ARRAY_BUFFER, 0);
304         ctx.glVertexAttribIFormat(1, 0, GL_INT, 0);
305         ctx.expectError(GL_INVALID_VALUE);
306         ctx.endSection();
307
308         ctx.beginSection("GL_INVALID_ENUM is generated if type is not one of the parameter token names allowed.");
309         ctx.glGenVertexArrays(1, &vao);
310         ctx.glBindVertexArray(vao);
311         ctx.glBindBuffer(GL_ARRAY_BUFFER, 0);
312         ctx.glVertexAttribIFormat(1, 4, GL_FLOAT, 0);
313         ctx.expectError(GL_INVALID_ENUM);
314         ctx.endSection();
315
316         ctx.beginSection("GL_INVALID_OPERATION is generated if type is not a token name allowed.");
317         ctx.glGenVertexArrays(1, &vao);
318         ctx.glBindVertexArray(0);
319         ctx.glBindBuffer(GL_ARRAY_BUFFER, 0);
320         ctx.glVertexAttribIFormat(1, 4, GL_INT, 0);
321         ctx.expectError(GL_INVALID_OPERATION);
322         ctx.endSection();
323
324         ctx.beginSection("GL_INVALID_VALUE is generated if relativeoffset is larger than the value of GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET.");
325         ctx.glGenVertexArrays(1, &vao);
326         ctx.glBindVertexArray(vao);
327         ctx.glBindBuffer(GL_ARRAY_BUFFER, 0);
328         ctx.glVertexAttribIFormat(1, 4, GL_INT, maxVertexAttribRelativeOffset + 1);
329         ctx.expectError(GL_INVALID_VALUE);
330         ctx.endSection();
331 }
332
333 void enable_vertex_attrib_array (NegativeTestContext& ctx)
334 {
335         int maxVertexAttribs = ctx.getInteger(GL_MAX_VERTEX_ATTRIBS);
336
337         ctx.beginSection("GL_INVALID_VALUE is generated if index is greater than or equal to GL_MAX_VERTEX_ATTRIBS.");
338         ctx.glEnableVertexAttribArray(maxVertexAttribs);
339         ctx.expectError(GL_INVALID_VALUE);
340         ctx.endSection();
341 }
342
343 void disable_vertex_attrib_array (NegativeTestContext& ctx)
344 {
345         int maxVertexAttribs = ctx.getInteger(GL_MAX_VERTEX_ATTRIBS);
346
347         ctx.beginSection("GL_INVALID_VALUE is generated if index is greater than or equal to GL_MAX_VERTEX_ATTRIBS.");
348         ctx.glDisableVertexAttribArray(maxVertexAttribs);
349         ctx.expectError(GL_INVALID_VALUE);
350         ctx.endSection();
351 }
352
353 void gen_vertex_arrays (NegativeTestContext& ctx)
354 {
355         GLuint arrays = 0;
356
357         ctx.beginSection("GL_INVALID_VALUE is generated if n is negative.");
358         ctx.glGenVertexArrays(-1, &arrays);
359         ctx.expectError(GL_INVALID_VALUE);
360         ctx.endSection();
361 }
362
363 void bind_vertex_array (NegativeTestContext& ctx)
364 {
365         ctx.beginSection("GL_INVALID_OPERATION is generated if array is not zero or the name of an existing vertex array object.");
366         ctx.glBindVertexArray(-1);
367         ctx.expectError(GL_INVALID_OPERATION);
368         ctx.endSection();
369 }
370
371 void delete_vertex_arrays (NegativeTestContext& ctx)
372 {
373         ctx.beginSection("GL_INVALID_VALUE is generated if n is negative.");
374         ctx.glDeleteVertexArrays(-1, 0);
375         ctx.expectError(GL_INVALID_VALUE);
376         ctx.endSection();
377 }
378
379 void vertex_attrib_divisor (NegativeTestContext& ctx)
380 {
381         int maxVertexAttribs = ctx.getInteger(GL_MAX_VERTEX_ATTRIBS);
382
383         ctx.beginSection("GL_INVALID_VALUE is generated if index is greater than or equal to GL_MAX_VERTEX_ATTRIBS.");
384         ctx.glVertexAttribDivisor(maxVertexAttribs, 0);
385         ctx.expectError(GL_INVALID_VALUE);
386         ctx.endSection();
387 }
388
389 void draw_arrays (NegativeTestContext& ctx)
390 {
391         const bool                                      isES32  = glu::contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2));
392         GLuint                                          fbo             = 0;
393         map<string, string>                     args;
394         args["GLSL_VERSION_STRING"]                     = isES32 ? getGLSLVersionDeclaration(glu::GLSL_VERSION_320_ES) : getGLSLVersionDeclaration(glu::GLSL_VERSION_310_ES);
395         glu::ShaderProgram                      program (ctx.getRenderContext(), glu::makeVtxFragSources(tcu::StringTemplate(vertexShaderSource).specialize(args), tcu::StringTemplate(fragmentShaderSource).specialize(args)));
396
397         ctx.glUseProgram(program.getProgram());
398         ctx.expectError(GL_NO_ERROR);
399
400         ctx.beginSection("GL_INVALID_ENUM is generated if mode is not an accepted value.");
401         ctx.glDrawArrays(-1, 0, 1);
402         ctx.expectError(GL_INVALID_ENUM);
403         ctx.endSection();
404
405         ctx.beginSection("GL_INVALID_VALUE is generated if count is negative.");
406         ctx.glDrawArrays(GL_POINTS, 0, -1);
407         ctx.expectError(GL_INVALID_VALUE);
408         ctx.endSection();
409
410         ctx.beginSection("GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.");
411         ctx.glGenFramebuffers(1, &fbo);
412         ctx.glBindFramebuffer(GL_FRAMEBUFFER, fbo);
413         ctx.glCheckFramebufferStatus(GL_FRAMEBUFFER);
414         ctx.glDrawArrays(GL_POINTS, 0, 1);
415         ctx.expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
416         ctx.glBindFramebuffer(GL_FRAMEBUFFER, 0);
417         ctx.glDeleteFramebuffers(1, &fbo);
418         ctx.endSection();
419
420         ctx.glUseProgram(0);
421 }
422
423 void draw_arrays_invalid_program (NegativeTestContext& ctx)
424 {
425         GLuint fbo = 0;
426         ctx.glUseProgram(0);
427
428         ctx.beginSection("GL_INVALID_ENUM is generated if mode is not an accepted value.");
429         ctx.glDrawArrays(-1, 0, 1);
430         ctx.expectError(GL_INVALID_ENUM);
431         ctx.endSection();
432
433         ctx.beginSection("GL_INVALID_VALUE is generated if count is negative.");
434         ctx.glDrawArrays(GL_POINTS, 0, -1);
435         ctx.expectError(GL_INVALID_VALUE);
436         ctx.endSection();
437
438         ctx.beginSection("GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.");
439         ctx.glGenFramebuffers(1, &fbo);
440         ctx.glBindFramebuffer(GL_FRAMEBUFFER, fbo);
441         ctx.glCheckFramebufferStatus(GL_FRAMEBUFFER);
442         ctx.glDrawArrays(GL_POINTS, 0, 1);
443         ctx.expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
444         ctx.glBindFramebuffer(GL_FRAMEBUFFER, 0);
445         ctx.glDeleteFramebuffers(1, &fbo);
446         ctx.endSection();
447 }
448
449 void draw_arrays_incomplete_primitive (NegativeTestContext& ctx)
450 {
451         const bool                                      isES32  = glu::contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2));
452         GLuint                                          fbo             = 0;
453         map<string, string>                     args;
454         args["GLSL_VERSION_STRING"]                     = isES32 ? getGLSLVersionDeclaration(glu::GLSL_VERSION_320_ES) : getGLSLVersionDeclaration(glu::GLSL_VERSION_310_ES);
455         glu::ShaderProgram                      program (ctx.getRenderContext(), glu::makeVtxFragSources(tcu::StringTemplate(vertexShaderSource).specialize(args), tcu::StringTemplate(fragmentShaderSource).specialize(args)));
456
457         ctx.glUseProgram(program.getProgram());
458         ctx.expectError(GL_NO_ERROR);
459
460         ctx.beginSection("GL_INVALID_ENUM is generated if mode is not an accepted value.");
461         ctx.glDrawArrays(-1, 0, 1);
462         ctx.expectError(GL_INVALID_ENUM);
463         ctx.endSection();
464
465         ctx.beginSection("GL_INVALID_VALUE is generated if count is negative.");
466         ctx.glDrawArrays(GL_TRIANGLES, 0, -1);
467         ctx.expectError(GL_INVALID_VALUE);
468         ctx.endSection();
469
470         ctx.beginSection("GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.");
471         ctx.glGenFramebuffers(1, &fbo);
472         ctx.glBindFramebuffer(GL_FRAMEBUFFER, fbo);
473         ctx.glCheckFramebufferStatus(GL_FRAMEBUFFER);
474         ctx.glDrawArrays(GL_TRIANGLES, 0, 1);
475         ctx.expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
476         ctx.glBindFramebuffer(GL_FRAMEBUFFER, 0);
477         ctx.glDeleteFramebuffers(1, &fbo);
478         ctx.endSection();
479
480         ctx.glUseProgram(0);
481 }
482
483 void draw_elements (NegativeTestContext& ctx)
484 {
485         const bool                                      isES32  = glu::contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2));
486         GLuint                                          fbo             = 0;
487         GLuint                                          buf             = 0;
488         GLuint                                          tfID    = 0;
489         GLfloat                                         vertices[1];
490         map<string, string>                     args;
491         args["GLSL_VERSION_STRING"]                     = isES32 ? getGLSLVersionDeclaration(glu::GLSL_VERSION_320_ES) : getGLSLVersionDeclaration(glu::GLSL_VERSION_310_ES);
492         glu::ShaderProgram                      program (ctx.getRenderContext(), glu::makeVtxFragSources(tcu::StringTemplate(vertexShaderSource).specialize(args), tcu::StringTemplate(fragmentShaderSource).specialize(args)));
493
494         ctx.glUseProgram(program.getProgram());
495         ctx.expectError(GL_NO_ERROR);
496
497         ctx.beginSection("GL_INVALID_ENUM is generated if mode is not an accepted value.");
498         ctx.glDrawElements(-1, 1, GL_UNSIGNED_BYTE, vertices);
499         ctx.expectError(GL_INVALID_ENUM);
500         ctx.endSection();
501
502         ctx.beginSection("GL_INVALID_ENUM is generated if type is not one of the accepted values.");
503         ctx.glDrawElements(GL_POINTS, 1, -1, vertices);
504         ctx.expectError(GL_INVALID_ENUM);
505         ctx.glDrawElements(GL_POINTS, 1, GL_FLOAT, vertices);
506         ctx.expectError(GL_INVALID_ENUM);
507         ctx.endSection();
508
509         ctx.beginSection("GL_INVALID_VALUE is generated if count is negative.");
510         ctx.glDrawElements(GL_POINTS, -1, GL_UNSIGNED_BYTE, vertices);
511         ctx.expectError(GL_INVALID_VALUE);
512         ctx.endSection();
513
514         ctx.beginSection("GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.");
515         ctx.glGenFramebuffers(1, &fbo);
516         ctx.glBindFramebuffer(GL_FRAMEBUFFER, fbo);
517         ctx.glCheckFramebufferStatus(GL_FRAMEBUFFER);
518         ctx.glDrawElements(GL_POINTS, 1, GL_UNSIGNED_BYTE, vertices);
519         ctx.expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
520         ctx.glBindFramebuffer(GL_FRAMEBUFFER, 0);
521         ctx.glDeleteFramebuffers(1, &fbo);
522         ctx.endSection();
523
524         if (!ctx.getContextInfo().isExtensionSupported("GL_EXT_geometry_shader")) // GL_EXT_geometry_shader removes error
525         {
526                 ctx.beginSection("GL_INVALID_OPERATION is generated if transform feedback is active and not paused.");
527                 const char* tfVarying = "gl_Position";
528
529                 ctx.glGenBuffers(1, &buf);
530                 ctx.glGenTransformFeedbacks(1, &tfID);
531
532                 ctx.glUseProgram(program.getProgram());
533                 ctx.glTransformFeedbackVaryings(program.getProgram(), 1, &tfVarying, GL_INTERLEAVED_ATTRIBS);
534                 ctx.glLinkProgram(program.getProgram());
535                 ctx.glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, tfID);
536                 ctx.glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, buf);
537                 ctx.glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, 32, DE_NULL, GL_DYNAMIC_DRAW);
538                 ctx.glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, buf);
539                 ctx.glBeginTransformFeedback(GL_POINTS);
540                 ctx.expectError(GL_NO_ERROR);
541
542                 ctx.glDrawElements(GL_POINTS, 1, GL_UNSIGNED_BYTE, vertices);
543                 ctx.expectError(GL_INVALID_OPERATION);
544
545                 ctx.glPauseTransformFeedback();
546                 ctx.glDrawElements(GL_POINTS, 1, GL_UNSIGNED_BYTE, vertices);
547                 ctx.expectError(GL_NO_ERROR);
548
549                 ctx.glEndTransformFeedback();
550                 ctx.glDeleteBuffers(1, &buf);
551                 ctx.glDeleteTransformFeedbacks(1, &tfID);
552                 ctx.expectError(GL_NO_ERROR);
553                 ctx.endSection();
554         }
555
556         ctx.glUseProgram(0);
557 }
558
559 void draw_elements_invalid_program (NegativeTestContext& ctx)
560 {
561         ctx.glUseProgram(0);
562         GLuint  fbo = 0;
563         GLfloat vertices[1];
564
565         ctx.beginSection("GL_INVALID_ENUM is generated if mode is not an accepted value.");
566         ctx.glDrawElements(-1, 1, GL_UNSIGNED_BYTE, vertices);
567         ctx.expectError(GL_INVALID_ENUM);
568         ctx.endSection();
569
570         ctx.beginSection("GL_INVALID_ENUM is generated if type is not one of the accepted values.");
571         ctx.glDrawElements(GL_POINTS, 1, -1, vertices);
572         ctx.expectError(GL_INVALID_ENUM);
573         ctx.glDrawElements(GL_POINTS, 1, GL_FLOAT, vertices);
574         ctx.expectError(GL_INVALID_ENUM);
575         ctx.endSection();
576
577         ctx.beginSection("GL_INVALID_VALUE is generated if count is negative.");
578         ctx.glDrawElements(GL_POINTS, -1, GL_UNSIGNED_BYTE, vertices);
579         ctx.expectError(GL_INVALID_VALUE);
580         ctx.endSection();
581
582         ctx.beginSection("GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.");
583         ctx.glGenFramebuffers(1, &fbo);
584         ctx.glBindFramebuffer(GL_FRAMEBUFFER, fbo);
585         ctx.glCheckFramebufferStatus(GL_FRAMEBUFFER);
586         ctx.glDrawElements(GL_POINTS, 1, GL_UNSIGNED_BYTE, vertices);
587         ctx.expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
588         ctx.glBindFramebuffer(GL_FRAMEBUFFER, 0);
589         ctx.glDeleteFramebuffers(1, &fbo);
590         ctx.endSection();
591 }
592
593 void draw_elements_incomplete_primitive (NegativeTestContext& ctx)
594 {
595         const bool                                      isES32  = glu::contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2));
596         GLuint                                          fbo             = 0;
597         GLuint                                          buf             = 0;
598         GLuint                                          tfID    = 0;
599         GLfloat                                         vertices[1];
600         map<string, string>                     args;
601         args["GLSL_VERSION_STRING"]                     = isES32 ? getGLSLVersionDeclaration(glu::GLSL_VERSION_320_ES) : getGLSLVersionDeclaration(glu::GLSL_VERSION_310_ES);
602         glu::ShaderProgram                      program (ctx.getRenderContext(), glu::makeVtxFragSources(tcu::StringTemplate(vertexShaderSource).specialize(args), tcu::StringTemplate(fragmentShaderSource).specialize(args)));
603
604         ctx.glUseProgram(program.getProgram());
605         ctx.expectError(GL_NO_ERROR);
606
607         ctx.beginSection("GL_INVALID_ENUM is generated if mode is not an accepted value.");
608         ctx.glDrawElements(-1, 1, GL_UNSIGNED_BYTE, vertices);
609         ctx.expectError(GL_INVALID_ENUM);
610         ctx.endSection();
611
612         ctx.beginSection("GL_INVALID_ENUM is generated if type is not one of the accepted values.");
613         ctx.glDrawElements(GL_TRIANGLES, 1, -1, vertices);
614         ctx.expectError(GL_INVALID_ENUM);
615         ctx.glDrawElements(GL_TRIANGLES, 1, GL_FLOAT, vertices);
616         ctx.expectError(GL_INVALID_ENUM);
617         ctx.endSection();
618
619         ctx.beginSection("GL_INVALID_VALUE is generated if count is negative.");
620         ctx.glDrawElements(GL_TRIANGLES, -1, GL_UNSIGNED_BYTE, vertices);
621         ctx.expectError(GL_INVALID_VALUE);
622         ctx.endSection();
623
624         ctx.beginSection("GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.");
625         ctx.glGenFramebuffers(1, &fbo);
626         ctx.glBindFramebuffer(GL_FRAMEBUFFER, fbo);
627         ctx.glCheckFramebufferStatus(GL_FRAMEBUFFER);
628         ctx.glDrawElements(GL_TRIANGLES, 1, GL_UNSIGNED_BYTE, vertices);
629         ctx.expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
630         ctx.glBindFramebuffer(GL_FRAMEBUFFER, 0);
631         ctx.glDeleteFramebuffers(1, &fbo);
632         ctx.endSection();
633
634         if (!ctx.getContextInfo().isExtensionSupported("GL_EXT_geometry_shader")) // GL_EXT_geometry_shader removes error
635         {
636                 ctx.beginSection("GL_INVALID_OPERATION is generated if transform feedback is active and not paused.");
637                 const char* tfVarying= "gl_Position";
638
639                 ctx.glGenBuffers(1, &buf);
640                 ctx.glGenTransformFeedbacks(1, &tfID);
641
642                 ctx.glUseProgram(program.getProgram());
643                 ctx.glTransformFeedbackVaryings(program.getProgram(), 1, &tfVarying, GL_INTERLEAVED_ATTRIBS);
644                 ctx.glLinkProgram(program.getProgram());
645                 ctx.glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, tfID);
646                 ctx.glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, buf);
647                 ctx.glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, 32, DE_NULL, GL_DYNAMIC_DRAW);
648                 ctx.glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, buf);
649                 ctx.glBeginTransformFeedback(GL_TRIANGLES);
650                 ctx.expectError(GL_NO_ERROR);
651
652                 ctx.glDrawElements(GL_TRIANGLES, 1, GL_UNSIGNED_BYTE, vertices);
653                 ctx.expectError(GL_INVALID_OPERATION);
654
655                 ctx.glPauseTransformFeedback();
656                 ctx.glDrawElements(GL_TRIANGLES, 1, GL_UNSIGNED_BYTE, vertices);
657                 ctx.expectError(GL_NO_ERROR);
658
659                 ctx.glEndTransformFeedback();
660                 ctx.glDeleteBuffers(1, &buf);
661                 ctx.glDeleteTransformFeedbacks(1, &tfID);
662                 ctx.expectError(GL_NO_ERROR);
663                 ctx.endSection();
664         }
665
666         ctx.glUseProgram(0);
667 }
668
669 void draw_elements_base_vertex (NegativeTestContext& ctx)
670 {
671         TCU_CHECK_AND_THROW(NotSupportedError, contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)), "This test requires a 3.2 context or higher context version.");
672
673         GLuint                          fbo = 0;
674         GLfloat                         vertices[1];
675
676         ctx.beginSection("GL_INVALID_ENUM is generated if mode is not an accepted value.");
677         ctx.glDrawElementsBaseVertex(-1, 1, GL_UNSIGNED_INT, vertices, 1);
678         ctx.expectError(GL_INVALID_ENUM);
679         ctx.endSection();
680
681         ctx.beginSection("GL_INVALID_ENUM is generated if type is not one of the accepted values.");
682         ctx.glDrawElementsBaseVertex(GL_POINTS, 1, -1, vertices, 1);
683         ctx.expectError(GL_INVALID_ENUM);
684         ctx.glDrawElementsBaseVertex(GL_POINTS, 1, GL_FLOAT, vertices, 1);
685         ctx.expectError(GL_INVALID_ENUM);
686         ctx.endSection();
687
688         ctx.beginSection("GL_INVALID_VALUE is generated if count is negative.");
689         ctx.glDrawElementsBaseVertex(GL_POINTS, -1, GL_UNSIGNED_INT, vertices, 1);
690         ctx.expectError(GL_INVALID_VALUE);
691         ctx.endSection();
692
693         ctx.beginSection("GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.");
694         ctx.glGenFramebuffers(1, &fbo);
695         ctx.glBindFramebuffer(GL_FRAMEBUFFER, fbo);
696         ctx.glCheckFramebufferStatus(GL_FRAMEBUFFER);
697         ctx.glDrawElementsBaseVertex(GL_POINTS, 1, GL_UNSIGNED_INT, vertices, 1);
698         ctx.expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
699         ctx.glBindFramebuffer(GL_FRAMEBUFFER, 0);
700         ctx.glDeleteFramebuffers(1, &fbo);
701         ctx.endSection();
702 }
703
704 void draw_elements_base_vertex_primitive_mode_mismatch (NegativeTestContext& ctx)
705 {
706         TCU_CHECK_AND_THROW(NotSupportedError, contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)), "This test requires a 3.2 context or higher context version.");
707
708         GLfloat                                         vertices[1];
709         map<string, string>                     args;
710         args["GLSL_VERSION_STRING"] = getGLSLVersionDeclaration(glu::GLSL_VERSION_320_ES);
711
712         glu::ShaderProgram                      program(ctx.getRenderContext(), glu::ProgramSources() << glu::ProgramSeparable(true) << glu::VertexSource(tcu::StringTemplate(vertexShaderSource).specialize(args)) << glu::GeometrySource(geometryShaderSource));
713
714         ctx.beginSection("GL_INVALID_OPERATION is generated if a geometry shader is active and mode is incompatible with the input primitive type of the geometry shader in the currently installed program object.");
715         ctx.glUseProgram(program.getProgram());
716         ctx.glDrawElementsBaseVertex(GL_TRIANGLES, 1, GL_UNSIGNED_INT, vertices, 1);
717         ctx.expectError(GL_INVALID_OPERATION);
718         ctx.endSection();
719
720         ctx.glUseProgram(0);
721 }
722
723 void draw_arrays_instanced (NegativeTestContext& ctx)
724 {
725         const bool                                      isES32  = glu::contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2));
726         GLuint                                          fbo             = 0;
727         map<string, string>                     args;
728         args["GLSL_VERSION_STRING"]                     = isES32 ? getGLSLVersionDeclaration(glu::GLSL_VERSION_320_ES) : getGLSLVersionDeclaration(glu::GLSL_VERSION_310_ES);
729         glu::ShaderProgram                      program (ctx.getRenderContext(), glu::makeVtxFragSources(tcu::StringTemplate(vertexShaderSource).specialize(args), tcu::StringTemplate(fragmentShaderSource).specialize(args)));
730
731         ctx.glUseProgram(program.getProgram());
732         ctx.expectError(GL_NO_ERROR);
733         ctx.glVertexAttribDivisor(0, 1);
734         ctx.expectError(GL_NO_ERROR);
735
736         ctx.beginSection("GL_INVALID_ENUM is generated if mode is not an accepted value.");
737         ctx.glDrawArraysInstanced(-1, 0, 1, 1);
738         ctx.expectError(GL_INVALID_ENUM);
739         ctx.endSection();
740
741         ctx.beginSection("GL_INVALID_VALUE is generated if count or primcount are negative.");
742         ctx.glDrawArraysInstanced(GL_POINTS, 0, -1, 1);
743         ctx.expectError(GL_INVALID_VALUE);
744         ctx.glDrawArraysInstanced(GL_POINTS, 0, 1, -1);
745         ctx.expectError(GL_INVALID_VALUE);
746         ctx.endSection();
747
748         ctx.beginSection("GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.");
749         ctx.glGenFramebuffers(1, &fbo);
750         ctx.glBindFramebuffer(GL_FRAMEBUFFER, fbo);
751         ctx.glCheckFramebufferStatus(GL_FRAMEBUFFER);
752         ctx.glDrawArraysInstanced(GL_POINTS, 0, 1, 1);
753         ctx.expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
754         ctx.glBindFramebuffer(GL_FRAMEBUFFER, 0);
755         ctx.glDeleteFramebuffers(1, &fbo);
756         ctx.endSection();
757
758         ctx.glUseProgram(0);
759 }
760
761 void draw_arrays_instanced_invalid_program (NegativeTestContext& ctx)
762 {
763         ctx.glUseProgram(0);
764         GLuint fbo = 0;
765         ctx.glVertexAttribDivisor(0, 1);
766         ctx.expectError(GL_NO_ERROR);
767
768         ctx.beginSection("GL_INVALID_ENUM is generated if mode is not an accepted value.");
769         ctx.glDrawArraysInstanced(-1, 0, 1, 1);
770         ctx.expectError(GL_INVALID_ENUM);
771         ctx.endSection();
772
773         ctx.beginSection("GL_INVALID_VALUE is generated if count or primcount are negative.");
774         ctx.glDrawArraysInstanced(GL_POINTS, 0, -1, 1);
775         ctx.expectError(GL_INVALID_VALUE);
776         ctx.glDrawArraysInstanced(GL_POINTS, 0, 1, -1);
777         ctx.expectError(GL_INVALID_VALUE);
778         ctx.endSection();
779
780         ctx.beginSection("GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.");
781         ctx.glGenFramebuffers(1, &fbo);
782         ctx.glBindFramebuffer(GL_FRAMEBUFFER, fbo);
783         ctx.glCheckFramebufferStatus(GL_FRAMEBUFFER);
784         ctx.glDrawArraysInstanced(GL_POINTS, 0, 1, 1);
785         ctx.expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
786         ctx.glBindFramebuffer(GL_FRAMEBUFFER, 0);
787         ctx.glDeleteFramebuffers(1, &fbo);
788         ctx.endSection();
789 }
790
791 void draw_arrays_instanced_incomplete_primitive (NegativeTestContext& ctx)
792 {
793         const bool                                      isES32  = glu::contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2));
794         GLuint                                          fbo             = 0;
795         map<string, string>                     args;
796         args["GLSL_VERSION_STRING"]                     = isES32 ? getGLSLVersionDeclaration(glu::GLSL_VERSION_320_ES) : getGLSLVersionDeclaration(glu::GLSL_VERSION_310_ES);
797         glu::ShaderProgram                      program (ctx.getRenderContext(), glu::makeVtxFragSources(tcu::StringTemplate(vertexShaderSource).specialize(args), tcu::StringTemplate(fragmentShaderSource).specialize(args)));
798
799         ctx.glVertexAttribDivisor(0, 1);
800         ctx.expectError(GL_NO_ERROR);
801
802         ctx.beginSection("GL_INVALID_ENUM is generated if mode is not an accepted value.");
803         ctx.glDrawArraysInstanced(-1, 0, 1, 1);
804         ctx.expectError(GL_INVALID_ENUM);
805         ctx.endSection();
806
807         ctx.beginSection("GL_INVALID_VALUE is generated if count or primcount are negative.");
808         ctx.glDrawArraysInstanced(GL_TRIANGLES, 0, -1, 1);
809         ctx.expectError(GL_INVALID_VALUE);
810         ctx.glDrawArraysInstanced(GL_TRIANGLES, 0, 1, -1);
811         ctx.expectError(GL_INVALID_VALUE);
812         ctx.endSection();
813
814         ctx.beginSection("GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.");
815         ctx.glGenFramebuffers(1, &fbo);
816         ctx.glBindFramebuffer(GL_FRAMEBUFFER, fbo);
817         ctx.glCheckFramebufferStatus(GL_FRAMEBUFFER);
818         ctx.glDrawArraysInstanced(GL_TRIANGLES, 0, 1, 1);
819         ctx.expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
820         ctx.glBindFramebuffer(GL_FRAMEBUFFER, 0);
821         ctx.glDeleteFramebuffers(1, &fbo);
822         ctx.endSection();
823
824         ctx.glUseProgram(0);
825 }
826
827 void draw_elements_instanced (NegativeTestContext& ctx)
828 {
829         const bool                                      isES32  = glu::contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2));
830         GLuint                                          fbo             = 0;
831         GLuint                                          buf             = 0;
832         GLuint                                          tfID    = 0;
833         GLfloat                                         vertices[1];
834         map<string, string>                     args;
835         args["GLSL_VERSION_STRING"]                     = isES32 ? getGLSLVersionDeclaration(glu::GLSL_VERSION_320_ES) : getGLSLVersionDeclaration(glu::GLSL_VERSION_310_ES);
836         glu::ShaderProgram                      program (ctx.getRenderContext(), glu::makeVtxFragSources(tcu::StringTemplate(vertexShaderSource).specialize(args), tcu::StringTemplate(fragmentShaderSource).specialize(args)));
837
838         ctx.glUseProgram(program.getProgram());
839         ctx.glVertexAttribDivisor(0, 1);
840         ctx.expectError(GL_NO_ERROR);
841
842         ctx.beginSection("GL_INVALID_ENUM is generated if mode is not an accepted value.");
843         ctx.glDrawElementsInstanced(-1, 1, GL_UNSIGNED_BYTE, vertices, 1);
844         ctx.expectError(GL_INVALID_ENUM);
845         ctx.endSection();
846
847         ctx.beginSection("GL_INVALID_ENUM is generated if type is not one of the accepted values.");
848         ctx.glDrawElementsInstanced(GL_POINTS, 1, -1, vertices, 1);
849         ctx.expectError(GL_INVALID_ENUM);
850         ctx.glDrawElementsInstanced(GL_POINTS, 1, GL_FLOAT, vertices, 1);
851         ctx.expectError(GL_INVALID_ENUM);
852         ctx.endSection();
853
854         ctx.beginSection("GL_INVALID_VALUE is generated if count or primcount are negative.");
855         ctx.glDrawElementsInstanced(GL_POINTS, -1, GL_UNSIGNED_BYTE, vertices, 1);
856         ctx.expectError(GL_INVALID_VALUE);
857         ctx.glDrawElementsInstanced(GL_POINTS, 11, GL_UNSIGNED_BYTE, vertices, -1);
858         ctx.expectError(GL_INVALID_VALUE);
859         ctx.endSection();
860
861         ctx.beginSection("GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.");
862         ctx.glGenFramebuffers(1, &fbo);
863         ctx.glBindFramebuffer(GL_FRAMEBUFFER, fbo);
864         ctx.glCheckFramebufferStatus(GL_FRAMEBUFFER);
865         ctx.glDrawElementsInstanced(GL_POINTS, 1, GL_UNSIGNED_BYTE, vertices, 1);
866         ctx.expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
867         ctx.glBindFramebuffer(GL_FRAMEBUFFER, 0);
868         ctx.glDeleteFramebuffers(1, &fbo);
869         ctx.endSection();
870
871         if (!ctx.getContextInfo().isExtensionSupported("GL_EXT_geometry_shader")) // GL_EXT_geometry_shader removes error
872         {
873                 ctx.beginSection("GL_INVALID_OPERATION is generated if transform feedback is active and not paused.");
874                 const char* tfVarying = "gl_Position";
875
876                 ctx.glGenBuffers(1, &buf);
877                 ctx.glGenTransformFeedbacks(1, &tfID);
878
879                 ctx.glUseProgram(program.getProgram());
880                 ctx.glTransformFeedbackVaryings(program.getProgram(), 1, &tfVarying, GL_INTERLEAVED_ATTRIBS);
881                 ctx.glLinkProgram(program.getProgram());
882                 ctx.glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, tfID);
883                 ctx.glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, buf);
884                 ctx.glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, 32, DE_NULL, GL_DYNAMIC_DRAW);
885                 ctx.glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, buf);
886                 ctx.glBeginTransformFeedback(GL_POINTS);
887                 ctx.expectError(GL_NO_ERROR);
888
889                 ctx.glDrawElementsInstanced(GL_POINTS, 1, GL_UNSIGNED_BYTE, vertices, 1);
890                 ctx.expectError(GL_INVALID_OPERATION);
891
892                 ctx.glPauseTransformFeedback();
893                 ctx.glDrawElementsInstanced(GL_POINTS, 1, GL_UNSIGNED_BYTE, vertices, 1);
894                 ctx.expectError(GL_NO_ERROR);
895
896                 ctx.glEndTransformFeedback();
897                 ctx.glDeleteBuffers(1, &buf);
898                 ctx.glDeleteTransformFeedbacks(1, &tfID);
899                 ctx.expectError(GL_NO_ERROR);
900                 ctx.endSection();
901         }
902
903         ctx.glUseProgram(0);
904 }
905
906 void draw_elements_instanced_invalid_program (NegativeTestContext& ctx)
907 {
908         ctx.glUseProgram(0);
909         GLuint fbo = 0;
910         GLfloat vertices[1];
911         ctx.glVertexAttribDivisor(0, 1);
912         ctx.expectError(GL_NO_ERROR);
913
914         ctx.beginSection("GL_INVALID_ENUM is generated if mode is not an accepted value.");
915         ctx.glDrawElementsInstanced(-1, 1, GL_UNSIGNED_BYTE, vertices, 1);
916         ctx.expectError(GL_INVALID_ENUM);
917         ctx.endSection();
918
919         ctx.beginSection("GL_INVALID_ENUM is generated if type is not one of the accepted values.");
920         ctx.glDrawElementsInstanced(GL_POINTS, 1, -1, vertices, 1);
921         ctx.expectError(GL_INVALID_ENUM);
922         ctx.glDrawElementsInstanced(GL_POINTS, 1, GL_FLOAT, vertices, 1);
923         ctx.expectError(GL_INVALID_ENUM);
924         ctx.endSection();
925
926         ctx.beginSection("GL_INVALID_VALUE is generated if count or primcount are negative.");
927         ctx.glDrawElementsInstanced(GL_POINTS, -1, GL_UNSIGNED_BYTE, vertices, 1);
928         ctx.expectError(GL_INVALID_VALUE);
929         ctx.glDrawElementsInstanced(GL_POINTS, 11, GL_UNSIGNED_BYTE, vertices, -1);
930         ctx.expectError(GL_INVALID_VALUE);
931         ctx.endSection();
932
933         ctx.beginSection("GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.");
934         ctx.glGenFramebuffers(1, &fbo);
935         ctx.glBindFramebuffer(GL_FRAMEBUFFER, fbo);
936         ctx.glCheckFramebufferStatus(GL_FRAMEBUFFER);
937         ctx.glDrawElementsInstanced(GL_POINTS, 1, GL_UNSIGNED_BYTE, vertices, 1);
938         ctx.expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
939         ctx.glBindFramebuffer(GL_FRAMEBUFFER, 0);
940         ctx.glDeleteFramebuffers(1, &fbo);
941         ctx.endSection();
942 }
943
944 void draw_elements_instanced_incomplete_primitive (NegativeTestContext& ctx)
945 {
946         const bool                                      isES32  = glu::contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2));
947         GLuint                                          fbo             = 0;
948         GLuint                                          buf             = 0;
949         GLuint                                          tfID    = 0;
950         GLfloat                                         vertices[1];
951         map<string, string>                     args;
952         args["GLSL_VERSION_STRING"]                     = isES32 ? getGLSLVersionDeclaration(glu::GLSL_VERSION_320_ES) : getGLSLVersionDeclaration(glu::GLSL_VERSION_310_ES);
953         glu::ShaderProgram                      program (ctx.getRenderContext(), glu::makeVtxFragSources(tcu::StringTemplate(vertexShaderSource).specialize(args), tcu::StringTemplate(fragmentShaderSource).specialize(args)));
954
955         ctx.glUseProgram(program.getProgram());
956         ctx.glVertexAttribDivisor(0, 1);
957         ctx.expectError(GL_NO_ERROR);
958
959         ctx.beginSection("GL_INVALID_ENUM is generated if mode is not an accepted value.");
960         ctx.glDrawElementsInstanced(-1, 1, GL_UNSIGNED_BYTE, vertices, 1);
961         ctx.expectError(GL_INVALID_ENUM);
962         ctx.endSection();
963
964         ctx.beginSection("GL_INVALID_ENUM is generated if type is not one of the accepted values.");
965         ctx.glDrawElementsInstanced(GL_TRIANGLES, 1, -1, vertices, 1);
966         ctx.expectError(GL_INVALID_ENUM);
967         ctx.glDrawElementsInstanced(GL_TRIANGLES, 1, GL_FLOAT, vertices, 1);
968         ctx.expectError(GL_INVALID_ENUM);
969         ctx.endSection();
970
971         ctx.beginSection("GL_INVALID_VALUE is generated if count or primcount are negative.");
972         ctx.glDrawElementsInstanced(GL_TRIANGLES, -1, GL_UNSIGNED_BYTE, vertices, 1);
973         ctx.expectError(GL_INVALID_VALUE);
974         ctx.glDrawElementsInstanced(GL_TRIANGLES, 11, GL_UNSIGNED_BYTE, vertices, -1);
975         ctx.expectError(GL_INVALID_VALUE);
976         ctx.endSection();
977
978         ctx.beginSection("GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.");
979         ctx.glGenFramebuffers(1, &fbo);
980         ctx.glBindFramebuffer(GL_FRAMEBUFFER, fbo);
981         ctx.glCheckFramebufferStatus(GL_FRAMEBUFFER);
982         ctx.glDrawElementsInstanced(GL_TRIANGLES, 1, GL_UNSIGNED_BYTE, vertices, 1);
983         ctx.expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
984         ctx.glBindFramebuffer(GL_FRAMEBUFFER, 0);
985         ctx.glDeleteFramebuffers(1, &fbo);
986         ctx.endSection();
987
988         if (!ctx.getContextInfo().isExtensionSupported("GL_EXT_geometry_shader")) // GL_EXT_geometry_shader removes error
989         {
990                 ctx.beginSection("GL_INVALID_OPERATION is generated if transform feedback is active and not paused.");
991                 const char* tfVarying= "gl_Position";
992
993                 ctx.glGenBuffers(1, &buf);
994                 ctx.glGenTransformFeedbacks(1, &tfID);
995
996                 ctx.glUseProgram(program.getProgram());
997                 ctx.glTransformFeedbackVaryings(program.getProgram(), 1, &tfVarying, GL_INTERLEAVED_ATTRIBS);
998                 ctx.glLinkProgram(program.getProgram());
999                 ctx.glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, tfID);
1000                 ctx.glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, buf);
1001                 ctx.glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, 32, DE_NULL, GL_DYNAMIC_DRAW);
1002                 ctx.glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, buf);
1003                 ctx.glBeginTransformFeedback(GL_TRIANGLES);
1004                 ctx.expectError(GL_NO_ERROR);
1005
1006                 ctx.glDrawElementsInstanced(GL_TRIANGLES, 1, GL_UNSIGNED_BYTE, vertices, 1);
1007                 ctx.expectError(GL_INVALID_OPERATION);
1008
1009                 ctx.glPauseTransformFeedback();
1010                 ctx.glDrawElementsInstanced     (GL_TRIANGLES, 1, GL_UNSIGNED_BYTE, vertices, 1);
1011                 ctx.expectError(GL_NO_ERROR);
1012
1013                 ctx.glEndTransformFeedback();
1014                 ctx.glDeleteBuffers(1, &buf);
1015                 ctx.glDeleteTransformFeedbacks(1, &tfID);
1016                 ctx.expectError(GL_NO_ERROR);
1017                 ctx.endSection();
1018         }
1019
1020         ctx.glUseProgram(0);
1021 }
1022
1023 void draw_elements_instanced_base_vertex (NegativeTestContext& ctx)
1024 {
1025         TCU_CHECK_AND_THROW(NotSupportedError, contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)), "This test requires a 3.2 context or higher context version.");
1026
1027         const bool                                      isES32  = glu::contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2));
1028         GLuint                                          fbo             = 0;
1029         GLfloat                                         vertices[1];
1030         map<string, string>                     args;
1031         args["GLSL_VERSION_STRING"]                     = isES32 ? getGLSLVersionDeclaration(glu::GLSL_VERSION_320_ES) : getGLSLVersionDeclaration(glu::GLSL_VERSION_310_ES);
1032         glu::ShaderProgram                      program                 (ctx.getRenderContext(), glu::makeVtxFragSources(tcu::StringTemplate(vertexShaderSource).specialize(args), tcu::StringTemplate(fragmentShaderSource).specialize(args)));
1033
1034         ctx.glUseProgram(program.getProgram());
1035         ctx.glVertexAttribDivisor(0, 1);
1036         ctx.expectError(GL_NO_ERROR);
1037
1038         ctx.beginSection("GL_INVALID_ENUM is generated if mode is not an accepted value.");
1039         ctx.glDrawElementsInstancedBaseVertex(-1, 1, GL_UNSIGNED_BYTE, vertices, 1, 1);
1040         ctx.expectError(GL_INVALID_ENUM);
1041         ctx.endSection();
1042
1043         ctx.beginSection("GL_INVALID_ENUM is generated if type is not one of the accepted values.");
1044         ctx.glDrawElementsInstancedBaseVertex(GL_POINTS, 1, -1, vertices, 1, 1);
1045         ctx.expectError(GL_INVALID_ENUM);
1046         ctx.glDrawElementsInstancedBaseVertex(GL_POINTS, 1, GL_FLOAT, vertices, 1, 1);
1047         ctx.expectError(GL_INVALID_ENUM);
1048         ctx.endSection();
1049
1050         ctx.beginSection("GL_INVALID_VALUE is generated if count or primcount are negative.");
1051         ctx.glDrawElementsInstancedBaseVertex(GL_POINTS, -1, GL_UNSIGNED_BYTE, vertices, 1, 1);
1052         ctx.expectError(GL_INVALID_VALUE);
1053         ctx.glDrawElementsInstancedBaseVertex(GL_POINTS, 11, GL_UNSIGNED_BYTE, vertices, -1, 1);
1054         ctx.expectError(GL_INVALID_VALUE);
1055         ctx.endSection();
1056
1057         ctx.beginSection("GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.");
1058         ctx.glGenFramebuffers(1, &fbo);
1059         ctx.glBindFramebuffer(GL_FRAMEBUFFER, fbo);
1060         ctx.glCheckFramebufferStatus(GL_FRAMEBUFFER);
1061         ctx.glDrawElementsInstancedBaseVertex(GL_POINTS, 1, GL_UNSIGNED_BYTE, vertices, 1, 1);
1062         ctx.expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
1063         ctx.glBindFramebuffer(GL_FRAMEBUFFER, 0);
1064         ctx.glDeleteFramebuffers(1, &fbo);
1065         ctx.endSection();
1066
1067         ctx.glUseProgram(0);
1068 }
1069
1070 void draw_elements_instanced_base_vertex_primitive_mode_mismatch (NegativeTestContext& ctx)
1071 {
1072         TCU_CHECK_AND_THROW(NotSupportedError, contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)), "This test requires a 3.2 context or higher context version.");
1073
1074         GLfloat                                         vertices[1];
1075         map<string, string>                     args;
1076         args["GLSL_VERSION_STRING"] = getGLSLVersionDeclaration(glu::GLSL_VERSION_320_ES);
1077         glu::ShaderProgram                      geometryProgram(ctx.getRenderContext(), glu::ProgramSources() << glu::ProgramSeparable(true) << glu::VertexSource(tcu::StringTemplate(vertexShaderSource).specialize(args)) << glu::GeometrySource(geometryShaderSource));
1078
1079         ctx.beginSection("GL_INVALID_OPERATION is generated if a geometry shader is active and mode is incompatible with the input primitive type of the geometry shader in the currently installed program object.");
1080         ctx.glUseProgram(geometryProgram.getProgram());
1081         ctx.glDrawElementsInstancedBaseVertex(GL_TRIANGLES, 1, GL_UNSIGNED_INT, vertices, 1, 1);
1082         ctx.expectError(GL_INVALID_OPERATION);
1083         ctx.endSection();
1084
1085         ctx.glUseProgram(0);
1086 }
1087
1088 void draw_range_elements (NegativeTestContext& ctx)
1089 {
1090         const bool                                      isES32  = glu::contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2));
1091         GLuint                                          fbo             = 0;
1092         GLuint                                          buf             = 0;
1093         GLuint                                          tfID    = 0;
1094         GLfloat                                         vertices[1];
1095         map<string, string>                     args;
1096         args["GLSL_VERSION_STRING"]                     = isES32 ? getGLSLVersionDeclaration(glu::GLSL_VERSION_320_ES) : getGLSLVersionDeclaration(glu::GLSL_VERSION_310_ES);
1097         glu::ShaderProgram                      program (ctx.getRenderContext(), glu::makeVtxFragSources(tcu::StringTemplate(vertexShaderSource).specialize(args), tcu::StringTemplate(fragmentShaderSource).specialize(args)));
1098
1099         ctx.glUseProgram(program.getProgram());
1100         ctx.expectError(GL_NO_ERROR);
1101
1102         ctx.beginSection("GL_INVALID_ENUM is generated if mode is not an accepted value.");
1103         ctx.glDrawRangeElements(-1, 0, 1, 1, GL_UNSIGNED_BYTE, vertices);
1104         ctx.expectError(GL_INVALID_ENUM);
1105         ctx.endSection();
1106
1107         ctx.beginSection("GL_INVALID_ENUM is generated if type is not one of the accepted values.");
1108         ctx.glDrawRangeElements(GL_POINTS, 0, 1, 1, -1, vertices);
1109         ctx.expectError(GL_INVALID_ENUM);
1110         ctx.glDrawRangeElements(GL_POINTS, 0, 1, 1, GL_FLOAT, vertices);
1111         ctx.expectError(GL_INVALID_ENUM);
1112         ctx.endSection();
1113
1114         ctx.beginSection("GL_INVALID_VALUE is generated if count is negative.");
1115         ctx.glDrawRangeElements(GL_POINTS, 0, 1, -1, GL_UNSIGNED_BYTE, vertices);
1116         ctx.expectError(GL_INVALID_VALUE);
1117         ctx.endSection();
1118
1119         ctx.beginSection("GL_INVALID_VALUE is generated if end < start.");
1120         ctx.glDrawRangeElements(GL_POINTS, 1, 0, 1, GL_UNSIGNED_BYTE, vertices);
1121         ctx.expectError(GL_INVALID_VALUE);
1122         ctx.endSection();
1123
1124         ctx.beginSection("GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.");
1125         ctx.glGenFramebuffers(1, &fbo);
1126         ctx.glBindFramebuffer(GL_FRAMEBUFFER, fbo);
1127         ctx.glCheckFramebufferStatus(GL_FRAMEBUFFER);
1128         ctx.glDrawRangeElements(GL_POINTS, 0, 1, 1, GL_UNSIGNED_BYTE, vertices);
1129         ctx.expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
1130         ctx.glBindFramebuffer(GL_FRAMEBUFFER, 0);
1131         ctx.glDeleteFramebuffers(1, &fbo);
1132         ctx.endSection();
1133
1134         if (!ctx.getContextInfo().isExtensionSupported("GL_EXT_geometry_shader")) // GL_EXT_geometry_shader removes error
1135         {
1136                 ctx.beginSection("GL_INVALID_OPERATION is generated if transform feedback is active and not paused.");
1137                 const char* tfVarying= "gl_Position";
1138
1139                 ctx.glGenBuffers(1, &buf);
1140                 ctx.glGenTransformFeedbacks(1, &tfID);
1141
1142                 ctx.glUseProgram(program.getProgram());
1143                 ctx.glTransformFeedbackVaryings(program.getProgram(), 1, &tfVarying, GL_INTERLEAVED_ATTRIBS);
1144                 ctx.glLinkProgram(program.getProgram());
1145                 ctx.glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, tfID);
1146                 ctx.glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, buf);
1147                 ctx.glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, 32, DE_NULL, GL_DYNAMIC_DRAW);
1148                 ctx.glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, buf);
1149                 ctx.glBeginTransformFeedback(GL_POINTS);
1150                 ctx.expectError(GL_NO_ERROR);
1151
1152                 ctx.glDrawRangeElements(GL_POINTS, 0, 1, 1, GL_UNSIGNED_BYTE, vertices);
1153                 ctx.expectError(GL_INVALID_OPERATION);
1154
1155                 ctx.glPauseTransformFeedback();
1156                 ctx.glDrawRangeElements(GL_POINTS, 0, 1, 1, GL_UNSIGNED_BYTE, vertices);
1157                 ctx.expectError(GL_NO_ERROR);
1158
1159                 ctx.glEndTransformFeedback();
1160                 ctx.glDeleteBuffers(1, &buf);
1161                 ctx.glDeleteTransformFeedbacks(1, &tfID);
1162                 ctx.expectError(GL_NO_ERROR);
1163                 ctx.endSection();
1164         }
1165
1166         ctx.glUseProgram(0);
1167 }
1168
1169 void draw_range_elements_invalid_program (NegativeTestContext& ctx)
1170 {
1171         ctx.glUseProgram(0);
1172         GLuint fbo = 0;
1173         GLfloat vertices[1];
1174
1175         ctx.beginSection("GL_INVALID_ENUM is generated if mode is not an accepted value.");
1176         ctx.glDrawRangeElements(-1, 0, 1, 1, GL_UNSIGNED_BYTE, vertices);
1177         ctx.expectError(GL_INVALID_ENUM);
1178         ctx.endSection();
1179
1180         ctx.beginSection("GL_INVALID_ENUM is generated if type is not one of the accepted values.");
1181         ctx.glDrawRangeElements(GL_POINTS, 0, 1, 1, -1, vertices);
1182         ctx.expectError(GL_INVALID_ENUM);
1183         ctx.glDrawRangeElements(GL_POINTS, 0, 1, 1, GL_FLOAT, vertices);
1184         ctx.expectError(GL_INVALID_ENUM);
1185         ctx.endSection();
1186
1187         ctx.beginSection("GL_INVALID_VALUE is generated if count is negative.");
1188         ctx.glDrawRangeElements(GL_POINTS, 0, 1, -1, GL_UNSIGNED_BYTE, vertices);
1189         ctx.expectError(GL_INVALID_VALUE);
1190         ctx.endSection();
1191
1192         ctx.beginSection("GL_INVALID_VALUE is generated if end < start.");
1193         ctx.glDrawRangeElements(GL_POINTS, 1, 0, 1, GL_UNSIGNED_BYTE, vertices);
1194         ctx.expectError(GL_INVALID_VALUE);
1195         ctx.endSection();
1196
1197         ctx.beginSection("GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.");
1198         ctx.glGenFramebuffers(1, &fbo);
1199         ctx.glBindFramebuffer(GL_FRAMEBUFFER, fbo);
1200         ctx.glCheckFramebufferStatus(GL_FRAMEBUFFER);
1201         ctx.glDrawRangeElements(GL_POINTS, 0, 1, 1, GL_UNSIGNED_BYTE, vertices);
1202         ctx.expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
1203         ctx.glBindFramebuffer(GL_FRAMEBUFFER, 0);
1204         ctx.glDeleteFramebuffers(1, &fbo);
1205         ctx.endSection();
1206 }
1207
1208 void draw_range_elements_incomplete_primitive (NegativeTestContext& ctx)
1209 {
1210         const bool                                      isES32  = glu::contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2));
1211         GLuint                                          fbo             = 0;
1212         GLuint                                          buf             = 0;
1213         GLuint                                          tfID    = 0;
1214         GLfloat                                         vertices[1];
1215         map<string, string>                     args;
1216         args["GLSL_VERSION_STRING"]                     = isES32 ? getGLSLVersionDeclaration(glu::GLSL_VERSION_320_ES) : getGLSLVersionDeclaration(glu::GLSL_VERSION_310_ES);
1217         glu::ShaderProgram                      program (ctx.getRenderContext(), glu::makeVtxFragSources(tcu::StringTemplate(vertexShaderSource).specialize(args), tcu::StringTemplate(fragmentShaderSource).specialize(args)));
1218
1219         ctx.glUseProgram(program.getProgram());
1220         ctx.expectError(GL_NO_ERROR);
1221
1222         ctx.beginSection("GL_INVALID_ENUM is generated if mode is not an accepted value.");
1223         ctx.glDrawRangeElements(-1, 0, 1, 1, GL_UNSIGNED_BYTE, vertices);
1224         ctx.expectError(GL_INVALID_ENUM);
1225         ctx.endSection();
1226
1227         ctx.beginSection("GL_INVALID_ENUM is generated if type is not one of the accepted values.");
1228         ctx.glDrawRangeElements(GL_TRIANGLES, 0, 1, 1, -1, vertices);
1229         ctx.expectError(GL_INVALID_ENUM);
1230         ctx.glDrawRangeElements(GL_TRIANGLES, 0, 1, 1, GL_FLOAT, vertices);
1231         ctx.expectError(GL_INVALID_ENUM);
1232         ctx.endSection();
1233
1234         ctx.beginSection("GL_INVALID_VALUE is generated if count is negative.");
1235         ctx.glDrawRangeElements(GL_TRIANGLES, 0, 1, -1, GL_UNSIGNED_BYTE, vertices);
1236         ctx.expectError(GL_INVALID_VALUE);
1237         ctx.endSection();
1238
1239         ctx.beginSection("GL_INVALID_VALUE is generated if end < start.");
1240         ctx.glDrawRangeElements(GL_TRIANGLES, 1, 0, 1, GL_UNSIGNED_BYTE, vertices);
1241         ctx.expectError(GL_INVALID_VALUE);
1242         ctx.endSection();
1243
1244         ctx.beginSection("GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.");
1245         ctx.glGenFramebuffers(1, &fbo);
1246         ctx.glBindFramebuffer(GL_FRAMEBUFFER, fbo);
1247         ctx.glCheckFramebufferStatus(GL_FRAMEBUFFER);
1248         ctx.glDrawRangeElements(GL_TRIANGLES, 0, 1, 1, GL_UNSIGNED_BYTE, vertices);
1249         ctx.expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
1250         ctx.glBindFramebuffer(GL_FRAMEBUFFER, 0);
1251         ctx.glDeleteFramebuffers(1, &fbo);
1252         ctx.endSection();
1253
1254         if (!ctx.getContextInfo().isExtensionSupported("GL_EXT_geometry_shader")) // GL_EXT_geometry_shader removes error
1255         {
1256                 ctx.beginSection("GL_INVALID_OPERATION is generated if transform feedback is active and not paused.");
1257                 const char* tfVarying = "gl_Position";
1258
1259                 ctx.glGenBuffers(1, &buf);
1260                 ctx.glGenTransformFeedbacks(1, &tfID);
1261
1262                 ctx.glUseProgram(program.getProgram());
1263                 ctx.glTransformFeedbackVaryings(program.getProgram(), 1, &tfVarying, GL_INTERLEAVED_ATTRIBS);
1264                 ctx.glLinkProgram(program.getProgram());
1265                 ctx.glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, tfID);
1266                 ctx.glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, buf);
1267                 ctx.glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, 32, DE_NULL, GL_DYNAMIC_DRAW);
1268                 ctx.glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, buf);
1269                 ctx.glBeginTransformFeedback(GL_TRIANGLES);
1270                 ctx.expectError(GL_NO_ERROR);
1271
1272                 ctx.glDrawRangeElements(GL_TRIANGLES, 0, 1, 1, GL_UNSIGNED_BYTE, vertices);
1273                 ctx.expectError(GL_INVALID_OPERATION);
1274
1275                 ctx.glPauseTransformFeedback();
1276                 ctx.glDrawRangeElements(GL_TRIANGLES, 0, 1, 1, GL_UNSIGNED_BYTE, vertices);
1277                 ctx.expectError(GL_NO_ERROR);
1278
1279                 ctx.glEndTransformFeedback();
1280                 ctx.glDeleteBuffers(1, &buf);
1281                 ctx.glDeleteTransformFeedbacks(1, &tfID);
1282                 ctx.expectError(GL_NO_ERROR);
1283                 ctx.endSection();
1284         }
1285
1286         ctx.glUseProgram(0);
1287 }
1288
1289 void draw_range_elements_base_vertex (NegativeTestContext& ctx)
1290 {
1291         TCU_CHECK_AND_THROW(NotSupportedError, contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)), "This test requires a 3.2 context or higher context version.");
1292
1293         GLuint                                          fbo             = 0;
1294         GLfloat                                         vertices[1];
1295         map<string, string>                     args;
1296         args["GLSL_VERSION_STRING"]                     = getGLSLVersionDeclaration(glu::GLSL_VERSION_320_ES);
1297         glu::ShaderProgram                      program (ctx.getRenderContext(), glu::makeVtxFragSources(tcu::StringTemplate(vertexShaderSource).specialize(args), tcu::StringTemplate(fragmentShaderSource).specialize(args)));
1298
1299         ctx.glUseProgram(program.getProgram());
1300         ctx.expectError(GL_NO_ERROR);
1301
1302         ctx.beginSection("GL_INVALID_ENUM is generated if mode is not an accepted value.");
1303         ctx.glDrawRangeElementsBaseVertex(-1, 0, 1, 1, GL_UNSIGNED_BYTE, vertices, 1);
1304         ctx.expectError(GL_INVALID_ENUM);
1305         ctx.endSection();
1306
1307         ctx.beginSection("GL_INVALID_ENUM is generated if type is not one of the accepted values.");
1308         ctx.glDrawRangeElementsBaseVertex(GL_POINTS, 0, 1, 1, -1, vertices, 1);
1309         ctx.expectError(GL_INVALID_ENUM);
1310         ctx.glDrawRangeElementsBaseVertex(GL_POINTS, 0, 1, 1, GL_FLOAT, vertices, 1);
1311         ctx.expectError(GL_INVALID_ENUM);
1312         ctx.endSection();
1313
1314         ctx.beginSection("GL_INVALID_VALUE is generated if count is negative.");
1315         ctx.glDrawRangeElementsBaseVertex(GL_POINTS, 0, 1, -1, GL_UNSIGNED_BYTE, vertices, 1);
1316         ctx.expectError(GL_INVALID_VALUE);
1317         ctx.endSection();
1318
1319         ctx.beginSection("GL_INVALID_VALUE is generated if end < start.");
1320         ctx.glDrawRangeElementsBaseVertex(GL_POINTS, 1, 0, 1, GL_UNSIGNED_BYTE, vertices, 1);
1321         ctx.expectError(GL_INVALID_VALUE);
1322         ctx.endSection();
1323
1324         ctx.beginSection("GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.");
1325         ctx.glGenFramebuffers(1, &fbo);
1326         ctx.glBindFramebuffer(GL_FRAMEBUFFER, fbo);
1327         ctx.glCheckFramebufferStatus(GL_FRAMEBUFFER);
1328         ctx.glDrawRangeElementsBaseVertex(GL_POINTS, 0, 1, 1, GL_UNSIGNED_BYTE, vertices, 1);
1329         ctx.expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
1330         ctx.glBindFramebuffer(GL_FRAMEBUFFER, 0);
1331         ctx.glDeleteFramebuffers(1, &fbo);
1332         ctx.endSection();
1333
1334         ctx.glUseProgram(0);
1335 }
1336
1337 void draw_range_elements_base_vertex_primitive_mode_mismatch (NegativeTestContext& ctx)
1338 {
1339         TCU_CHECK_AND_THROW(NotSupportedError, contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)), "This test requires a 3.2 context or higher context version.");
1340
1341         GLfloat                                         vertices[1];
1342         map<string, string>                     args;
1343         args["GLSL_VERSION_STRING"] = getGLSLVersionDeclaration(glu::GLSL_VERSION_320_ES);
1344         glu::ShaderProgram                      geometryProgram(ctx.getRenderContext(), glu::ProgramSources() << glu::ProgramSeparable(true) << glu::VertexSource(tcu::StringTemplate(vertexShaderSource).specialize(args)) << glu::GeometrySource(geometryShaderSource));
1345
1346         ctx.beginSection("GL_INVALID_OPERATION is generated if a geometry shader is active and mode is incompatible with the input primitive type of the geometry shader in the currently installed program object.");
1347         ctx.glUseProgram(geometryProgram.getProgram());
1348         ctx.glDrawRangeElementsBaseVertex(GL_TRIANGLES, 0, 1, 1, GL_UNSIGNED_INT, vertices, 1);
1349         ctx.expectError(GL_INVALID_OPERATION);
1350         ctx.endSection();
1351
1352         ctx.glUseProgram(0);
1353 }
1354
1355 std::vector<FunctionContainer> getNegativeVertexArrayApiTestFunctions ()
1356 {
1357         FunctionContainer funcs[] =
1358         {
1359                 {vertex_attribf,                                                                                                "vertex_attribf",                                                                                               "Invalid glVertexAttrib{1234}f() usage"                         },
1360                 {vertex_attribfv,                                                                                               "vertex_attribfv",                                                                                              "Invalid glVertexAttrib{1234}fv() usage"                        },
1361                 {vertex_attribi4,                                                                                               "vertex_attribi4",                                                                                              "Invalid glVertexAttribI4{i|ui}f() usage"                       },
1362                 {vertex_attribi4v,                                                                                              "vertex_attribi4v",                                                                                             "Invalid glVertexAttribI4{i|ui}fv() usage"                      },
1363                 {vertex_attrib_pointer,                                                                                 "vertex_attrib_pointer",                                                                                "Invalid glVertexAttribPointer() usage"                         },
1364                 {vertex_attrib_i_pointer,                                                                               "vertex_attrib_i_pointer",                                                                              "Invalid glVertexAttribPointer() usage"                         },
1365                 {vertex_attrib_format,                                                                                  "vertex_attrib_format",                                                                                 "Invalid glVertexAttribFormat() usage"                          },
1366                 {vertex_attrib_i_format,                                                                                "vertex_attrib_i_format",                                                                               "Invalid glVertexAttribIFormat() usage"                         },
1367                 {enable_vertex_attrib_array,                                                                    "enable_vertex_attrib_array",                                                                   "Invalid glEnableVertexAttribArray() usage"                     },
1368                 {disable_vertex_attrib_array,                                                                   "disable_vertex_attrib_array",                                                                  "Invalid glDisableVertexAttribArray() usage"            },
1369                 {gen_vertex_arrays,                                                                                             "gen_vertex_arrays",                                                                                    "Invalid glGenVertexArrays() usage"                                     },
1370                 {bind_vertex_array,                                                                                             "bind_vertex_array",                                                                                    "Invalid glBindVertexArray() usage"                                     },
1371                 {delete_vertex_arrays,                                                                                  "delete_vertex_arrays",                                                                                 "Invalid glDeleteVertexArrays() usage"                          },
1372                 {vertex_attrib_divisor,                                                                                 "vertex_attrib_divisor",                                                                                "Invalid glVertexAttribDivisor() usage"                         },
1373                 {draw_arrays,                                                                                                   "draw_arrays",                                                                                                  "Invalid glDrawArrays() usage"                                          },
1374                 {draw_arrays_invalid_program,                                                                   "draw_arrays_invalid_program",                                                                  "Invalid glDrawArrays() usage"                                          },
1375                 {draw_arrays_incomplete_primitive,                                                              "draw_arrays_incomplete_primitive",                                                             "Invalid glDrawArrays() usage"                                          },
1376                 {draw_elements,                                                                                                 "draw_elements",                                                                                                "Invalid glDrawElements() usage"                                        },
1377                 {draw_elements_base_vertex,                                                                             "draw_elements_base_vertex",                                                                    "Invalid glDrawElementsBaseVertex() usage"                      },
1378                 {draw_elements_base_vertex_primitive_mode_mismatch,                             "draw_elements_base_vertex_primitive_mode_mismatch",                    "Invalid glDrawElementsBaseVertex() usage"                      },
1379                 {draw_elements_invalid_program,                                                                 "draw_elements_invalid_program",                                                                "Invalid glDrawElements() usage"                                        },
1380                 {draw_elements_incomplete_primitive,                                                    "draw_elements_incomplete_primitive",                                                   "Invalid glDrawElements() usage"                                        },
1381                 {draw_arrays_instanced,                                                                                 "draw_arrays_instanced",                                                                                "Invalid glDrawArraysInstanced() usage"                         },
1382                 {draw_arrays_instanced_invalid_program,                                                 "draw_arrays_instanced_invalid_program",                                                "Invalid glDrawArraysInstanced() usage"                         },
1383                 {draw_arrays_instanced_incomplete_primitive,                                    "draw_arrays_instanced_incomplete_primitive",                                   "Invalid glDrawArraysInstanced() usage"                         },
1384                 {draw_elements_instanced,                                                                               "draw_elements_instanced",                                                                              "Invalid glDrawElementsInstanced() usage"                       },
1385                 {draw_elements_instanced_invalid_program,                                               "draw_elements_instanced_invalid_program",                                              "Invalid glDrawElementsInstanced() usage"                       },
1386                 {draw_elements_instanced_incomplete_primitive,                                  "draw_elements_instanced_incomplete_primitive",                                 "Invalid glDrawElementsInstanced() usage"                       },
1387                 {draw_elements_instanced_base_vertex,                                                   "draw_elements_instanced_base_vertex",                                                  "Invalid glDrawElementsInstancedBaseVertex() usage"     },
1388                 {draw_elements_instanced_base_vertex_primitive_mode_mismatch,   "draw_elements_instanced_base_vertex_primitive_mode_mismatch",  "Invalid glDrawElementsInstancedBaseVertex() usage"     },
1389                 {draw_range_elements,                                                                                   "draw_range_elements",                                                                                  "Invalid glDrawRangeElements() usage"                           },
1390                 {draw_range_elements_invalid_program,                                                   "draw_range_elements_invalid_program",                                                  "Invalid glDrawRangeElements() usage"                           },
1391                 {draw_range_elements_incomplete_primitive,                                              "draw_range_elements_incomplete_primitive",                                             "Invalid glDrawRangeElements() usage"                           },
1392                 {draw_range_elements_base_vertex,                                                               "draw_range_elements_base_vertex",                                                              "Invalid glDrawRangeElementsBaseVertex() usage"         },
1393                 {draw_range_elements_base_vertex_primitive_mode_mismatch,               "draw_range_elements_base_vertex_primitive_mode_mismatch",              "Invalid glDrawRangeElementsBaseVertex() usage"         },
1394         };
1395
1396         return std::vector<FunctionContainer>(DE_ARRAY_BEGIN(funcs), DE_ARRAY_END(funcs));
1397 }
1398
1399 } // NegativeTestShared
1400 } // Functional
1401 } // gles31
1402 } // deqp