diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 19:33:14 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 19:33:14 +0000 |
commit | 36d22d82aa202bb199967e9512281e9a53db42c9 (patch) | |
tree | 105e8c98ddea1c1e4784a60a5a6410fa416be2de /dom/canvas/test/webgl-conf/checkout/deqp/functional/gles3/es3fNegativeVertexArrayApiTests.js | |
parent | Initial commit. (diff) | |
download | firefox-esr-36d22d82aa202bb199967e9512281e9a53db42c9.tar.xz firefox-esr-36d22d82aa202bb199967e9512281e9a53db42c9.zip |
Adding upstream version 115.7.0esr.upstream/115.7.0esrupstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'dom/canvas/test/webgl-conf/checkout/deqp/functional/gles3/es3fNegativeVertexArrayApiTests.js')
-rw-r--r-- | dom/canvas/test/webgl-conf/checkout/deqp/functional/gles3/es3fNegativeVertexArrayApiTests.js | 906 |
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(); + } + }; + +}); |