summaryrefslogtreecommitdiffstats
path: root/dom/canvas/test/webgl-conf/checkout/deqp/functional/gles3/es3fNegativeVertexArrayApiTests.js
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--dom/canvas/test/webgl-conf/checkout/deqp/functional/gles3/es3fNegativeVertexArrayApiTests.js906
1 files changed, 906 insertions, 0 deletions
diff --git a/dom/canvas/test/webgl-conf/checkout/deqp/functional/gles3/es3fNegativeVertexArrayApiTests.js b/dom/canvas/test/webgl-conf/checkout/deqp/functional/gles3/es3fNegativeVertexArrayApiTests.js
new file mode 100644
index 0000000000..d921a6f52b
--- /dev/null
+++ b/dom/canvas/test/webgl-conf/checkout/deqp/functional/gles3/es3fNegativeVertexArrayApiTests.js
@@ -0,0 +1,906 @@
+/*-------------------------------------------------------------------------
+ * drawElements Quality Program OpenGL ES 3.0 Module
+ * -------------------------------------------------
+ *
+ * Copyright 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the 'License');
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an 'AS IS' BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *//*!
+ * \file
+ * \brief Negative Vertex Array API tests.
+ *//*--------------------------------------------------------------------*/
+'use strict';
+goog.provide('functional.gles3.es3fNegativeVertexArrayApiTests');
+
+goog.require('framework.common.tcuTestCase');
+goog.require('framework.common.tcuTexture');
+goog.require('functional.gles3.es3fApiCase');
+goog.require('framework.opengl.gluShaderProgram');
+goog.require('framework.opengl.simplereference.sglrGLContext');
+
+goog.scope(function() {
+
+ var es3fNegativeVertexArrayApiTests = functional.gles3.es3fNegativeVertexArrayApiTests;
+ var tcuTexture = framework.common.tcuTexture;
+ var es3fApiCase = functional.gles3.es3fApiCase;
+ var tcuTestCase = framework.common.tcuTestCase;
+ var gluShaderProgram = framework.opengl.gluShaderProgram;
+ var sglrGLContext = framework.opengl.simplereference.sglrGLContext;
+
+ /**
+ * @type {string}
+ * @const
+ */
+ var vertexShaderSource = '#version 300 es\n' +
+ 'void main (void)\n' +
+ '{\n' +
+ ' gl_Position = vec4(0.0);\n' +
+ '}\n';
+
+ /**
+ * @type {string}
+ * @const
+ */
+ var fragmentShaderSource = '#version 300 es\n' +
+ 'layout(location = 0) out mediump vec4 fragColor;\n' +
+ 'void main (void)\n' +
+ '{\n' +
+ ' fragColor = vec4(0.0);\n' +
+ '}\n';
+
+ /**
+ * @param {WebGL2RenderingContext} gl
+ */
+ es3fNegativeVertexArrayApiTests.init = function(gl) {
+
+ var testGroup = tcuTestCase.runner.testCases;
+
+ testGroup.addChild(new es3fApiCase.ApiCaseCallback('vertex_attribf', 'Invalid glVertexAttrib{1234}f() usage', gl, function() {
+ bufferedLogToConsole('gl.INVALID_VALUE is generated if index is greater than or equal to gl.MAX_VERTEX_ATTRIBS.');
+ var maxVertexAttribs = /** @type{number} */ (gl.getParameter(gl.MAX_VERTEX_ATTRIBS));
+ gl.vertexAttrib1f(maxVertexAttribs, 0.0);
+ this.expectError(gl.INVALID_VALUE);
+ gl.vertexAttrib2f(maxVertexAttribs, 0.0, 0.0);
+ this.expectError(gl.INVALID_VALUE);
+ gl.vertexAttrib3f(maxVertexAttribs, 0.0, 0.0, 0.0);
+ this.expectError(gl.INVALID_VALUE);
+ gl.vertexAttrib4f(maxVertexAttribs, 0.0, 0.0, 0.0, 0.0);
+ this.expectError(gl.INVALID_VALUE);
+
+ }));
+
+ testGroup.addChild(new es3fApiCase.ApiCaseCallback('vertex_attribfv', 'Invalid glVertexAttrib{1234}fv() usage', gl, function() {
+ bufferedLogToConsole('gl.INVALID_VALUE is generated if index is greater than or equal to gl.MAX_VERTEX_ATTRIBS.');
+ var maxVertexAttribs = /** @type{number} */ (gl.getParameter(gl.MAX_VERTEX_ATTRIBS));
+ /** @type{Array<number>} */ var v = [0.0];
+ gl.vertexAttrib1fv(maxVertexAttribs, v);
+ this.expectError(gl.INVALID_VALUE);
+ gl.vertexAttrib2fv(maxVertexAttribs, v);
+ this.expectError(gl.INVALID_VALUE);
+ gl.vertexAttrib3fv(maxVertexAttribs, v);
+ this.expectError(gl.INVALID_VALUE);
+ gl.vertexAttrib4fv(maxVertexAttribs, v);
+ this.expectError(gl.INVALID_VALUE);
+
+ }));
+
+ testGroup.addChild(new es3fApiCase.ApiCaseCallback('vertex_attribi4', 'Invalid glVertexAttribI4{i|ui}f() usage', gl, function() {
+ var maxVertexAttribs = /** @type{number} */ (gl.getParameter(gl.MAX_VERTEX_ATTRIBS));
+ /** @type{number} */ var valInt = 0;
+ /** @type{number} */ var valUint = 0;
+
+ bufferedLogToConsole('gl.INVALID_VALUE is generated if index is greater than or equal to gl.MAX_VERTEX_ATTRIBS.');
+ gl.vertexAttribI4i(maxVertexAttribs, valInt, valInt, valInt, valInt);
+ this.expectError(gl.INVALID_VALUE);
+ gl.vertexAttribI4ui(maxVertexAttribs, valUint, valUint, valUint, valUint);
+ this.expectError(gl.INVALID_VALUE);
+
+ }));
+
+ testGroup.addChild(new es3fApiCase.ApiCaseCallback('vertex_attribi4v', 'Invalid glVertexAttribI4{i|ui}fv() usage', gl, function() {
+ var maxVertexAttribs = /** @type{number} */ (gl.getParameter(gl.MAX_VERTEX_ATTRIBS));
+ /** @type{Array<number>} */ var valInt = [0];
+ /** @type{Array<number>} */ var valUint = [0];
+
+ bufferedLogToConsole('gl.INVALID_VALUE is generated if index is greater than or equal to gl.MAX_VERTEX_ATTRIBS.');
+ gl.vertexAttribI4iv(maxVertexAttribs, valInt);
+ this.expectError(gl.INVALID_VALUE);
+ gl.vertexAttribI4uiv(maxVertexAttribs, valUint);
+ this.expectError(gl.INVALID_VALUE);
+
+ }));
+
+ testGroup.addChild(new es3fApiCase.ApiCaseCallback('vertex_attrib_pointer', 'Invalid gl.vertexAttribPointer() usage', gl, function() {
+ /** @type{WebGLBuffer} */ var buffer = gl.createBuffer();
+ gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
+
+ bufferedLogToConsole('gl.INVALID_ENUM is generated if type is not an accepted value.');
+ gl.vertexAttribPointer(0, 1, 0, true, 0, 0);
+ this.expectError(gl.INVALID_ENUM);
+
+ bufferedLogToConsole('gl.INVALID_VALUE is generated if index is greater than or equal to gl.MAX_VERTEX_ATTRIBS.');
+ var maxVertexAttribs = /** @type{number} */ (gl.getParameter(gl.MAX_VERTEX_ATTRIBS));
+ gl.vertexAttribPointer(maxVertexAttribs, 1, gl.BYTE, true, 0, 0);
+ this.expectError(gl.INVALID_VALUE);
+
+ bufferedLogToConsole('gl.INVALID_VALUE is generated if size is not 1, 2, 3, or 4.');
+ gl.vertexAttribPointer(0, 0, gl.BYTE, true, 0, 0);
+ this.expectError(gl.INVALID_VALUE);
+
+ bufferedLogToConsole('gl.INVALID_VALUE is generated if stride is negative.');
+ gl.vertexAttribPointer(0, 1, gl.BYTE, true, -1, 0);
+ this.expectError(gl.INVALID_VALUE);
+
+ bufferedLogToConsole('gl.INVALID_OPERATION is generated if type is gl.INT_2_10_10_10_REV or gl.UNSIGNED_INT_2_10_10_10_REV and size is not 4.');
+ gl.vertexAttribPointer(0, 2, gl.INT_2_10_10_10_REV, true, 0, 0);
+ this.expectError(gl.INVALID_OPERATION);
+ gl.vertexAttribPointer(0, 2, gl.UNSIGNED_INT_2_10_10_10_REV, true, 0, 0);
+ this.expectError(gl.INVALID_OPERATION);
+ gl.vertexAttribPointer(0, 4, gl.INT_2_10_10_10_REV, true, 0, 0);
+ this.expectError(gl.NO_ERROR);
+ gl.vertexAttribPointer(0, 4, gl.UNSIGNED_INT_2_10_10_10_REV, true, 0, 0);
+ this.expectError(gl.NO_ERROR);
+
+ bufferedLogToConsole('gl.INVALID_OPERATION is generated a non-zero vertex array object is bound, zero is bound to the gl.ARRAY_BUFFER buffer object binding point and the pointer argument is not NULL.');
+ /** @type{WebGLVertexArrayObject} */ var vao;
+ /** @type{number} */ var offset = 1;
+ vao = gl.createVertexArray();
+ gl.bindVertexArray(vao);
+ gl.bindBuffer(gl.ARRAY_BUFFER, null);
+ this.expectError(gl.NO_ERROR);
+
+ gl.vertexAttribPointer(0, 1, gl.BYTE, true, 0, offset);
+ this.expectError(gl.INVALID_OPERATION);
+
+ gl.bindVertexArray(null);
+ gl.deleteVertexArray(vao);
+ this.expectError(gl.NO_ERROR);
+
+ }));
+
+ testGroup.addChild(new es3fApiCase.ApiCaseCallback('vertex_attrib_i_pointer', 'Invalid gl.vertexAttribIPointer() usage', gl, function() {
+ /** @type{WebGLBuffer} */ var buffer = gl.createBuffer();
+ gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
+
+ bufferedLogToConsole('gl.INVALID_ENUM is generated if type is not an accepted value.');
+ gl.vertexAttribIPointer(0, 1, 0, 0, 0);
+ this.expectError(gl.INVALID_ENUM);
+ gl.vertexAttribIPointer(0, 4, gl.INT_2_10_10_10_REV, 0, 0);
+ this.expectError(gl.INVALID_ENUM);
+ gl.vertexAttribIPointer(0, 4, gl.UNSIGNED_INT_2_10_10_10_REV, 0, 0);
+ this.expectError(gl.INVALID_ENUM);
+
+ bufferedLogToConsole('gl.INVALID_VALUE is generated if index is greater than or equal to gl.MAX_VERTEX_ATTRIBS.');
+ var maxVertexAttribs = /** @type{number} */ (gl.getParameter(gl.MAX_VERTEX_ATTRIBS));
+ gl.vertexAttribIPointer(maxVertexAttribs, 1, gl.BYTE, 0, 0);
+ this.expectError(gl.INVALID_VALUE);
+
+ bufferedLogToConsole('gl.INVALID_VALUE is generated if size is not 1, 2, 3, or 4.');
+ gl.vertexAttribIPointer(0, 0, gl.BYTE, 0, 0);
+ this.expectError(gl.INVALID_VALUE);
+
+ bufferedLogToConsole('gl.INVALID_VALUE is generated if stride is negative.');
+ gl.vertexAttribIPointer(0, 1, gl.BYTE, -1, 0);
+ this.expectError(gl.INVALID_VALUE);
+
+ bufferedLogToConsole('gl.INVALID_OPERATION is generated a non-zero vertex array object is bound, zero is bound to the gl.ARRAY_BUFFER buffer object binding point and the pointer argument is not NULL.');
+ /** @type{WebGLVertexArrayObject} */ var vao;
+ /** @type{number} */ var offset = 1;
+ vao = gl.createVertexArray();
+ gl.bindVertexArray(vao);
+ gl.bindBuffer(gl.ARRAY_BUFFER, null);
+ this.expectError(gl.NO_ERROR);
+
+ gl.vertexAttribIPointer(0, 1, gl.BYTE, 0, offset);
+ this.expectError(gl.INVALID_OPERATION);
+
+ gl.bindVertexArray(null);
+ gl.deleteVertexArray(vao);
+ this.expectError(gl.NO_ERROR);
+
+ }));
+
+ testGroup.addChild(new es3fApiCase.ApiCaseCallback('enable_vertex_attrib_array', 'Invalid gl.enableVertexAttribArray() usage', gl, function() {
+ bufferedLogToConsole('gl.INVALID_VALUE is generated if index is greater than or equal to gl.MAX_VERTEX_ATTRIBS.');
+ var maxVertexAttribs = /** @type{number} */ (gl.getParameter(gl.MAX_VERTEX_ATTRIBS));
+ gl.enableVertexAttribArray(maxVertexAttribs);
+ this.expectError(gl.INVALID_VALUE);
+
+ }));
+
+ testGroup.addChild(new es3fApiCase.ApiCaseCallback('disable_vertex_attrib_array', 'Invalid gl.disableVertexAttribArray() usage', gl, function() {
+ bufferedLogToConsole('gl.INVALID_VALUE is generated if index is greater than or equal to gl.MAX_VERTEX_ATTRIBS.');
+ var maxVertexAttribs = /** @type{number} */ (gl.getParameter(gl.MAX_VERTEX_ATTRIBS));
+ gl.disableVertexAttribArray(maxVertexAttribs);
+ this.expectError(gl.INVALID_VALUE);
+
+ }));
+
+ testGroup.addChild(new es3fApiCase.ApiCaseCallback('vertex_attrib_divisor', 'Invalid gl.vertexAttribDivisor() usage', gl, function() {
+ bufferedLogToConsole('gl.INVALID_VALUE is generated if index is greater than or equal to gl.MAX_VERTEX_ATTRIBS.');
+ var maxVertexAttribs = /** @type{number} */ (gl.getParameter(gl.MAX_VERTEX_ATTRIBS));
+ gl.vertexAttribDivisor(maxVertexAttribs, 0);
+ this.expectError(gl.INVALID_VALUE);
+
+ }));
+
+ testGroup.addChild(new es3fApiCase.ApiCaseCallback('draw_arrays', 'Invalid gl.drawArrays() usage', gl, function() {
+ /** @type{gluShaderProgram.ShaderProgram} */ var program = new gluShaderProgram.ShaderProgram(gl,gluShaderProgram.makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
+ gl.useProgram(program.getProgram());
+ /** @type{WebGLFramebuffer} */ var fbo;
+
+ bufferedLogToConsole('gl.INVALID_ENUM is generated if mode is not an accepted value.');
+ gl.drawArrays(-1, 0, 1);
+ this.expectError(gl.INVALID_ENUM);
+
+ bufferedLogToConsole('gl.INVALID_VALUE is generated if count is negative.');
+ gl.drawArrays(gl.POINTS, 0, -1);
+ this.expectError(gl.INVALID_VALUE);
+
+ bufferedLogToConsole('gl.INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.');
+ fbo = gl.createFramebuffer();
+ gl.bindFramebuffer(gl.FRAMEBUFFER, fbo);
+ gl.checkFramebufferStatus(gl.FRAMEBUFFER);
+ gl.drawArrays(gl.POINTS, 0, 1);
+ this.expectError(gl.INVALID_FRAMEBUFFER_OPERATION);
+ gl.bindFramebuffer(gl.FRAMEBUFFER, null);
+ gl.deleteFramebuffer(fbo);
+
+ gl.useProgram(null);
+ }));
+
+ testGroup.addChild(new es3fApiCase.ApiCaseCallback('draw_arrays_invalid_program', 'Invalid gl.drawArrays() usage', gl, function() {
+ gl.useProgram(null);
+
+ bufferedLogToConsole('gl.INVALID_OPERATION is generated if gl.useProgram(null) is used.');
+ gl.drawArrays(gl.POINTS, 0, 1);
+ this.expectError(gl.INVALID_OPERATION);
+
+ }));
+
+ testGroup.addChild(new es3fApiCase.ApiCaseCallback('draw_arrays_incomplete_primitive', 'Invalid gl.drawArrays() usage', gl, function() {
+ /** @type{gluShaderProgram.ShaderProgram} */ var program = new gluShaderProgram.ShaderProgram(gl,gluShaderProgram.makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
+ gl.useProgram(program.getProgram());
+ /** @type{WebGLFramebuffer} */ var fbo;
+
+ bufferedLogToConsole('gl.INVALID_ENUM is generated if mode is not an accepted value.');
+ gl.drawArrays(-1, 0, 1);
+ this.expectError(gl.INVALID_ENUM);
+
+ bufferedLogToConsole('gl.INVALID_VALUE is generated if count is negative.');
+ gl.drawArrays(gl.TRIANGLES, 0, -1);
+ this.expectError(gl.INVALID_VALUE);
+
+ bufferedLogToConsole('gl.INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.');
+ fbo = gl.createFramebuffer();
+ gl.bindFramebuffer(gl.FRAMEBUFFER, fbo);
+ gl.checkFramebufferStatus(gl.FRAMEBUFFER);
+ gl.drawArrays(gl.TRIANGLES, 0, 1);
+ this.expectError(gl.INVALID_FRAMEBUFFER_OPERATION);
+ gl.bindFramebuffer(gl.FRAMEBUFFER, null);
+ gl.deleteFramebuffer(fbo);
+
+ gl.useProgram(null);
+ }));
+
+ testGroup.addChild(new es3fApiCase.ApiCaseCallback('draw_elements', 'Invalid gl.drawElements() usage', gl, function() {
+ /** @type{gluShaderProgram.ShaderProgram} */ var program = new gluShaderProgram.ShaderProgram(gl,gluShaderProgram.makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
+ gl.useProgram(program.getProgram());
+ /** @type{WebGLFramebuffer} */ var fbo;
+ /** @type{WebGLBuffer} */ var buf;
+ /** @type{WebGLTransformFeedback} */ var tfID;
+ /** @type{number} */ var vertices = 0;
+
+ /** @type{WebGLBuffer} */ var bufElements = gl.createBuffer();
+ gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, bufElements);
+
+ bufferedLogToConsole('gl.INVALID_ENUM is generated if mode is not an accepted value.');
+ gl.drawElements(-1, 0, gl.UNSIGNED_BYTE, vertices);
+ this.expectError(gl.INVALID_ENUM);
+
+ bufferedLogToConsole('gl.INVALID_ENUM is generated if type is not one of the accepted values.');
+ gl.drawElements(gl.POINTS, 0, -1, vertices);
+ this.expectError(gl.INVALID_ENUM);
+ gl.drawElements(gl.POINTS, 0, gl.FLOAT, vertices);
+ this.expectError(gl.INVALID_ENUM);
+
+ bufferedLogToConsole('gl.INVALID_VALUE is generated if count is negative.');
+ gl.drawElements(gl.POINTS, -1, gl.UNSIGNED_BYTE, vertices);
+ this.expectError(gl.INVALID_VALUE);
+
+ bufferedLogToConsole('gl.INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.');
+ fbo = gl.createFramebuffer();
+ gl.bindFramebuffer(gl.FRAMEBUFFER, fbo);
+ gl.checkFramebufferStatus(gl.FRAMEBUFFER);
+ gl.drawElements(gl.POINTS, 0, gl.UNSIGNED_BYTE, vertices);
+ this.expectError(gl.INVALID_FRAMEBUFFER_OPERATION);
+ gl.bindFramebuffer(gl.FRAMEBUFFER, null);
+ gl.deleteFramebuffer(fbo);
+
+ if (!sglrGLContext.isExtensionSupported(gl, 'EXT_geometry_shader')) { // gl.EXT_geometry_shader removes error
+ bufferedLogToConsole('gl.INVALID_OPERATION is generated if transform feedback is active and not paused.');
+ /** @type{Array<string>} */ var tfVarying = ['gl_Position'];
+
+ buf = gl.createBuffer();
+ tfID = gl.createTransformFeedback();
+
+ gl.useProgram (program.getProgram());
+ gl.transformFeedbackVaryings (program.getProgram(), tfVarying, gl.INTERLEAVED_ATTRIBS);
+ gl.linkProgram (program.getProgram());
+ gl.bindTransformFeedback (gl.TRANSFORM_FEEDBACK, tfID);
+ gl.bindBuffer (gl.TRANSFORM_FEEDBACK_BUFFER, buf);
+ gl.bufferData (gl.TRANSFORM_FEEDBACK_BUFFER, 32, gl.DYNAMIC_DRAW);
+ gl.bindBufferBase (gl.TRANSFORM_FEEDBACK_BUFFER, 0, buf);
+ gl.beginTransformFeedback (gl.POINTS);
+ this.expectError (gl.NO_ERROR);
+
+ gl.drawElements (gl.POINTS, 0, gl.UNSIGNED_BYTE, vertices);
+ this.expectError (gl.INVALID_OPERATION);
+
+ gl.bufferData (gl.ELEMENT_ARRAY_BUFFER, 32, gl.STATIC_DRAW);
+
+ gl.pauseTransformFeedback();
+ gl.drawElements (gl.POINTS, 0, gl.UNSIGNED_BYTE, vertices);
+ this.expectError (gl.NO_ERROR);
+
+ gl.endTransformFeedback ();
+ gl.deleteBuffer(buf);
+ gl.deleteTransformFeedback(tfID);
+ gl.deleteBuffer(bufElements);
+ this.expectError (gl.NO_ERROR);
+
+ }
+
+ gl.useProgram(null);
+ }));
+
+ testGroup.addChild(new es3fApiCase.ApiCaseCallback('draw_elements_invalid_program', 'Invalid gl.drawElements() usage', gl, function() {
+ gl.useProgram(null);
+ /** @type{number} */ var vertices = 0;
+
+ /** @type{WebGLBuffer} */ var bufElements = gl.createBuffer();
+ gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, bufElements);
+
+ bufferedLogToConsole('gl.INVALID_OPERATION is generated if gl.useProgram(null) was set.');
+ gl.drawElements(gl.POINTS, 0, gl.UNSIGNED_BYTE, vertices);
+ this.expectError(gl.INVALID_OPERATION);
+
+ gl.deleteBuffer(bufElements);
+
+ }));
+
+ testGroup.addChild(new es3fApiCase.ApiCaseCallback('draw_elements_incomplete_primitive', 'Invalid gl.drawElements() usage', gl, function() {
+ /** @type{gluShaderProgram.ShaderProgram} */ var program = new gluShaderProgram.ShaderProgram(gl,gluShaderProgram.makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
+ gl.useProgram(program.getProgram());
+ /** @type{WebGLFramebuffer} */ var fbo;
+ /** @type{WebGLBuffer} */ var buf;
+ /** @type{WebGLTransformFeedback} */ var tfID;
+ /** @type{number} */ var vertices = 0;
+
+ /** @type{WebGLBuffer} */ var bufElements = gl.createBuffer();
+ gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, bufElements);
+
+ bufferedLogToConsole('gl.INVALID_ENUM is generated if mode is not an accepted value.');
+ gl.drawElements(-1, 0, gl.UNSIGNED_BYTE, vertices);
+ this.expectError(gl.INVALID_ENUM);
+
+ bufferedLogToConsole('gl.INVALID_ENUM is generated if type is not one of the accepted values.');
+ gl.drawElements(gl.TRIANGLES, 0, -1, vertices);
+ this.expectError(gl.INVALID_ENUM);
+ gl.drawElements(gl.TRIANGLES, 0, gl.FLOAT, vertices);
+ this.expectError(gl.INVALID_ENUM);
+
+ bufferedLogToConsole('gl.INVALID_VALUE is generated if count is negative.');
+ gl.drawElements(gl.TRIANGLES, -1, gl.UNSIGNED_BYTE, vertices);
+ this.expectError(gl.INVALID_VALUE);
+
+ bufferedLogToConsole('gl.INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.');
+ fbo = gl.createFramebuffer();
+ gl.bindFramebuffer(gl.FRAMEBUFFER, fbo);
+ gl.checkFramebufferStatus(gl.FRAMEBUFFER);
+ gl.drawElements(gl.TRIANGLES, 0, gl.UNSIGNED_BYTE, vertices);
+ this.expectError(gl.INVALID_FRAMEBUFFER_OPERATION);
+ gl.bindFramebuffer(gl.FRAMEBUFFER, null);
+ gl.deleteFramebuffer(fbo);
+
+ if (!sglrGLContext.isExtensionSupported(gl, 'EXT_geometry_shader')) {// gl.EXT_geometry_shader removes error
+ bufferedLogToConsole('gl.INVALID_OPERATION is generated if transform feedback is active and not paused.');
+ /** @type{Array<string>} */ var tfVarying = ['gl_Position'];
+
+ buf = gl.createBuffer();
+ tfID = gl.createTransformFeedback();
+
+ gl.useProgram (program.getProgram());
+ gl.transformFeedbackVaryings (program.getProgram(), tfVarying, gl.INTERLEAVED_ATTRIBS);
+ gl.linkProgram (program.getProgram());
+ gl.bindTransformFeedback (gl.TRANSFORM_FEEDBACK, tfID);
+ gl.bindBuffer (gl.TRANSFORM_FEEDBACK_BUFFER, buf);
+ gl.bufferData (gl.TRANSFORM_FEEDBACK_BUFFER, 32, gl.DYNAMIC_DRAW);
+ gl.bindBufferBase (gl.TRANSFORM_FEEDBACK_BUFFER, 0, buf);
+ gl.beginTransformFeedback (gl.TRIANGLES);
+ this.expectError (gl.NO_ERROR);
+
+ gl.drawElements (gl.TRIANGLES, 0, gl.UNSIGNED_BYTE, vertices);
+ this.expectError (gl.INVALID_OPERATION);
+
+ gl.bufferData (gl.ELEMENT_ARRAY_BUFFER, 32, gl.STATIC_DRAW);
+
+ gl.pauseTransformFeedback();
+ gl.drawElements (gl.TRIANGLES, 0, gl.UNSIGNED_BYTE, vertices);
+ this.expectError (gl.NO_ERROR);
+
+ gl.endTransformFeedback ();
+ gl.deleteBuffer(buf);
+ gl.deleteTransformFeedback(tfID);
+ gl.deleteBuffer(bufElements);
+ this.expectError (gl.NO_ERROR);
+
+ }
+
+ gl.useProgram(null);
+ }));
+
+ testGroup.addChild(new es3fApiCase.ApiCaseCallback('draw_arrays_instanced', 'Invalid gl.drawArraysInstanced() usage', gl, function() {
+ /** @type{gluShaderProgram.ShaderProgram} */ var program = new gluShaderProgram.ShaderProgram(gl,gluShaderProgram.makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
+ gl.useProgram(program.getProgram());
+ /** @type{WebGLFramebuffer} */ var fbo;
+
+ /** @type{WebGLBuffer} */ var bufElements = gl.createBuffer();
+ gl.bindBuffer(gl.ARRAY_BUFFER, bufElements);
+
+ gl.vertexAttribDivisor(0, 1);
+ this.expectError(gl.NO_ERROR);
+
+ bufferedLogToConsole('gl.INVALID_ENUM is generated if mode is not an accepted value.');
+ gl.drawArraysInstanced(-1, 0, 1, 1);
+ this.expectError(gl.INVALID_ENUM);
+
+ bufferedLogToConsole('gl.INVALID_VALUE is generated if count or primcount are negative.');
+ gl.drawArraysInstanced(gl.POINTS, 0, -1, 1);
+ this.expectError(gl.INVALID_VALUE);
+ gl.drawArraysInstanced(gl.POINTS, 0, 1, -1);
+ this.expectError(gl.INVALID_VALUE);
+
+ bufferedLogToConsole('gl.INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.');
+ fbo = gl.createFramebuffer();
+ gl.bindFramebuffer(gl.FRAMEBUFFER, fbo);
+ gl.checkFramebufferStatus(gl.FRAMEBUFFER);
+ gl.drawArraysInstanced(gl.POINTS, 0, 1, 1);
+ this.expectError(gl.INVALID_FRAMEBUFFER_OPERATION);
+ gl.bindFramebuffer(gl.FRAMEBUFFER, null);
+ gl.deleteFramebuffer(fbo);
+
+ gl.deleteBuffer(bufElements);
+
+ gl.useProgram(null);
+ }));
+
+ testGroup.addChild(new es3fApiCase.ApiCaseCallback('draw_arrays_instanced_invalid_program', 'Invalid gl.drawArraysInstanced() usage', gl, function() {
+ gl.useProgram(null);
+
+ /** @type{WebGLBuffer} */ var bufElements = gl.createBuffer();
+ gl.bindBuffer(gl.ARRAY_BUFFER, bufElements);
+
+ gl.vertexAttribDivisor(0, 1);
+ this.expectError(gl.NO_ERROR);
+
+ bufferedLogToConsole('gl.INVALID_OPERATION is generated if gl.useProgram(null) is set.');
+ gl.drawArraysInstanced(gl.POINTS, 0, 1, 1);
+ this.expectError(gl.INVALID_OPERATION);
+
+ gl.deleteBuffer(bufElements);
+
+ }));
+
+ testGroup.addChild(new es3fApiCase.ApiCaseCallback('draw_arrays_instanced_incomplete_primitive', 'Invalid gl.drawArraysInstanced() usage', gl, function() {
+ /** @type{gluShaderProgram.ShaderProgram} */ var program = new gluShaderProgram.ShaderProgram(gl,gluShaderProgram.makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
+ gl.useProgram(program.getProgram());
+ /** @type{WebGLFramebuffer} */ var fbo;
+
+ /** @type{WebGLBuffer} */ var bufElements = gl.createBuffer();
+ gl.bindBuffer(gl.ARRAY_BUFFER, bufElements);
+
+ gl.vertexAttribDivisor(0, 1);
+ this.expectError(gl.NO_ERROR);
+
+ bufferedLogToConsole('gl.INVALID_ENUM is generated if mode is not an accepted value.');
+ gl.drawArraysInstanced(-1, 0, 1, 1);
+ this.expectError(gl.INVALID_ENUM);
+
+ bufferedLogToConsole('gl.INVALID_VALUE is generated if count or primcount are negative.');
+ gl.drawArraysInstanced(gl.TRIANGLES, 0, -1, 1);
+ this.expectError(gl.INVALID_VALUE);
+ gl.drawArraysInstanced(gl.TRIANGLES, 0, 1, -1);
+ this.expectError(gl.INVALID_VALUE);
+
+ bufferedLogToConsole('gl.INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.');
+ fbo = gl.createFramebuffer();
+ gl.bindFramebuffer(gl.FRAMEBUFFER, fbo);
+ gl.checkFramebufferStatus(gl.FRAMEBUFFER);
+ gl.drawArraysInstanced(gl.TRIANGLES, 0, 1, 1);
+ this.expectError(gl.INVALID_FRAMEBUFFER_OPERATION);
+ gl.bindFramebuffer(gl.FRAMEBUFFER, null);
+ gl.deleteFramebuffer(fbo);
+
+ gl.deleteBuffer(bufElements);
+
+ gl.useProgram(null);
+ }));
+
+ testGroup.addChild(new es3fApiCase.ApiCaseCallback('draw_elements_instanced', 'Invalid gl.drawElementsInstanced() usage', gl, function() {
+ /** @type{gluShaderProgram.ShaderProgram} */ var program = new gluShaderProgram.ShaderProgram(gl,gluShaderProgram.makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
+ gl.useProgram(program.getProgram());
+ /** @type{WebGLFramebuffer} */ var fbo;
+ /** @type{WebGLBuffer} */ var buf;
+ /** @type{WebGLTransformFeedback} */ var tfID;
+ /** @type{number} */ var vertices = 0;
+
+ /** @type{WebGLBuffer} */ var bufElements = gl.createBuffer();
+ gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, bufElements);
+
+ gl.vertexAttribDivisor(0, 1);
+ this.expectError(gl.NO_ERROR);
+
+ bufferedLogToConsole('gl.INVALID_ENUM is generated if mode is not an accepted value.');
+ gl.drawElementsInstanced(-1, 0, gl.UNSIGNED_BYTE, vertices, 1);
+ this.expectError(gl.INVALID_ENUM);
+
+ bufferedLogToConsole('gl.INVALID_ENUM is generated if type is not one of the accepted values.');
+ gl.drawElementsInstanced(gl.POINTS, 0, -1, vertices, 1);
+ this.expectError(gl.INVALID_ENUM);
+ gl.drawElementsInstanced(gl.POINTS, 0, gl.FLOAT, vertices, 1);
+ this.expectError(gl.INVALID_ENUM);
+
+ bufferedLogToConsole('gl.INVALID_VALUE is generated if count or primcount are negative.');
+ gl.drawElementsInstanced(gl.POINTS, -1, gl.UNSIGNED_BYTE, vertices, 0);
+ this.expectError(gl.INVALID_VALUE);
+ gl.drawElementsInstanced(gl.POINTS, 0, gl.UNSIGNED_BYTE, vertices, -1);
+ this.expectError(gl.INVALID_VALUE);
+
+ bufferedLogToConsole('gl.INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.');
+ fbo = gl.createFramebuffer();
+ gl.bindFramebuffer(gl.FRAMEBUFFER, fbo);
+ gl.checkFramebufferStatus(gl.FRAMEBUFFER);
+ gl.drawElementsInstanced(gl.POINTS, 0, gl.UNSIGNED_BYTE, vertices, 1);
+ this.expectError(gl.INVALID_FRAMEBUFFER_OPERATION);
+ gl.bindFramebuffer(gl.FRAMEBUFFER, null);
+ gl.deleteFramebuffer(fbo);
+
+ if (!sglrGLContext.isExtensionSupported(gl, 'EXT_geometry_shader')) {// gl.EXT_geometry_shader removes error
+ bufferedLogToConsole('gl.INVALID_OPERATION is generated if transform feedback is active and not paused.');
+ /** @type{Array<string>} */ var tfVarying = ['gl_Position'];
+
+ buf = gl.createBuffer();
+ tfID = gl.createTransformFeedback();
+
+ gl.useProgram (program.getProgram());
+ gl.transformFeedbackVaryings (program.getProgram(), tfVarying, gl.INTERLEAVED_ATTRIBS);
+ gl.linkProgram (program.getProgram());
+ gl.bindTransformFeedback (gl.TRANSFORM_FEEDBACK, tfID);
+ gl.bindBuffer (gl.TRANSFORM_FEEDBACK_BUFFER, buf);
+ gl.bufferData (gl.TRANSFORM_FEEDBACK_BUFFER, 32, gl.DYNAMIC_DRAW);
+ gl.bindBufferBase (gl.TRANSFORM_FEEDBACK_BUFFER, 0, buf);
+ gl.beginTransformFeedback (gl.POINTS);
+ this.expectError (gl.NO_ERROR);
+
+ gl.drawElementsInstanced (gl.POINTS, 0, gl.UNSIGNED_BYTE, vertices, 1);
+ this.expectError (gl.INVALID_OPERATION);
+
+ gl.bufferData (gl.ELEMENT_ARRAY_BUFFER, 32, gl.STATIC_DRAW);
+
+ gl.pauseTransformFeedback();
+ gl.drawElementsInstanced (gl.POINTS, 0, gl.UNSIGNED_BYTE, vertices, 1);
+ this.expectError (gl.NO_ERROR);
+
+ gl.endTransformFeedback ();
+ gl.deleteBuffer(buf);
+ gl.deleteTransformFeedback(tfID);
+ gl.deleteBuffer(bufElements);
+ this.expectError (gl.NO_ERROR);
+
+ }
+
+ gl.useProgram(null);
+ }));
+
+ testGroup.addChild(new es3fApiCase.ApiCaseCallback('draw_elements_instanced_invalid_program', 'Invalid gl.drawElementsInstanced() usage', gl, function() {
+ gl.useProgram(null);
+ /** @type{number} */ var vertices = 0;
+
+ /** @type{WebGLBuffer} */ var bufElements;
+ bufElements = gl.createBuffer();
+ gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, bufElements);
+
+ gl.vertexAttribDivisor(0, 1);
+ this.expectError(gl.NO_ERROR);
+
+ bufferedLogToConsole('gl.INVALID_OPERATION is generated if gl.useProgram(null) is set.');
+ gl.drawElementsInstanced(gl.POINTS, 0, gl.UNSIGNED_BYTE, vertices, 1);
+ this.expectError(gl.INVALID_OPERATION);
+
+ gl.deleteBuffer(bufElements);
+
+ }));
+
+ testGroup.addChild(new es3fApiCase.ApiCaseCallback('draw_elements_instanced_incomplete_primitive', 'Invalid gl.drawElementsInstanced() usage', gl, function() {
+ /** @type{gluShaderProgram.ShaderProgram} */ var program = new gluShaderProgram.ShaderProgram(gl,gluShaderProgram.makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
+ gl.useProgram(program.getProgram());
+ /** @type{WebGLFramebuffer} */ var fbo;
+ /** @type{WebGLBuffer} */ var buf;
+ /** @type{WebGLTransformFeedback} */ var tfID;
+ /** @type{number} */ var vertices = 0;
+
+ /** @type{WebGLBuffer} */ var bufElements;
+ bufElements = gl.createBuffer();
+ gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, bufElements);
+
+ gl.vertexAttribDivisor(0, 1);
+ this.expectError(gl.NO_ERROR);
+
+ bufferedLogToConsole('gl.INVALID_ENUM is generated if mode is not an accepted value.');
+ gl.drawElementsInstanced(-1, 0, gl.UNSIGNED_BYTE, vertices, 1);
+ this.expectError(gl.INVALID_ENUM);
+
+ bufferedLogToConsole('gl.INVALID_ENUM is generated if type is not one of the accepted values.');
+ gl.drawElementsInstanced(gl.TRIANGLES, 0, -1, vertices, 1);
+ this.expectError(gl.INVALID_ENUM);
+ gl.drawElementsInstanced(gl.TRIANGLES, 0, gl.FLOAT, vertices, 1);
+ this.expectError(gl.INVALID_ENUM);
+
+ bufferedLogToConsole('gl.INVALID_VALUE is generated if count or primcount are negative.');
+ gl.drawElementsInstanced(gl.TRIANGLES, -1, gl.UNSIGNED_BYTE, vertices, 0);
+ this.expectError(gl.INVALID_VALUE);
+ gl.drawElementsInstanced(gl.TRIANGLES, 0, gl.UNSIGNED_BYTE, vertices, -1);
+ this.expectError(gl.INVALID_VALUE);
+
+ bufferedLogToConsole('gl.INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.');
+ fbo = gl.createFramebuffer();
+ gl.bindFramebuffer(gl.FRAMEBUFFER, fbo);
+ gl.checkFramebufferStatus(gl.FRAMEBUFFER);
+ gl.drawElementsInstanced(gl.TRIANGLES, 0, gl.UNSIGNED_BYTE, vertices, 1);
+ this.expectError(gl.INVALID_FRAMEBUFFER_OPERATION);
+ gl.bindFramebuffer(gl.FRAMEBUFFER, null);
+ gl.deleteFramebuffer(fbo);
+
+ if (!sglrGLContext.isExtensionSupported(gl, 'EXT_geometry_shader')) {// gl.EXT_geometry_shader removes error
+ bufferedLogToConsole('gl.INVALID_OPERATION is generated if transform feedback is active and not paused.');
+ /** @type{Array<string>} */ var tfVarying = ['gl_Position'];
+
+ buf = gl.createBuffer();
+ tfID = gl.createTransformFeedback();
+
+ gl.useProgram (program.getProgram());
+ gl.transformFeedbackVaryings (program.getProgram(), tfVarying, gl.INTERLEAVED_ATTRIBS);
+ gl.linkProgram (program.getProgram());
+ gl.bindTransformFeedback (gl.TRANSFORM_FEEDBACK, tfID);
+ gl.bindBuffer (gl.TRANSFORM_FEEDBACK_BUFFER, buf);
+ gl.bufferData (gl.TRANSFORM_FEEDBACK_BUFFER, 32, gl.DYNAMIC_DRAW);
+ gl.bindBufferBase (gl.TRANSFORM_FEEDBACK_BUFFER, 0, buf);
+ gl.beginTransformFeedback (gl.TRIANGLES);
+ this.expectError (gl.NO_ERROR);
+
+ gl.drawElementsInstanced (gl.TRIANGLES, 0, gl.UNSIGNED_BYTE, vertices, 1);
+ this.expectError (gl.INVALID_OPERATION);
+
+ gl.bufferData (gl.ELEMENT_ARRAY_BUFFER, 32, gl.STATIC_DRAW);
+
+ gl.pauseTransformFeedback();
+ gl.drawElementsInstanced (gl.TRIANGLES, 0, gl.UNSIGNED_BYTE, vertices, 1);
+ this.expectError (gl.NO_ERROR);
+
+ gl.endTransformFeedback ();
+ gl.deleteBuffer(buf);
+ gl.deleteTransformFeedback(tfID);
+ gl.deleteBuffer(bufElements);
+ this.expectError (gl.NO_ERROR);
+
+ }
+
+ gl.useProgram(null);
+ }));
+
+ testGroup.addChild(new es3fApiCase.ApiCaseCallback('draw_range_elements', 'Invalid gl.drawRangeElements() usage', gl, function() {
+ /** @type{gluShaderProgram.ShaderProgram} */ var program = new gluShaderProgram.ShaderProgram(gl,gluShaderProgram.makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
+ gl.useProgram(program.getProgram());
+ /** @type{WebGLFramebuffer} */ var fbo;
+ /** @type{WebGLBuffer} */ var buf;
+ /** @type{WebGLTransformFeedback} */ var tfID;
+ /** @type{number} */ var vertices = 0;
+
+ /** @type{WebGLBuffer} */ var bufElements;
+ bufElements = gl.createBuffer();
+ gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, bufElements);
+
+ bufferedLogToConsole('gl.INVALID_ENUM is generated if mode is not an accepted value.');
+ gl.drawRangeElements(-1, 0, 1, 0, gl.UNSIGNED_BYTE, vertices);
+ this.expectError(gl.INVALID_ENUM);
+
+ bufferedLogToConsole('gl.INVALID_ENUM is generated if type is not one of the accepted values.');
+ gl.drawRangeElements(gl.POINTS, 0, 1, 0, -1, vertices);
+ this.expectError(gl.INVALID_ENUM);
+ gl.drawRangeElements(gl.POINTS, 0, 1, 0, gl.FLOAT, vertices);
+ this.expectError(gl.INVALID_ENUM);
+
+ bufferedLogToConsole('gl.INVALID_VALUE is generated if count is negative.');
+ gl.drawRangeElements(gl.POINTS, 0, 1, -1, gl.UNSIGNED_BYTE, vertices);
+ this.expectError(gl.INVALID_VALUE);
+
+ bufferedLogToConsole('gl.INVALID_VALUE is generated if end < start.');
+ gl.drawRangeElements(gl.POINTS, 1, 0, 0, gl.UNSIGNED_BYTE, vertices);
+ this.expectError(gl.INVALID_VALUE);
+
+ bufferedLogToConsole('gl.INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.');
+ fbo = gl.createFramebuffer();
+ gl.bindFramebuffer(gl.FRAMEBUFFER, fbo);
+ gl.checkFramebufferStatus(gl.FRAMEBUFFER);
+ gl.drawRangeElements(gl.POINTS, 0, 1, 0, gl.UNSIGNED_BYTE, vertices);
+ this.expectError(gl.INVALID_FRAMEBUFFER_OPERATION);
+ gl.bindFramebuffer(gl.FRAMEBUFFER, null);
+ gl.deleteFramebuffer(fbo);
+
+ if (!sglrGLContext.isExtensionSupported(gl, 'EXT_geometry_shader')) {// gl.EXT_geometry_shader removes error
+ bufferedLogToConsole('gl.INVALID_OPERATION is generated if transform feedback is active and not paused.');
+ /** @type{Array<string>} */ var tfVarying = ['gl_Position'];
+
+ buf = gl.createBuffer();
+ tfID = gl.createTransformFeedback();
+
+ gl.useProgram (program.getProgram());
+ gl.transformFeedbackVaryings (program.getProgram(), tfVarying, gl.INTERLEAVED_ATTRIBS);
+ gl.linkProgram (program.getProgram());
+ gl.bindTransformFeedback (gl.TRANSFORM_FEEDBACK, tfID);
+ gl.bindBuffer (gl.TRANSFORM_FEEDBACK_BUFFER, buf);
+ gl.bufferData (gl.TRANSFORM_FEEDBACK_BUFFER, 32, gl.DYNAMIC_DRAW);
+ gl.bindBufferBase (gl.TRANSFORM_FEEDBACK_BUFFER, 0, buf);
+ gl.beginTransformFeedback (gl.POINTS);
+ this.expectError (gl.NO_ERROR);
+
+ gl.drawRangeElements (gl.POINTS, 0, 1, 0, gl.UNSIGNED_BYTE, vertices);
+ this.expectError (gl.INVALID_OPERATION);
+
+ gl.bufferData (gl.ELEMENT_ARRAY_BUFFER, 32, gl.STATIC_DRAW);
+
+ gl.pauseTransformFeedback();
+ gl.drawRangeElements (gl.POINTS, 0, 1, 0, gl.UNSIGNED_BYTE, vertices);
+ this.expectError (gl.NO_ERROR);
+
+ gl.endTransformFeedback ();
+ gl.deleteBuffer(buf);
+ gl.deleteTransformFeedback(tfID);
+ gl.deleteBuffer(bufElements);
+ this.expectError (gl.NO_ERROR);
+
+ }
+
+ gl.useProgram(null);
+ }));
+
+ testGroup.addChild(new es3fApiCase.ApiCaseCallback('draw_range_elements_invalid_program', 'Invalid gl.drawRangeElements() usage', gl, function() {
+ gl.useProgram(null);
+ /** @type{number} */ var vertices = 0;
+
+ /** @type{WebGLBuffer} */ var bufElements;
+ bufElements = gl.createBuffer();
+ gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, bufElements);
+ gl.bufferData (gl.ELEMENT_ARRAY_BUFFER, 32, gl.STATIC_DRAW);
+
+ bufferedLogToConsole('gl.INVALID_OPERATION is generated if gl.useProgram(null) is set.');
+ gl.drawRangeElements(gl.POINTS, 0, 1, 0, gl.UNSIGNED_BYTE, vertices);
+ this.expectError(gl.INVALID_OPERATION);
+
+ gl.deleteBuffer(bufElements);
+
+ }));
+
+ testGroup.addChild(new es3fApiCase.ApiCaseCallback('draw_range_elements_incomplete_primitive', 'Invalid gl.drawRangeElements() usage', gl, function() {
+ /** @type{gluShaderProgram.ShaderProgram} */ var program = new gluShaderProgram.ShaderProgram(gl,gluShaderProgram.makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
+ gl.useProgram(program.getProgram());
+ /** @type{WebGLFramebuffer} */ var fbo;
+ /** @type{WebGLBuffer} */ var buf;
+ /** @type{WebGLTransformFeedback} */ var tfID;
+ /** @type{number} */ var vertices = 0;
+
+ /** @type{WebGLBuffer} */ var bufElements;
+ bufElements = gl.createBuffer();
+ gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, bufElements);
+
+ bufferedLogToConsole('gl.INVALID_ENUM is generated if mode is not an accepted value.');
+ gl.drawRangeElements(-1, 0, 1, 0, gl.UNSIGNED_BYTE, vertices);
+ this.expectError(gl.INVALID_ENUM);
+
+ bufferedLogToConsole('gl.INVALID_ENUM is generated if type is not one of the accepted values.');
+ gl.drawRangeElements(gl.TRIANGLES, 0, 1, 0, -1, vertices);
+ this.expectError(gl.INVALID_ENUM);
+ gl.drawRangeElements(gl.TRIANGLES, 0, 1, 0, gl.FLOAT, vertices);
+ this.expectError(gl.INVALID_ENUM);
+
+ bufferedLogToConsole('gl.INVALID_VALUE is generated if count is negative.');
+ gl.drawRangeElements(gl.TRIANGLES, 0, 1, -1, gl.UNSIGNED_BYTE, vertices);
+ this.expectError(gl.INVALID_VALUE);
+
+ bufferedLogToConsole('gl.INVALID_VALUE is generated if end < start.');
+ gl.drawRangeElements(gl.TRIANGLES, 1, 0, 0, gl.UNSIGNED_BYTE, vertices);
+ this.expectError(gl.INVALID_VALUE);
+
+ bufferedLogToConsole('gl.INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.');
+ fbo = gl.createFramebuffer();
+ gl.bindFramebuffer(gl.FRAMEBUFFER, fbo);
+ gl.checkFramebufferStatus(gl.FRAMEBUFFER);
+ gl.drawRangeElements(gl.TRIANGLES, 0, 1, 0, gl.UNSIGNED_BYTE, vertices);
+ this.expectError(gl.INVALID_FRAMEBUFFER_OPERATION);
+ gl.bindFramebuffer(gl.FRAMEBUFFER, null);
+ gl.deleteFramebuffer(fbo);
+
+ if (!sglrGLContext.isExtensionSupported(gl, 'EXT_geometry_shader')) {// gl.EXT_geometry_shader removes error
+ bufferedLogToConsole('gl.INVALID_OPERATION is generated if transform feedback is active and not paused.');
+ /** @type{Array<string>} */ var tfVarying = ['gl_Position'];
+
+ buf = gl.createBuffer();
+ tfID = gl.createTransformFeedback();
+
+ gl.useProgram (program.getProgram());
+ gl.transformFeedbackVaryings (program.getProgram(), tfVarying, gl.INTERLEAVED_ATTRIBS);
+ gl.linkProgram (program.getProgram());
+ gl.bindTransformFeedback (gl.TRANSFORM_FEEDBACK, tfID);
+ gl.bindBuffer (gl.TRANSFORM_FEEDBACK_BUFFER, buf);
+ gl.bufferData (gl.TRANSFORM_FEEDBACK_BUFFER, 32, gl.DYNAMIC_DRAW);
+ gl.bindBufferBase (gl.TRANSFORM_FEEDBACK_BUFFER, 0, buf);
+ gl.beginTransformFeedback (gl.TRIANGLES);
+ this.expectError (gl.NO_ERROR);
+
+ gl.drawRangeElements (gl.TRIANGLES, 0, 1, 0, gl.UNSIGNED_BYTE, vertices);
+ this.expectError (gl.INVALID_OPERATION);
+
+ gl.bufferData (gl.ELEMENT_ARRAY_BUFFER, 32, gl.STATIC_DRAW);
+
+ gl.pauseTransformFeedback();
+ gl.drawRangeElements (gl.TRIANGLES, 0, 1, 0, gl.UNSIGNED_BYTE, vertices);
+ this.expectError (gl.NO_ERROR);
+
+ gl.endTransformFeedback ();
+ gl.deleteBuffer(buf);
+ gl.deleteTransformFeedback(tfID);
+ gl.deleteBuffer(bufElements);
+ this.expectError (gl.NO_ERROR);
+
+ }
+
+ gl.useProgram(null);
+ }));
+ };
+
+ /**
+ * @param {WebGL2RenderingContext} gl
+ */
+ es3fNegativeVertexArrayApiTests.run = function(gl) {
+ var testName = 'vertex_array';
+ var testDescription = 'Negative Vertex Array API Cases';
+ var state = tcuTestCase.runner;
+
+ state.testName = testName;
+ state.testCases = tcuTestCase.newTest(testName, testDescription, null);
+
+ //Set up name and description of this test series.
+ setCurrentTestName(testName);
+ description(testDescription);
+ try {
+ es3fNegativeVertexArrayApiTests.init(gl);
+ tcuTestCase.runner.runCallback(tcuTestCase.runTestCases);
+ } catch (err) {
+ bufferedLogToConsole(err);
+ tcuTestCase.runner.terminate();
+ }
+ };
+
+});