1*35238bceSAndroid Build Coastguard Worker /*-------------------------------------------------------------------------
2*35238bceSAndroid Build Coastguard Worker * drawElements Quality Program OpenGL ES 2.0 Module
3*35238bceSAndroid Build Coastguard Worker * -------------------------------------------------
4*35238bceSAndroid Build Coastguard Worker *
5*35238bceSAndroid Build Coastguard Worker * Copyright 2014 The Android Open Source Project
6*35238bceSAndroid Build Coastguard Worker *
7*35238bceSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
8*35238bceSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
9*35238bceSAndroid Build Coastguard Worker * You may obtain a copy of the License at
10*35238bceSAndroid Build Coastguard Worker *
11*35238bceSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
12*35238bceSAndroid Build Coastguard Worker *
13*35238bceSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
14*35238bceSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
15*35238bceSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16*35238bceSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
17*35238bceSAndroid Build Coastguard Worker * limitations under the License.
18*35238bceSAndroid Build Coastguard Worker *
19*35238bceSAndroid Build Coastguard Worker *//*!
20*35238bceSAndroid Build Coastguard Worker * \file
21*35238bceSAndroid Build Coastguard Worker * \brief Negative Vertex Array API tests.
22*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/
23*35238bceSAndroid Build Coastguard Worker
24*35238bceSAndroid Build Coastguard Worker #include "es2fNegativeVertexArrayApiTests.hpp"
25*35238bceSAndroid Build Coastguard Worker #include "es2fApiCase.hpp"
26*35238bceSAndroid Build Coastguard Worker #include "gluShaderProgram.hpp"
27*35238bceSAndroid Build Coastguard Worker #include "gluContextInfo.hpp"
28*35238bceSAndroid Build Coastguard Worker #include "deString.h"
29*35238bceSAndroid Build Coastguard Worker
30*35238bceSAndroid Build Coastguard Worker #include "glwEnums.hpp"
31*35238bceSAndroid Build Coastguard Worker #include "glwDefs.hpp"
32*35238bceSAndroid Build Coastguard Worker
33*35238bceSAndroid Build Coastguard Worker using namespace glw; // GL types
34*35238bceSAndroid Build Coastguard Worker
35*35238bceSAndroid Build Coastguard Worker namespace deqp
36*35238bceSAndroid Build Coastguard Worker {
37*35238bceSAndroid Build Coastguard Worker namespace gles2
38*35238bceSAndroid Build Coastguard Worker {
39*35238bceSAndroid Build Coastguard Worker namespace Functional
40*35238bceSAndroid Build Coastguard Worker {
41*35238bceSAndroid Build Coastguard Worker
42*35238bceSAndroid Build Coastguard Worker static const char *vertexShaderSource = "void main (void) { gl_Position = vec4(0.0); }\n\0";
43*35238bceSAndroid Build Coastguard Worker static const char *fragmentShaderSource = "void main (void) { gl_FragColor = vec4(0.0); }\n\0";
44*35238bceSAndroid Build Coastguard Worker
45*35238bceSAndroid Build Coastguard Worker using tcu::TestLog;
46*35238bceSAndroid Build Coastguard Worker
NegativeVertexArrayApiTests(Context & context)47*35238bceSAndroid Build Coastguard Worker NegativeVertexArrayApiTests::NegativeVertexArrayApiTests(Context &context)
48*35238bceSAndroid Build Coastguard Worker : TestCaseGroup(context, "vertex_array", "Negative Vertex Array API Cases")
49*35238bceSAndroid Build Coastguard Worker {
50*35238bceSAndroid Build Coastguard Worker }
51*35238bceSAndroid Build Coastguard Worker
~NegativeVertexArrayApiTests(void)52*35238bceSAndroid Build Coastguard Worker NegativeVertexArrayApiTests::~NegativeVertexArrayApiTests(void)
53*35238bceSAndroid Build Coastguard Worker {
54*35238bceSAndroid Build Coastguard Worker }
55*35238bceSAndroid Build Coastguard Worker
init(void)56*35238bceSAndroid Build Coastguard Worker void NegativeVertexArrayApiTests::init(void)
57*35238bceSAndroid Build Coastguard Worker {
58*35238bceSAndroid Build Coastguard Worker ES2F_ADD_API_CASE(vertex_attrib, "Invalid glVertexAttrib() usage", {
59*35238bceSAndroid Build Coastguard Worker m_log << tcu::TestLog::Section(
60*35238bceSAndroid Build Coastguard Worker "", "GL_INVALID_VALUE is generated if index is greater than or equal to GL_MAX_VERTEX_ATTRIBS.");
61*35238bceSAndroid Build Coastguard Worker int maxVertexAttribs = m_context.getContextInfo().getInt(GL_MAX_VERTEX_ATTRIBS);
62*35238bceSAndroid Build Coastguard Worker glVertexAttrib1f(maxVertexAttribs, 0.0f);
63*35238bceSAndroid Build Coastguard Worker expectError(GL_INVALID_VALUE);
64*35238bceSAndroid Build Coastguard Worker glVertexAttrib2f(maxVertexAttribs, 0.0f, 0.0f);
65*35238bceSAndroid Build Coastguard Worker expectError(GL_INVALID_VALUE);
66*35238bceSAndroid Build Coastguard Worker glVertexAttrib3f(maxVertexAttribs, 0.0f, 0.0f, 0.0f);
67*35238bceSAndroid Build Coastguard Worker expectError(GL_INVALID_VALUE);
68*35238bceSAndroid Build Coastguard Worker glVertexAttrib4f(maxVertexAttribs, 0.0f, 0.0f, 0.0f, 0.0f);
69*35238bceSAndroid Build Coastguard Worker expectError(GL_INVALID_VALUE);
70*35238bceSAndroid Build Coastguard Worker m_log << tcu::TestLog::EndSection;
71*35238bceSAndroid Build Coastguard Worker });
72*35238bceSAndroid Build Coastguard Worker ES2F_ADD_API_CASE(vertex_attribv, "Invalid glVertexAttribv() usage", {
73*35238bceSAndroid Build Coastguard Worker m_log << tcu::TestLog::Section(
74*35238bceSAndroid Build Coastguard Worker "", "GL_INVALID_VALUE is generated if index is greater than or equal to GL_MAX_VERTEX_ATTRIBS.");
75*35238bceSAndroid Build Coastguard Worker int maxVertexAttribs = m_context.getContextInfo().getInt(GL_MAX_VERTEX_ATTRIBS);
76*35238bceSAndroid Build Coastguard Worker float v[4] = {0.0f};
77*35238bceSAndroid Build Coastguard Worker glVertexAttrib1fv(maxVertexAttribs, &v[0]);
78*35238bceSAndroid Build Coastguard Worker expectError(GL_INVALID_VALUE);
79*35238bceSAndroid Build Coastguard Worker glVertexAttrib2fv(maxVertexAttribs, &v[0]);
80*35238bceSAndroid Build Coastguard Worker expectError(GL_INVALID_VALUE);
81*35238bceSAndroid Build Coastguard Worker glVertexAttrib3fv(maxVertexAttribs, &v[0]);
82*35238bceSAndroid Build Coastguard Worker expectError(GL_INVALID_VALUE);
83*35238bceSAndroid Build Coastguard Worker glVertexAttrib4fv(maxVertexAttribs, &v[0]);
84*35238bceSAndroid Build Coastguard Worker expectError(GL_INVALID_VALUE);
85*35238bceSAndroid Build Coastguard Worker m_log << tcu::TestLog::EndSection;
86*35238bceSAndroid Build Coastguard Worker });
87*35238bceSAndroid Build Coastguard Worker ES2F_ADD_API_CASE(vertex_attrib_pointer, "Invalid glVertexAttribPointer() usage", {
88*35238bceSAndroid Build Coastguard Worker m_log << tcu::TestLog::Section("", "GL_INVALID_ENUM is generated if type is not an accepted value.");
89*35238bceSAndroid Build Coastguard Worker glVertexAttribPointer(0, 1, 0, GL_TRUE, 0, 0);
90*35238bceSAndroid Build Coastguard Worker expectError(GL_INVALID_ENUM);
91*35238bceSAndroid Build Coastguard Worker m_log << tcu::TestLog::EndSection;
92*35238bceSAndroid Build Coastguard Worker
93*35238bceSAndroid Build Coastguard Worker m_log << tcu::TestLog::Section(
94*35238bceSAndroid Build Coastguard Worker "", "GL_INVALID_VALUE is generated if index is greater than or equal to GL_MAX_VERTEX_ATTRIBS.");
95*35238bceSAndroid Build Coastguard Worker int maxVertexAttribs = m_context.getContextInfo().getInt(GL_MAX_VERTEX_ATTRIBS);
96*35238bceSAndroid Build Coastguard Worker glVertexAttribPointer(maxVertexAttribs, 1, GL_BYTE, GL_TRUE, 0, 0);
97*35238bceSAndroid Build Coastguard Worker expectError(GL_INVALID_VALUE);
98*35238bceSAndroid Build Coastguard Worker m_log << tcu::TestLog::EndSection;
99*35238bceSAndroid Build Coastguard Worker
100*35238bceSAndroid Build Coastguard Worker m_log << tcu::TestLog::Section("", "GL_INVALID_VALUE is generated if size is not 1, 2, 3, or 4.");
101*35238bceSAndroid Build Coastguard Worker glVertexAttribPointer(0, 0, GL_BYTE, GL_TRUE, 0, 0);
102*35238bceSAndroid Build Coastguard Worker expectError(GL_INVALID_VALUE);
103*35238bceSAndroid Build Coastguard Worker m_log << tcu::TestLog::EndSection;
104*35238bceSAndroid Build Coastguard Worker
105*35238bceSAndroid Build Coastguard Worker m_log << tcu::TestLog::Section("", "GL_INVALID_VALUE is generated if stride is negative.");
106*35238bceSAndroid Build Coastguard Worker glVertexAttribPointer(0, 1, GL_BYTE, GL_TRUE, -1, 0);
107*35238bceSAndroid Build Coastguard Worker expectError(GL_INVALID_VALUE);
108*35238bceSAndroid Build Coastguard Worker m_log << tcu::TestLog::EndSection;
109*35238bceSAndroid Build Coastguard Worker });
110*35238bceSAndroid Build Coastguard Worker ES2F_ADD_API_CASE(enable_vertex_attrib_array, "Invalid glEnableVertexAttribArray() usage", {
111*35238bceSAndroid Build Coastguard Worker m_log << tcu::TestLog::Section(
112*35238bceSAndroid Build Coastguard Worker "", "GL_INVALID_VALUE is generated if index is greater than or equal to GL_MAX_VERTEX_ATTRIBS.");
113*35238bceSAndroid Build Coastguard Worker int maxVertexAttribs = m_context.getContextInfo().getInt(GL_MAX_VERTEX_ATTRIBS);
114*35238bceSAndroid Build Coastguard Worker glEnableVertexAttribArray(maxVertexAttribs);
115*35238bceSAndroid Build Coastguard Worker expectError(GL_INVALID_VALUE);
116*35238bceSAndroid Build Coastguard Worker m_log << tcu::TestLog::EndSection;
117*35238bceSAndroid Build Coastguard Worker });
118*35238bceSAndroid Build Coastguard Worker ES2F_ADD_API_CASE(disable_vertex_attrib_array, "Invalid glDisableVertexAttribArray() usage", {
119*35238bceSAndroid Build Coastguard Worker m_log << tcu::TestLog::Section(
120*35238bceSAndroid Build Coastguard Worker "", "GL_INVALID_VALUE is generated if index is greater than or equal to GL_MAX_VERTEX_ATTRIBS.");
121*35238bceSAndroid Build Coastguard Worker int maxVertexAttribs = m_context.getContextInfo().getInt(GL_MAX_VERTEX_ATTRIBS);
122*35238bceSAndroid Build Coastguard Worker glDisableVertexAttribArray(maxVertexAttribs);
123*35238bceSAndroid Build Coastguard Worker expectError(GL_INVALID_VALUE);
124*35238bceSAndroid Build Coastguard Worker m_log << tcu::TestLog::EndSection;
125*35238bceSAndroid Build Coastguard Worker });
126*35238bceSAndroid Build Coastguard Worker ES2F_ADD_API_CASE(draw_arrays, "Invalid glDrawArrays() usage", {
127*35238bceSAndroid Build Coastguard Worker glu::ShaderProgram program(m_context.getRenderContext(),
128*35238bceSAndroid Build Coastguard Worker glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
129*35238bceSAndroid Build Coastguard Worker glUseProgram(program.getProgram());
130*35238bceSAndroid Build Coastguard Worker
131*35238bceSAndroid Build Coastguard Worker m_log << tcu::TestLog::Section("", "GL_INVALID_ENUM is generated if mode is not an accepted value.");
132*35238bceSAndroid Build Coastguard Worker glDrawArrays(-1, 0, 1);
133*35238bceSAndroid Build Coastguard Worker expectError(GL_INVALID_ENUM);
134*35238bceSAndroid Build Coastguard Worker m_log << tcu::TestLog::EndSection;
135*35238bceSAndroid Build Coastguard Worker
136*35238bceSAndroid Build Coastguard Worker m_log << tcu::TestLog::Section("", "GL_INVALID_VALUE is generated if count is negative.");
137*35238bceSAndroid Build Coastguard Worker glDrawArrays(GL_POINTS, 0, -1);
138*35238bceSAndroid Build Coastguard Worker expectError(GL_INVALID_VALUE);
139*35238bceSAndroid Build Coastguard Worker m_log << tcu::TestLog::EndSection;
140*35238bceSAndroid Build Coastguard Worker
141*35238bceSAndroid Build Coastguard Worker m_log << tcu::TestLog::Section("", "GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound "
142*35238bceSAndroid Build Coastguard Worker "framebuffer is not framebuffer complete.");
143*35238bceSAndroid Build Coastguard Worker GLuint fbo;
144*35238bceSAndroid Build Coastguard Worker glGenFramebuffers(1, &fbo);
145*35238bceSAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fbo);
146*35238bceSAndroid Build Coastguard Worker glCheckFramebufferStatus(GL_FRAMEBUFFER);
147*35238bceSAndroid Build Coastguard Worker glDrawArrays(GL_POINTS, 0, 1);
148*35238bceSAndroid Build Coastguard Worker expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
149*35238bceSAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, 0);
150*35238bceSAndroid Build Coastguard Worker glDeleteFramebuffers(1, &fbo);
151*35238bceSAndroid Build Coastguard Worker m_log << tcu::TestLog::EndSection;
152*35238bceSAndroid Build Coastguard Worker
153*35238bceSAndroid Build Coastguard Worker glUseProgram(0);
154*35238bceSAndroid Build Coastguard Worker });
155*35238bceSAndroid Build Coastguard Worker ES2F_ADD_API_CASE(draw_arrays_invalid_program, "Invalid glDrawArrays() usage", {
156*35238bceSAndroid Build Coastguard Worker glUseProgram(0);
157*35238bceSAndroid Build Coastguard Worker
158*35238bceSAndroid Build Coastguard Worker m_log << tcu::TestLog::Section("", "GL_INVALID_ENUM is generated if mode is not an accepted value.");
159*35238bceSAndroid Build Coastguard Worker glDrawArrays(-1, 0, 1);
160*35238bceSAndroid Build Coastguard Worker expectError(GL_INVALID_ENUM);
161*35238bceSAndroid Build Coastguard Worker m_log << tcu::TestLog::EndSection;
162*35238bceSAndroid Build Coastguard Worker
163*35238bceSAndroid Build Coastguard Worker m_log << tcu::TestLog::Section("", "GL_INVALID_VALUE is generated if count is negative.");
164*35238bceSAndroid Build Coastguard Worker glDrawArrays(GL_POINTS, 0, -1);
165*35238bceSAndroid Build Coastguard Worker expectError(GL_INVALID_VALUE);
166*35238bceSAndroid Build Coastguard Worker m_log << tcu::TestLog::EndSection;
167*35238bceSAndroid Build Coastguard Worker
168*35238bceSAndroid Build Coastguard Worker m_log << tcu::TestLog::Section("", "GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound "
169*35238bceSAndroid Build Coastguard Worker "framebuffer is not framebuffer complete.");
170*35238bceSAndroid Build Coastguard Worker GLuint fbo;
171*35238bceSAndroid Build Coastguard Worker glGenFramebuffers(1, &fbo);
172*35238bceSAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fbo);
173*35238bceSAndroid Build Coastguard Worker glCheckFramebufferStatus(GL_FRAMEBUFFER);
174*35238bceSAndroid Build Coastguard Worker glDrawArrays(GL_POINTS, 0, 1);
175*35238bceSAndroid Build Coastguard Worker expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
176*35238bceSAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, 0);
177*35238bceSAndroid Build Coastguard Worker glDeleteFramebuffers(1, &fbo);
178*35238bceSAndroid Build Coastguard Worker m_log << tcu::TestLog::EndSection;
179*35238bceSAndroid Build Coastguard Worker });
180*35238bceSAndroid Build Coastguard Worker ES2F_ADD_API_CASE(draw_arrays_incomplete_primitive, "Invalid glDrawArrays() usage", {
181*35238bceSAndroid Build Coastguard Worker glu::ShaderProgram program(m_context.getRenderContext(),
182*35238bceSAndroid Build Coastguard Worker glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
183*35238bceSAndroid Build Coastguard Worker glUseProgram(program.getProgram());
184*35238bceSAndroid Build Coastguard Worker
185*35238bceSAndroid Build Coastguard Worker m_log << tcu::TestLog::Section("", "GL_INVALID_ENUM is generated if mode is not an accepted value.");
186*35238bceSAndroid Build Coastguard Worker glDrawArrays(-1, 0, 1);
187*35238bceSAndroid Build Coastguard Worker expectError(GL_INVALID_ENUM);
188*35238bceSAndroid Build Coastguard Worker m_log << tcu::TestLog::EndSection;
189*35238bceSAndroid Build Coastguard Worker
190*35238bceSAndroid Build Coastguard Worker m_log << tcu::TestLog::Section("", "GL_INVALID_VALUE is generated if count is negative.");
191*35238bceSAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, -1);
192*35238bceSAndroid Build Coastguard Worker expectError(GL_INVALID_VALUE);
193*35238bceSAndroid Build Coastguard Worker m_log << tcu::TestLog::EndSection;
194*35238bceSAndroid Build Coastguard Worker
195*35238bceSAndroid Build Coastguard Worker m_log << tcu::TestLog::Section("", "GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound "
196*35238bceSAndroid Build Coastguard Worker "framebuffer is not framebuffer complete.");
197*35238bceSAndroid Build Coastguard Worker GLuint fbo;
198*35238bceSAndroid Build Coastguard Worker glGenFramebuffers(1, &fbo);
199*35238bceSAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fbo);
200*35238bceSAndroid Build Coastguard Worker glCheckFramebufferStatus(GL_FRAMEBUFFER);
201*35238bceSAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 1);
202*35238bceSAndroid Build Coastguard Worker expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
203*35238bceSAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, 0);
204*35238bceSAndroid Build Coastguard Worker glDeleteFramebuffers(1, &fbo);
205*35238bceSAndroid Build Coastguard Worker m_log << tcu::TestLog::EndSection;
206*35238bceSAndroid Build Coastguard Worker
207*35238bceSAndroid Build Coastguard Worker glUseProgram(0);
208*35238bceSAndroid Build Coastguard Worker });
209*35238bceSAndroid Build Coastguard Worker ES2F_ADD_API_CASE(draw_elements, "Invalid glDrawElements() usage", {
210*35238bceSAndroid Build Coastguard Worker glu::ShaderProgram program(m_context.getRenderContext(),
211*35238bceSAndroid Build Coastguard Worker glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
212*35238bceSAndroid Build Coastguard Worker glUseProgram(program.getProgram());
213*35238bceSAndroid Build Coastguard Worker GLfloat vertices[1] = {0.0f};
214*35238bceSAndroid Build Coastguard Worker
215*35238bceSAndroid Build Coastguard Worker m_log << tcu::TestLog::Section("", "GL_INVALID_ENUM is generated if mode is not an accepted value.");
216*35238bceSAndroid Build Coastguard Worker glDrawElements(-1, 1, GL_UNSIGNED_BYTE, vertices);
217*35238bceSAndroid Build Coastguard Worker expectError(GL_INVALID_ENUM);
218*35238bceSAndroid Build Coastguard Worker m_log << tcu::TestLog::EndSection;
219*35238bceSAndroid Build Coastguard Worker
220*35238bceSAndroid Build Coastguard Worker m_log << tcu::TestLog::Section(
221*35238bceSAndroid Build Coastguard Worker "", "GL_INVALID_ENUM is generated if type is not GL_UNSIGNED_BYTE or GL_UNSIGNED_SHORT.");
222*35238bceSAndroid Build Coastguard Worker glDrawElements(GL_POINTS, 1, -1, vertices);
223*35238bceSAndroid Build Coastguard Worker expectError(GL_INVALID_ENUM);
224*35238bceSAndroid Build Coastguard Worker m_log << tcu::TestLog::EndSection;
225*35238bceSAndroid Build Coastguard Worker
226*35238bceSAndroid Build Coastguard Worker m_log << tcu::TestLog::Section("", "GL_INVALID_VALUE is generated if count is negative.");
227*35238bceSAndroid Build Coastguard Worker glDrawElements(GL_POINTS, -1, GL_UNSIGNED_BYTE, vertices);
228*35238bceSAndroid Build Coastguard Worker expectError(GL_INVALID_VALUE);
229*35238bceSAndroid Build Coastguard Worker m_log << tcu::TestLog::EndSection;
230*35238bceSAndroid Build Coastguard Worker
231*35238bceSAndroid Build Coastguard Worker m_log << tcu::TestLog::Section("", "GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound "
232*35238bceSAndroid Build Coastguard Worker "framebuffer is not framebuffer complete.");
233*35238bceSAndroid Build Coastguard Worker GLuint fbo;
234*35238bceSAndroid Build Coastguard Worker glGenFramebuffers(1, &fbo);
235*35238bceSAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fbo);
236*35238bceSAndroid Build Coastguard Worker glCheckFramebufferStatus(GL_FRAMEBUFFER);
237*35238bceSAndroid Build Coastguard Worker glDrawElements(GL_POINTS, 1, GL_UNSIGNED_BYTE, vertices);
238*35238bceSAndroid Build Coastguard Worker expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
239*35238bceSAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, 0);
240*35238bceSAndroid Build Coastguard Worker glDeleteFramebuffers(1, &fbo);
241*35238bceSAndroid Build Coastguard Worker m_log << tcu::TestLog::EndSection;
242*35238bceSAndroid Build Coastguard Worker
243*35238bceSAndroid Build Coastguard Worker glUseProgram(0);
244*35238bceSAndroid Build Coastguard Worker });
245*35238bceSAndroid Build Coastguard Worker ES2F_ADD_API_CASE(draw_elements_invalid_program, "Invalid glDrawElements() usage", {
246*35238bceSAndroid Build Coastguard Worker glUseProgram(0);
247*35238bceSAndroid Build Coastguard Worker GLfloat vertices[1] = {0.0f};
248*35238bceSAndroid Build Coastguard Worker
249*35238bceSAndroid Build Coastguard Worker m_log << tcu::TestLog::Section("", "GL_INVALID_ENUM is generated if mode is not an accepted value.");
250*35238bceSAndroid Build Coastguard Worker glDrawElements(-1, 1, GL_UNSIGNED_BYTE, vertices);
251*35238bceSAndroid Build Coastguard Worker expectError(GL_INVALID_ENUM);
252*35238bceSAndroid Build Coastguard Worker m_log << tcu::TestLog::EndSection;
253*35238bceSAndroid Build Coastguard Worker
254*35238bceSAndroid Build Coastguard Worker m_log << tcu::TestLog::Section(
255*35238bceSAndroid Build Coastguard Worker "", "GL_INVALID_ENUM is generated if type is not GL_UNSIGNED_BYTE or GL_UNSIGNED_SHORT.");
256*35238bceSAndroid Build Coastguard Worker glDrawElements(GL_POINTS, 1, -1, vertices);
257*35238bceSAndroid Build Coastguard Worker expectError(GL_INVALID_ENUM);
258*35238bceSAndroid Build Coastguard Worker m_log << tcu::TestLog::EndSection;
259*35238bceSAndroid Build Coastguard Worker
260*35238bceSAndroid Build Coastguard Worker m_log << tcu::TestLog::Section("", "GL_INVALID_VALUE is generated if count is negative.");
261*35238bceSAndroid Build Coastguard Worker glDrawElements(GL_POINTS, -1, GL_UNSIGNED_BYTE, vertices);
262*35238bceSAndroid Build Coastguard Worker expectError(GL_INVALID_VALUE);
263*35238bceSAndroid Build Coastguard Worker m_log << tcu::TestLog::EndSection;
264*35238bceSAndroid Build Coastguard Worker
265*35238bceSAndroid Build Coastguard Worker m_log << tcu::TestLog::Section("", "GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound "
266*35238bceSAndroid Build Coastguard Worker "framebuffer is not framebuffer complete.");
267*35238bceSAndroid Build Coastguard Worker GLuint fbo;
268*35238bceSAndroid Build Coastguard Worker glGenFramebuffers(1, &fbo);
269*35238bceSAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fbo);
270*35238bceSAndroid Build Coastguard Worker glCheckFramebufferStatus(GL_FRAMEBUFFER);
271*35238bceSAndroid Build Coastguard Worker glDrawElements(GL_POINTS, 1, GL_UNSIGNED_BYTE, vertices);
272*35238bceSAndroid Build Coastguard Worker expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
273*35238bceSAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, 0);
274*35238bceSAndroid Build Coastguard Worker glDeleteFramebuffers(1, &fbo);
275*35238bceSAndroid Build Coastguard Worker m_log << tcu::TestLog::EndSection;
276*35238bceSAndroid Build Coastguard Worker });
277*35238bceSAndroid Build Coastguard Worker ES2F_ADD_API_CASE(draw_elements_incomplete_primitive, "Invalid glDrawElements() usage", {
278*35238bceSAndroid Build Coastguard Worker glu::ShaderProgram program(m_context.getRenderContext(),
279*35238bceSAndroid Build Coastguard Worker glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
280*35238bceSAndroid Build Coastguard Worker glUseProgram(program.getProgram());
281*35238bceSAndroid Build Coastguard Worker GLfloat vertices[1] = {0.0f};
282*35238bceSAndroid Build Coastguard Worker
283*35238bceSAndroid Build Coastguard Worker m_log << tcu::TestLog::Section("", "GL_INVALID_ENUM is generated if mode is not an accepted value.");
284*35238bceSAndroid Build Coastguard Worker glDrawElements(-1, 1, GL_UNSIGNED_BYTE, vertices);
285*35238bceSAndroid Build Coastguard Worker expectError(GL_INVALID_ENUM);
286*35238bceSAndroid Build Coastguard Worker m_log << tcu::TestLog::EndSection;
287*35238bceSAndroid Build Coastguard Worker
288*35238bceSAndroid Build Coastguard Worker m_log << tcu::TestLog::Section(
289*35238bceSAndroid Build Coastguard Worker "", "GL_INVALID_ENUM is generated if type is not GL_UNSIGNED_BYTE or GL_UNSIGNED_SHORT.");
290*35238bceSAndroid Build Coastguard Worker glDrawElements(GL_TRIANGLES, 1, -1, vertices);
291*35238bceSAndroid Build Coastguard Worker expectError(GL_INVALID_ENUM);
292*35238bceSAndroid Build Coastguard Worker m_log << tcu::TestLog::EndSection;
293*35238bceSAndroid Build Coastguard Worker
294*35238bceSAndroid Build Coastguard Worker m_log << tcu::TestLog::Section("", "GL_INVALID_VALUE is generated if count is negative.");
295*35238bceSAndroid Build Coastguard Worker glDrawElements(GL_TRIANGLES, -1, GL_UNSIGNED_BYTE, vertices);
296*35238bceSAndroid Build Coastguard Worker expectError(GL_INVALID_VALUE);
297*35238bceSAndroid Build Coastguard Worker m_log << tcu::TestLog::EndSection;
298*35238bceSAndroid Build Coastguard Worker
299*35238bceSAndroid Build Coastguard Worker m_log << tcu::TestLog::Section("", "GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound "
300*35238bceSAndroid Build Coastguard Worker "framebuffer is not framebuffer complete.");
301*35238bceSAndroid Build Coastguard Worker GLuint fbo;
302*35238bceSAndroid Build Coastguard Worker glGenFramebuffers(1, &fbo);
303*35238bceSAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fbo);
304*35238bceSAndroid Build Coastguard Worker glCheckFramebufferStatus(GL_FRAMEBUFFER);
305*35238bceSAndroid Build Coastguard Worker glDrawElements(GL_TRIANGLES, 1, GL_UNSIGNED_BYTE, vertices);
306*35238bceSAndroid Build Coastguard Worker expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
307*35238bceSAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, 0);
308*35238bceSAndroid Build Coastguard Worker glDeleteFramebuffers(1, &fbo);
309*35238bceSAndroid Build Coastguard Worker m_log << tcu::TestLog::EndSection;
310*35238bceSAndroid Build Coastguard Worker
311*35238bceSAndroid Build Coastguard Worker glUseProgram(0);
312*35238bceSAndroid Build Coastguard Worker });
313*35238bceSAndroid Build Coastguard Worker }
314*35238bceSAndroid Build Coastguard Worker
315*35238bceSAndroid Build Coastguard Worker } // namespace Functional
316*35238bceSAndroid Build Coastguard Worker } // namespace gles2
317*35238bceSAndroid Build Coastguard Worker } // namespace deqp
318