1/*-------------------------------------------------------------------------
2 * drawElements Quality Program OpenGL ES 3.0 Module
3 * -------------------------------------------------
4 *
5 * Copyright 2014 The Android Open Source Project
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 *      http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 *
19 *//*!
20 * \file
21 * \brief Negative Fragment Pipe API tests.
22 *//*--------------------------------------------------------------------*/
23
24#include "es3fNegativeFragmentApiTests.hpp"
25#include "es3fApiCase.hpp"
26
27#include "glwDefs.hpp"
28#include "glwEnums.hpp"
29
30using namespace glw; // GL types
31
32namespace deqp
33{
34namespace gles3
35{
36namespace Functional
37{
38
39using tcu::TestLog;
40
41NegativeFragmentApiTests::NegativeFragmentApiTests (Context& context)
42	: TestCaseGroup(context, "fragment", "Negative Fragment API Cases")
43{
44}
45
46NegativeFragmentApiTests::~NegativeFragmentApiTests (void)
47{
48}
49
50void NegativeFragmentApiTests::init (void)
51{
52	ES3F_ADD_API_CASE(scissor, "Invalid glScissor() usage",
53		{
54			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if either width or height is negative.");
55			glScissor(0, 0, -1, 0);
56			expectError(GL_INVALID_VALUE);
57			glScissor(0, 0, 0, -1);
58			expectError(GL_INVALID_VALUE);
59			glScissor(0, 0, -1, -1);
60			expectError(GL_INVALID_VALUE);
61			m_log << TestLog::EndSection;
62		});
63	ES3F_ADD_API_CASE(depth_func, "Invalid glDepthFunc() usage",
64		{
65			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if func is not an accepted value.");
66			glDepthFunc(-1);
67			expectError(GL_INVALID_ENUM);
68			m_log << TestLog::EndSection;
69		});
70	ES3F_ADD_API_CASE(viewport, "Invalid glViewport() usage",
71		{
72			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if either width or height is negative.");
73			glViewport(0, 0, -1, 1);
74			expectError(GL_INVALID_VALUE);
75			glViewport(0, 0, 1, -1);
76			expectError(GL_INVALID_VALUE);
77			glViewport(0, 0, -1, -1);
78			expectError(GL_INVALID_VALUE);
79			m_log << TestLog::EndSection;
80		});
81
82	// Stencil functions
83
84	ES3F_ADD_API_CASE(stencil_func, "Invalid glStencilFunc() usage",
85		{
86			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if func is not one of the eight accepted values.");
87			glStencilFunc(-1, 0, 1);
88			expectError(GL_INVALID_ENUM);
89			m_log << TestLog::EndSection;
90		});
91	ES3F_ADD_API_CASE(stencil_func_separate, "Invalid glStencilFuncSeparate() usage",
92		{
93			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if face is not GL_FRONT, GL_BACK, or GL_FRONT_AND_BACK.");
94			glStencilFuncSeparate(-1, GL_NEVER, 0, 1);
95			expectError(GL_INVALID_ENUM);
96			m_log << TestLog::EndSection;
97
98			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if func is not one of the eight accepted values.");
99			glStencilFuncSeparate(GL_FRONT, -1, 0, 1);
100			expectError(GL_INVALID_ENUM);
101			m_log << TestLog::EndSection;
102		});
103	ES3F_ADD_API_CASE(stencil_op, "Invalid glStencilOp() usage",
104		{
105			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if sfail, dpfail, or dppass is any value other than the defined symbolic constant values.");
106			glStencilOp(-1, GL_ZERO, GL_REPLACE);
107			expectError(GL_INVALID_ENUM);
108			glStencilOp(GL_KEEP, -1, GL_REPLACE);
109			expectError(GL_INVALID_ENUM);
110			glStencilOp(GL_KEEP, GL_ZERO, -1);
111			expectError(GL_INVALID_ENUM);
112			m_log << TestLog::EndSection;
113		});
114	ES3F_ADD_API_CASE(stencil_op_separate, "Invalid glStencilOpSeparate() usage",
115		{
116			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if face is any value other than GL_FRONT, GL_BACK, or GL_FRONT_AND_BACK.");
117			glStencilOpSeparate(-1, GL_KEEP, GL_ZERO, GL_REPLACE);
118			expectError(GL_INVALID_ENUM);
119			m_log << TestLog::EndSection;
120
121			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if sfail, dpfail, or dppass is any value other than the eight defined symbolic constant values.");
122			glStencilOpSeparate(GL_FRONT, -1, GL_ZERO, GL_REPLACE);
123			expectError(GL_INVALID_ENUM);
124			glStencilOpSeparate(GL_FRONT, GL_KEEP, -1, GL_REPLACE);
125			expectError(GL_INVALID_ENUM);
126			glStencilOpSeparate(GL_FRONT, GL_KEEP, GL_ZERO, -1);
127			expectError(GL_INVALID_ENUM);
128			m_log << TestLog::EndSection;
129		});
130	ES3F_ADD_API_CASE(stencil_mask_separate, "Invalid glStencilMaskSeparate() usage",
131		{
132			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if face is not GL_FRONT, GL_BACK, or GL_FRONT_AND_BACK.");
133			glStencilMaskSeparate(-1, 0);
134			expectError(GL_INVALID_ENUM);
135			m_log << TestLog::EndSection;
136		});
137
138	// Blend functions
139
140	ES3F_ADD_API_CASE(blend_equation, "Invalid glBlendEquation() usage",
141		{
142			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if mode is not GL_FUNC_ADD, GL_FUNC_SUBTRACT, GL_FUNC_REVERSE_SUBTRACT, GL_MAX or GL_MIN.");
143			glBlendEquation(-1);
144			expectError(GL_INVALID_ENUM);
145			m_log << TestLog::EndSection;
146		});
147	ES3F_ADD_API_CASE(blend_equation_separate, "Invalid glBlendEquationSeparate() usage",
148		{
149			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if modeRGB is not GL_FUNC_ADD, GL_FUNC_SUBTRACT, GL_FUNC_REVERSE_SUBTRACT, GL_MAX or GL_MIN.");
150			glBlendEquationSeparate(-1, GL_FUNC_ADD);
151			expectError(GL_INVALID_ENUM);
152			m_log << TestLog::EndSection;
153			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if modeAlpha is not GL_FUNC_ADD, GL_FUNC_SUBTRACT, GL_FUNC_REVERSE_SUBTRACT, GL_MAX or GL_MIN.");
154			glBlendEquationSeparate(GL_FUNC_ADD, -1);
155			expectError(GL_INVALID_ENUM);
156			m_log << TestLog::EndSection;
157		});
158	ES3F_ADD_API_CASE(blend_func, "Invalid glBlendFunc() usage",
159		{
160			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if either sfactor or dfactor is not an accepted value.");
161			glBlendFunc(-1, GL_ONE);
162			expectError(GL_INVALID_ENUM);
163			glBlendFunc(GL_ONE, -1);
164			expectError(GL_INVALID_ENUM);
165			m_log << TestLog::EndSection;
166		});
167	ES3F_ADD_API_CASE(blend_func_separate, "Invalid glBlendFuncSeparate() usage",
168		{
169			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if srcRGB, dstRGB, srcAlpha, or dstAlpha is not an accepted value.");
170			glBlendFuncSeparate(-1, GL_ONE, GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR);
171			expectError(GL_INVALID_ENUM);
172			glBlendFuncSeparate(GL_ZERO, -1, GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR);
173			expectError(GL_INVALID_ENUM);
174			glBlendFuncSeparate(GL_ZERO, GL_ONE, -1, GL_ONE_MINUS_SRC_COLOR);
175			expectError(GL_INVALID_ENUM);
176			glBlendFuncSeparate(GL_ZERO, GL_ONE, GL_SRC_COLOR, -1);
177			expectError(GL_INVALID_ENUM);
178			m_log << TestLog::EndSection;
179		});
180
181	// Rasterization API functions
182
183	ES3F_ADD_API_CASE(cull_face, "Invalid glCullFace() usage",
184		{
185			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if mode is not an accepted value.");
186			glCullFace(-1);
187			expectError(GL_INVALID_ENUM);
188			m_log << TestLog::EndSection;
189		});
190	ES3F_ADD_API_CASE(front_face, "Invalid glFrontFace() usage",
191		{
192			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if mode is not an accepted value.");
193			glFrontFace(-1);
194			expectError(GL_INVALID_ENUM);
195			m_log << TestLog::EndSection;
196		});
197	ES3F_ADD_API_CASE(line_width, "Invalid glLineWidth() usage",
198		{
199			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if width is less than or equal to 0.");
200			glLineWidth(0);
201			expectError(GL_INVALID_VALUE);
202			glLineWidth(-1);
203			expectError(GL_INVALID_VALUE);
204			m_log << TestLog::EndSection;
205		});
206
207	// Asynchronous queries
208
209	ES3F_ADD_API_CASE(gen_queries, "Invalid glGenQueries() usage",
210		{
211			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if n is negative.");
212			GLuint ids;
213			glGenQueries	(-1, &ids);
214			expectError		(GL_INVALID_VALUE);
215			m_log << TestLog::EndSection;
216		});
217	ES3F_ADD_API_CASE(begin_query, "Invalid glBeginQuery() usage",
218		{
219			GLuint ids[3];
220			glGenQueries	(3, ids);
221
222			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if target is not one of the accepted tokens.");
223			glBeginQuery	(-1, ids[0]);
224			expectError		(GL_INVALID_ENUM);
225			m_log << TestLog::EndSection;
226
227			m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if glBeginQuery is executed while a query object of the same target is already active.");
228			glBeginQuery	(GL_ANY_SAMPLES_PASSED, ids[0]);
229			expectError		(GL_NO_ERROR);
230			glBeginQuery	(GL_ANY_SAMPLES_PASSED, ids[1]);
231			expectError		(GL_INVALID_OPERATION);
232			// \note GL_ANY_SAMPLES_PASSED and GL_ANY_SAMPLES_PASSED_CONSERVATIVE alias to the same target for the purposes of this error.
233			glBeginQuery	(GL_ANY_SAMPLES_PASSED_CONSERVATIVE, ids[1]);
234			expectError		(GL_INVALID_OPERATION);
235			glBeginQuery	(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN, ids[1]);
236			expectError		(GL_NO_ERROR);
237			glBeginQuery	(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN, ids[2]);
238			expectError		(GL_INVALID_OPERATION);
239			glEndQuery		(GL_ANY_SAMPLES_PASSED);
240			glEndQuery		(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN);
241			expectError		(GL_NO_ERROR);
242			m_log << TestLog::EndSection;
243
244			m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if id is 0.");
245			glBeginQuery	(GL_ANY_SAMPLES_PASSED, 0);
246			expectError		(GL_INVALID_OPERATION);
247			m_log << TestLog::EndSection;
248
249			m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if id not a name returned from a previous call to glGenQueries, or if such a name has since been deleted with glDeleteQueries.");
250			glBeginQuery	(GL_ANY_SAMPLES_PASSED, -1);
251			expectError		(GL_INVALID_OPERATION);
252			glDeleteQueries	(1, &ids[2]);
253			expectError		(GL_NO_ERROR);
254			glBeginQuery	(GL_ANY_SAMPLES_PASSED, ids[2]);
255			expectError		(GL_INVALID_OPERATION);
256			m_log << TestLog::EndSection;
257
258			m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if id is the name of an already active query object.");
259			glBeginQuery	(GL_ANY_SAMPLES_PASSED, ids[0]);
260			expectError		(GL_NO_ERROR);
261			glBeginQuery	(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN, ids[0]);
262			expectError		(GL_INVALID_OPERATION);
263			m_log << TestLog::EndSection;
264
265			m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if id refers to an existing query object whose type does not does not match target.");
266			glEndQuery		(GL_ANY_SAMPLES_PASSED);
267			expectError		(GL_NO_ERROR);
268			glBeginQuery	(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN, ids[0]);
269			expectError		(GL_INVALID_OPERATION);
270			m_log << TestLog::EndSection;
271
272			glDeleteQueries	(2, &ids[0]);
273			expectError		(GL_NO_ERROR);
274		});
275	ES3F_ADD_API_CASE(end_query, "Invalid glEndQuery() usage",
276		{
277			GLuint id;
278			glGenQueries	(1, &id);
279
280			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if target is not one of the accepted tokens.");
281			glEndQuery		(-1);
282			expectError		(GL_INVALID_ENUM);
283			m_log << TestLog::EndSection;
284
285			m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if glEndQuery is executed when a query object of the same target is not active.");
286			glEndQuery		(GL_ANY_SAMPLES_PASSED);
287			expectError		(GL_INVALID_OPERATION);
288			glBeginQuery	(GL_ANY_SAMPLES_PASSED, id);
289			expectError		(GL_NO_ERROR);
290			glEndQuery		(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN);
291			expectError		(GL_INVALID_OPERATION);
292			glEndQuery		(GL_ANY_SAMPLES_PASSED);
293			expectError		(GL_NO_ERROR);
294			m_log << TestLog::EndSection;
295
296			glDeleteQueries	(1, &id);
297			expectError		(GL_NO_ERROR);
298		});
299	ES3F_ADD_API_CASE(delete_queries, "Invalid glDeleteQueries() usage",
300		{
301			GLuint id;
302			glGenQueries	(1, &id);
303
304			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if n is negative.");
305			glDeleteQueries	(-1, &id);
306			expectError		(GL_INVALID_VALUE);
307			m_log << TestLog::EndSection;
308
309			glDeleteQueries	(1, &id);
310		});
311
312	// Sync objects
313
314	ES3F_ADD_API_CASE(fence_sync, "Invalid glFenceSync() usage",
315		{
316			m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if condition is not GL_SYNC_GPU_COMMANDS_COMPLETE.");
317			glFenceSync(-1, 0);
318			expectError(GL_INVALID_ENUM);
319			m_log << TestLog::EndSection;
320
321			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if flags is not zero.");
322			glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0x0010);
323			expectError(GL_INVALID_VALUE);
324			m_log << TestLog::EndSection;
325		});
326	ES3F_ADD_API_CASE(wait_sync, "Invalid glWaitSync() usage",
327		{
328			GLsync sync = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0);
329
330			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if sync is not the name of a sync object.");
331			glWaitSync(0, 0, GL_TIMEOUT_IGNORED);
332			expectError(GL_INVALID_VALUE);
333			m_log << TestLog::EndSection;
334
335			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if flags is not zero.");
336			glWaitSync(sync, 0x0010, GL_TIMEOUT_IGNORED);
337			expectError(GL_INVALID_VALUE);
338			m_log << TestLog::EndSection;
339
340			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if timeout is not GL_TIMEOUT_IGNORED.");
341			glWaitSync(sync, 0, 0);
342			expectError(GL_INVALID_VALUE);
343			m_log << TestLog::EndSection;
344
345			glDeleteSync(sync);
346		});
347	ES3F_ADD_API_CASE(client_wait_sync, "Invalid glClientWaitSync() usage",
348		{
349			GLsync sync = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0);
350
351			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if sync is not the name of an existing sync object.");
352			glClientWaitSync (0, 0, 10000);
353			expectError(GL_INVALID_VALUE);
354			m_log << TestLog::EndSection;
355
356			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if flags contains any unsupported flag.");
357			glClientWaitSync(sync, 0x00000004, 10000);
358			expectError(GL_INVALID_VALUE);
359			m_log << TestLog::EndSection;
360
361			glDeleteSync(sync);
362		});
363	ES3F_ADD_API_CASE(delete_sync, "Invalid glDeleteSync() usage",
364		{
365			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if sync is neither zero or the name of a sync object.");
366			glDeleteSync((GLsync)1);
367			expectError(GL_INVALID_VALUE);
368			glDeleteSync(0);
369			expectError(GL_NO_ERROR);
370			m_log << TestLog::EndSection;
371		});
372}
373
374
375} // Functional
376} // gles3
377} // deqp
378