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