Backed out changeset 7272b7396c78 (bug 1932758) for causing fenix debug failures...
[gecko.git] / dom / canvas / test / webgl-conf / checkout / deqp / functional / gles3 / es3fNegativeFragmentApiTests.js
blobc3675d436f7198d3b510cd50c3da958fb5095aab
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 'use strict';
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;
34     /**
35      * @param {WebGL2RenderingContext} gl
36      */
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);
50         }));
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.');
54             gl.depthFunc(-1);
55             this.expectError(gl.INVALID_ENUM);
57         }));
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);
68         }));
70         // Stencil functions
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);
77         }));
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);
88         }));
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);
99         }));
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);
114         }));
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);
121         }));
123         // Blend functions
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);
130         }));
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);
141         }));
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);
150         }));
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);
163         }));
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.');
169             gl.cullFace(-1);
170             this.expectError(gl.INVALID_ENUM);
172         }));
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.');
176             gl.frontFace(-1);
177             this.expectError(gl.INVALID_ENUM);
179         }));
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.');
183             gl.lineWidth(0);
184             this.expectError(gl.INVALID_VALUE);
185             gl.lineWidth(-1);
186             this.expectError(gl.INVALID_VALUE);
188         }));
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);
219             });
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);
243         }));
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.');
250             gl.endQuery(-1);
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);
263             gl.deleteQuery(id);
264             this.expectError(gl.NO_ERROR);
265         }));
267         // Sync objects
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.');
271             gl.fenceSync(-1, 0);
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);
278         }));
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);
286             });
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);
296             gl.deleteSync(sync);
297         }));
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);
305             });
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);
311             gl.deleteSync(sync);
312         }));
314     };
316     /**
317      * @param {WebGL2RenderingContext} gl
318      */
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);
330         try {
331             es3fNegativeFragmentApiTests.init(gl);
332             tcuTestCase.runner.runCallback(tcuTestCase.runTestCases);
333         } catch (err) {
334             bufferedLogToConsole(err);
335             tcuTestCase.runner.terminate();
336         }
337     };