1 /*-------------------------------------------------------------------------
2 * drawElements Quality Program OpenGL ES 3.0 Module
3 * -------------------------------------------------
5 * Copyright 2014 The Android Open Source Project
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
11 * http://www.apache.org/licenses/LICENSE-2.0
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.
21 * \brief Negative Fragment Pipe API tests.
22 *//*--------------------------------------------------------------------*/
24 goog.provide('functional.gles3.es3fNegativeFragmentApiTests');
25 goog.require('framework.common.tcuTestCase');
26 goog.require('functional.gles3.es3fApiCase');
28 goog.scope(function() {
30 var es3fNegativeFragmentApiTests = functional.gles3.es3fNegativeFragmentApiTests;
31 var es3fApiCase = functional.gles3.es3fApiCase;
32 var tcuTestCase = framework.common.tcuTestCase;
35 * @param {WebGL2RenderingContext} gl
37 es3fNegativeFragmentApiTests.init = function(gl) {
39 var testGroup = tcuTestCase.runner.testCases;
41 testGroup.addChild(new es3fApiCase.ApiCaseCallback('scissor', 'Invalid gl.scissor() usage', gl, function() {
42 bufferedLogToConsole('gl.INVALID_VALUE is generated if either width or height is negative.');
43 gl.scissor(0, 0, -1, 0);
44 this.expectError(gl.INVALID_VALUE);
45 gl.scissor(0, 0, 0, -1);
46 this.expectError(gl.INVALID_VALUE);
47 gl.scissor(0, 0, -1, -1);
48 this.expectError(gl.INVALID_VALUE);
52 testGroup.addChild(new es3fApiCase.ApiCaseCallback('depth_func', 'Invalid gl.depthFunc() usage', gl, function() {
53 bufferedLogToConsole('gl.INVALID_ENUM is generated if func is not an accepted value.');
55 this.expectError(gl.INVALID_ENUM);
59 testGroup.addChild(new es3fApiCase.ApiCaseCallback('viewport', 'Invalid gl.viewport() usage', gl, function() {
60 bufferedLogToConsole('gl.INVALID_VALUE is generated if either width or height is negative.');
61 gl.viewport(0, 0, -1, 1);
62 this.expectError(gl.INVALID_VALUE);
63 gl.viewport(0, 0, 1, -1);
64 this.expectError(gl.INVALID_VALUE);
65 gl.viewport(0, 0, -1, -1);
66 this.expectError(gl.INVALID_VALUE);
72 testGroup.addChild(new es3fApiCase.ApiCaseCallback('stencil_func', 'Invalid gl.stencilFunc() usage', gl, function() {
73 bufferedLogToConsole('gl.INVALID_ENUM is generated if func is not one of the eight accepted values.');
74 gl.stencilFunc(-1, 0, 1);
75 this.expectError(gl.INVALID_ENUM);
79 testGroup.addChild(new es3fApiCase.ApiCaseCallback('stencil_func_separate', 'Invalid gl.stencilFuncSeparate() usage', gl, function() {
80 bufferedLogToConsole('gl.INVALID_ENUM is generated if face is not gl.FRONT, gl.BACK, or gl.FRONT_AND_BACK.');
81 gl.stencilFuncSeparate(-1, gl.NEVER, 0, 1);
82 this.expectError(gl.INVALID_ENUM);
84 bufferedLogToConsole('gl.INVALID_ENUM is generated if func is not one of the eight accepted values.');
85 gl.stencilFuncSeparate(gl.FRONT, -1, 0, 1);
86 this.expectError(gl.INVALID_ENUM);
90 testGroup.addChild(new es3fApiCase.ApiCaseCallback('stencil_op', 'Invalid gl.stencilOp() usage', gl, function() {
91 bufferedLogToConsole('gl.INVALID_ENUM is generated if sfail, dpfail, or dppass is any value other than the defined symbolic constant values.');
92 gl.stencilOp(-1, gl.ZERO, gl.REPLACE);
93 this.expectError(gl.INVALID_ENUM);
94 gl.stencilOp(gl.KEEP, -1, gl.REPLACE);
95 this.expectError(gl.INVALID_ENUM);
96 gl.stencilOp(gl.KEEP, gl.ZERO, -1);
97 this.expectError(gl.INVALID_ENUM);
101 testGroup.addChild(new es3fApiCase.ApiCaseCallback('stencil_op_separate', 'Invalid gl.stencilOpSeparate() usage', gl, function() {
102 bufferedLogToConsole('gl.INVALID_ENUM is generated if face is any value other than gl.FRONT, gl.BACK, or gl.FRONT_AND_BACK.');
103 gl.stencilOpSeparate(-1, gl.KEEP, gl.ZERO, gl.REPLACE);
104 this.expectError(gl.INVALID_ENUM);
106 bufferedLogToConsole('gl.INVALID_ENUM is generated if sfail, dpfail, or dppass is any value other than the eight defined symbolic constant values.');
107 gl.stencilOpSeparate(gl.FRONT, -1, gl.ZERO, gl.REPLACE);
108 this.expectError(gl.INVALID_ENUM);
109 gl.stencilOpSeparate(gl.FRONT, gl.KEEP, -1, gl.REPLACE);
110 this.expectError(gl.INVALID_ENUM);
111 gl.stencilOpSeparate(gl.FRONT, gl.KEEP, gl.ZERO, -1);
112 this.expectError(gl.INVALID_ENUM);
116 testGroup.addChild(new es3fApiCase.ApiCaseCallback('stencil_mask_separate', 'Invalid gl.stencilMaskSeparate() usage', gl, function() {
117 bufferedLogToConsole('gl.INVALID_ENUM is generated if face is not gl.FRONT, gl.BACK, or gl.FRONT_AND_BACK.');
118 gl.stencilMaskSeparate(-1, 0);
119 this.expectError(gl.INVALID_ENUM);
125 testGroup.addChild(new es3fApiCase.ApiCaseCallback('blend_equation', 'Invalid gl.blendEquation() usage', gl, function() {
126 bufferedLogToConsole('gl.INVALID_ENUM is generated if mode is not gl.FUNC_ADD, gl.FUNC_SUBTRACT, gl.FUNC_REVERSE_SUBTRACT, gl.MAX or gl.MIN.');
127 gl.blendEquation(-1);
128 this.expectError(gl.INVALID_ENUM);
132 testGroup.addChild(new es3fApiCase.ApiCaseCallback('blend_equation_separate', 'Invalid gl.blendEquationSeparate() usage', gl, function() {
133 bufferedLogToConsole('gl.INVALID_ENUM is generated if modeRGB is not gl.FUNC_ADD, gl.FUNC_SUBTRACT, gl.FUNC_REVERSE_SUBTRACT, gl.MAX or gl.MIN.');
134 gl.blendEquationSeparate(-1, gl.FUNC_ADD);
135 this.expectError(gl.INVALID_ENUM);
137 bufferedLogToConsole('gl.INVALID_ENUM is generated if modeAlpha is not gl.FUNC_ADD, gl.FUNC_SUBTRACT, gl.FUNC_REVERSE_SUBTRACT, gl.MAX or gl.MIN.');
138 gl.blendEquationSeparate(gl.FUNC_ADD, -1);
139 this.expectError(gl.INVALID_ENUM);
143 testGroup.addChild(new es3fApiCase.ApiCaseCallback('blend_func', 'Invalid gl.blendFunc() usage', gl, function() {
144 bufferedLogToConsole('gl.INVALID_ENUM is generated if either sfactor or dfactor is not an accepted value.');
145 gl.blendFunc(-1, gl.ONE);
146 this.expectError(gl.INVALID_ENUM);
147 gl.blendFunc(gl.ONE, -1);
148 this.expectError(gl.INVALID_ENUM);
152 testGroup.addChild(new es3fApiCase.ApiCaseCallback('blend_func_separate', 'Invalid gl.blendFuncSeparate() usage', gl, function() {
153 bufferedLogToConsole('gl.INVALID_ENUM is generated if srcRGB, dstRGB, srcAlpha, or dstAlpha is not an accepted value.');
154 gl.blendFuncSeparate(-1, gl.ONE, gl.SRC_COLOR, gl.ONE_MINUS_SRC_COLOR);
155 this.expectError(gl.INVALID_ENUM);
156 gl.blendFuncSeparate(gl.ZERO, -1, gl.SRC_COLOR, gl.ONE_MINUS_SRC_COLOR);
157 this.expectError(gl.INVALID_ENUM);
158 gl.blendFuncSeparate(gl.ZERO, gl.ONE, -1, gl.ONE_MINUS_SRC_COLOR);
159 this.expectError(gl.INVALID_ENUM);
160 gl.blendFuncSeparate(gl.ZERO, gl.ONE, gl.SRC_COLOR, -1);
161 this.expectError(gl.INVALID_ENUM);
165 // Rasterization API functions
167 testGroup.addChild(new es3fApiCase.ApiCaseCallback('cull_face', 'Invalid gl.cullFace() usage', gl, function() {
168 bufferedLogToConsole('gl.INVALID_ENUM is generated if mode is not an accepted value.');
170 this.expectError(gl.INVALID_ENUM);
174 testGroup.addChild(new es3fApiCase.ApiCaseCallback('front_face', 'Invalid gl.frontFace() usage', gl, function() {
175 bufferedLogToConsole('gl.INVALID_ENUM is generated if mode is not an accepted value.');
177 this.expectError(gl.INVALID_ENUM);
181 testGroup.addChild(new es3fApiCase.ApiCaseCallback('line_width', 'Invalid gl.lineWidth() usage', gl, function() {
182 bufferedLogToConsole('gl.INVALID_VALUE is generated if width is less than or equal to 0.');
184 this.expectError(gl.INVALID_VALUE);
186 this.expectError(gl.INVALID_VALUE);
190 testGroup.addChild(new es3fApiCase.ApiCaseCallback('begin_query', 'Invalid gl.beginQuery() usage', gl, function() {
191 /** @type{Array<WebGLQuery>} */ var ids = [];
192 ids[0] = gl.createQuery();
193 ids[1] = gl.createQuery();
194 ids[2] = gl.createQuery();
196 bufferedLogToConsole('gl.INVALID_ENUM is generated if target is not one of the accepted tokens.');
197 gl.beginQuery(-1, ids[0]);
198 this.expectError(gl.INVALID_ENUM);
200 bufferedLogToConsole('gl.INVALID_OPERATION is generated if gl.beginQuery is executed while a query object of the same target is already active.');
201 gl.beginQuery(gl.ANY_SAMPLES_PASSED, ids[0]);
202 this.expectError(gl.NO_ERROR);
203 gl.beginQuery(gl.ANY_SAMPLES_PASSED, ids[1]);
204 this.expectError(gl.INVALID_OPERATION);
205 // \note gl.ANY_SAMPLES_PASSED and gl.ANY_SAMPLES_PASSED_CONSERVATIVE alias to the same target for the purposes of this error.
206 gl.beginQuery(gl.ANY_SAMPLES_PASSED_CONSERVATIVE, ids[1]);
207 this.expectError(gl.INVALID_OPERATION);
208 gl.beginQuery(gl.TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN, ids[1]);
209 this.expectError(gl.NO_ERROR);
210 gl.beginQuery(gl.TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN, ids[2]);
211 this.expectError(gl.INVALID_OPERATION);
212 gl.endQuery(gl.ANY_SAMPLES_PASSED);
213 gl.endQuery(gl.TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN);
214 this.expectError(gl.NO_ERROR);
216 bufferedLogToConsole('An exception is thrown if the name is null.');
217 this.expectThrowNoError(function() {
218 gl.beginQuery(gl.ANY_SAMPLES_PASSED, null);
221 bufferedLogToConsole('gl.INVALID_OPERATION is generated if the name has since been deleted with gl.deleteQuery.');
222 gl.deleteQuery(ids[2]);
223 this.expectError(gl.NO_ERROR);
224 gl.beginQuery(gl.ANY_SAMPLES_PASSED, ids[2]);
225 this.expectError(gl.INVALID_OPERATION);
227 bufferedLogToConsole('gl.INVALID_OPERATION is generated if id is the name of an already active query object.');
228 gl.beginQuery(gl.ANY_SAMPLES_PASSED, ids[0]);
229 this.expectError(gl.NO_ERROR);
230 gl.beginQuery(gl.TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN, ids[0]);
231 this.expectError(gl.INVALID_OPERATION);
233 bufferedLogToConsole('gl.INVALID_OPERATION is generated if id refers to an existing query object whose type does not does not match target.');
234 gl.endQuery(gl.ANY_SAMPLES_PASSED);
235 this.expectError(gl.NO_ERROR);
236 gl.beginQuery(gl.TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN, ids[0]);
237 this.expectError(gl.INVALID_OPERATION);
239 gl.deleteQuery(ids[0]);
240 gl.deleteQuery(ids[1]);
241 gl.deleteQuery(ids[2]);
242 this.expectError(gl.NO_ERROR);
245 testGroup.addChild(new es3fApiCase.ApiCaseCallback('end_query', 'Invalid gl.endQuery() usage', gl, function() {
246 /** @type{WebGLQuery} */ var id;
247 id = gl.createQuery();
249 bufferedLogToConsole('gl.INVALID_ENUM is generated if target is not one of the accepted tokens.');
251 this.expectError(gl.INVALID_ENUM);
253 bufferedLogToConsole('gl.INVALID_OPERATION is generated if gl.endQuery is executed when a query object of the same target is not active.');
254 gl.endQuery(gl.ANY_SAMPLES_PASSED);
255 this.expectError(gl.INVALID_OPERATION);
256 gl.beginQuery(gl.ANY_SAMPLES_PASSED, id);
257 this.expectError(gl.NO_ERROR);
258 gl.endQuery(gl.TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN);
259 this.expectError(gl.INVALID_OPERATION);
260 gl.endQuery(gl.ANY_SAMPLES_PASSED);
261 this.expectError(gl.NO_ERROR);
264 this.expectError(gl.NO_ERROR);
269 testGroup.addChild(new es3fApiCase.ApiCaseCallback('fence_sync', 'Invalid gl.fenceSync() usage', gl, function() {
270 bufferedLogToConsole('gl.INVALID_ENUM is generated if condition is not gl.SYNC_GPU_COMMANDS_COMPLETE.');
272 this.expectError(gl.INVALID_ENUM);
274 bufferedLogToConsole('gl.INVALID_VALUE is generated if flags is not zero.');
275 gl.fenceSync(gl.SYNC_GPU_COMMANDS_COMPLETE, 0x0010);
276 this.expectError(gl.INVALID_VALUE);
280 testGroup.addChild(new es3fApiCase.ApiCaseCallback('wait_sync', 'Invalid gl.waitSync() usage', gl, function() {
281 /** @type{WebGLSync} */ var sync = gl.fenceSync(gl.SYNC_GPU_COMMANDS_COMPLETE, 0);
283 bufferedLogToConsole('An exception is thrown if sync is null.');
284 this.expectThrowNoError(function() {
285 gl.waitSync(null, 0, gl.TIMEOUT_IGNORED);
288 bufferedLogToConsole('gl.INVALID_VALUE is generated if flags is not zero.');
289 gl.waitSync(sync, 0x0010, gl.TIMEOUT_IGNORED);
290 this.expectError(gl.INVALID_VALUE);
292 bufferedLogToConsole('gl.INVALID_VALUE is generated if timeout is not gl.TIMEOUT_IGNORED.');
293 gl.waitSync(sync, 0, 0);
294 this.expectError(gl.INVALID_VALUE);
299 testGroup.addChild(new es3fApiCase.ApiCaseCallback('client_wait_sync', 'Invalid gl.clientWaitSync() usage', gl, function() {
300 /** @type{WebGLSync} */ var sync = gl.fenceSync(gl.SYNC_GPU_COMMANDS_COMPLETE, 0);
302 bufferedLogToConsole('An exception is thrown if sync is null.');
303 this.expectThrowNoError(function() {
304 gl.clientWaitSync (null, 0, 0);
307 bufferedLogToConsole('gl.INVALID_VALUE is generated if flags contains any unsupported flag.');
308 gl.clientWaitSync(sync, 0x00000004, 0);
309 this.expectError(gl.INVALID_VALUE);
317 * @param {WebGL2RenderingContext} gl
319 es3fNegativeFragmentApiTests.run = function(gl) {
320 var testName = 'negativeFragmentApi';
321 var testDescription = 'Negative Fragment API tests';
322 var state = tcuTestCase.runner;
324 state.testName = testName;
325 state.testCases = tcuTestCase.newTest(testName, testDescription, null);
327 //Set up name and description of this test series.
328 setCurrentTestName(testName);
329 description(testDescription);
331 es3fNegativeFragmentApiTests.init(gl);
332 tcuTestCase.runner.runCallback(tcuTestCase.runTestCases);
334 bufferedLogToConsole(err);
335 tcuTestCase.runner.terminate();