invalid-vertex-attrib-test.js (3556B)
1 var createInvalidAttribTestFn = (function() { 2 3 async function testPreserveDrawingBufferTrue(gl, drawFn, clear) { 4 debug(''); 5 debug(`test preserveDrawingBuffer: true with ${drawFn.name} ${clear ? 'with' : 'without'} clear`); 6 7 if (clear) { 8 gl.clearColor(0, 0, 0, 0); 9 gl.clear(gl.COLOR_BUFFER_BIT); 10 } 11 12 const skipTest = drawFn(gl); 13 if (skipTest) { 14 debug('skipped: extension does not exist'); 15 return; 16 } 17 18 wtu.checkCanvas(gl, [255, 0, 0, 255], "canvas should be red"); 19 20 await waitForComposite(); 21 22 wtu.checkCanvas(gl, [255, 0, 0, 255], "canvas should be red"); 23 wtu.glErrorShouldBe(gl, gl.NO_ERROR, "there should be no errors"); 24 } 25 26 function setupWebGL({ 27 webglVersion, 28 shadersFn, 29 attribs, 30 }) { 31 const positionBuf = gl.createBuffer(); 32 gl.bindBuffer(gl.ARRAY_BUFFER, positionBuf); 33 gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([ 34 -1, -1, 35 1, -1, 36 -1, 1, 37 -1, 1, 38 1, -1, 39 1, 1, 40 ]), gl.STATIC_DRAW); 41 gl.enableVertexAttribArray(0); 42 gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0); 43 const indexBuf = gl.createBuffer(); 44 gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexBuf); 45 gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint8Array([0, 1, 2, 3, 4, 5]), gl.STATIC_DRAW); 46 return gl; 47 } 48 49 function createInvalidAttribTestFn(gl) { 50 const vs = ` 51 attribute vec4 vPosition; 52 void main() 53 { 54 gl_Position = vPosition; 55 } 56 `; 57 58 const fs = ` 59 precision mediump float; 60 void main() 61 { 62 gl_FragColor = vec4(1, 0, 0, 1); 63 } 64 ` 65 66 const program = wtu.setupProgram(gl, [vs, fs], ["vPosition"]); 67 if (!program) { 68 debug(`program failed to compile: ${wtu.getLastError()}`); 69 } 70 71 const positionBuffer = gl.createBuffer(); 72 gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer); 73 gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([ 74 -1, -1, 75 1, -1, 76 -1, 1, 77 -1, 1, 78 1, -1, 79 1, 1, 80 ]), gl.STATIC_DRAW); 81 82 const indexBuffer = gl.createBuffer(); 83 gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexBuffer); 84 gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, 85 new Uint8Array([0, 1, 2, 3, 4, 5]), 86 gl.STATIC_DRAW); 87 88 return async function invalidAttribTestFn(drawFn) { 89 debug(''); 90 91 // reset attribs 92 gl.bindBuffer(gl.ARRAY_BUFFER, null); 93 const numAttribs = gl.getParameter(gl.MAX_VERTEX_ATTRIBS); 94 for (let i = 0; i < numAttribs; ++i) { 95 gl.disableVertexAttribArray(i); 96 gl.vertexAttribPointer(1, 1, gl.FLOAT, false, 0, 0); 97 } 98 99 debug(`test ${drawFn.name} draws with valid attributes`); 100 gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer); 101 gl.enableVertexAttribArray(0); 102 gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0); 103 wtu.glErrorShouldBe(gl, gl.NO_ERROR, "there should be no errors"); 104 105 gl.clearColor(0, 0, 0, 0,); 106 gl.clear(gl.COLOR_BUFFER_BIT); 107 wtu.checkCanvas(gl, [0, 0, 0, 0], "canvas should be zero"); 108 109 drawFn(gl); 110 111 wtu.checkCanvas(gl, [255, 0, 0, 255], "canvas should be red"); 112 wtu.glErrorShouldBe(gl, gl.NO_ERROR, "there should be no errors"); 113 114 debug(`test ${drawFn.name} generates INVALID_OPERATION draws with enabled attribute no buffer bound`); 115 gl.enableVertexAttribArray(1); 116 117 gl.clearColor(0, 0, 0, 0,); 118 gl.clear(gl.COLOR_BUFFER_BIT); 119 wtu.checkCanvas(gl, [0, 0, 0, 0], "canvas should be zero"); 120 121 drawFn(gl); 122 123 wtu.glErrorShouldBe(gl, gl.INVALID_OPERATION, "should generate INVALID_OPERATION"); 124 wtu.checkCanvas(gl, [0, 0, 0, 0], "canvas should be zero"); 125 }; 126 } 127 128 return createInvalidAttribTestFn; 129 }());