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