test_no_arr_points.html (4769B)
1 <!DOCTYPE HTML> 2 <title>WebGL test: Drawing without attrib arrays</title> 3 <script src="/tests/SimpleTest/SimpleTest.js"></script> 4 <link rel="stylesheet" href="/tests/SimpleTest/test.css"> 5 <script src="driver-info.js"></script> 6 <script src="webgl-util.js"></script> 7 <script id="vs-no-attrib" type="x-shader/x-vertex"> 8 9 void main(void) { 10 gl_PointSize = 64.0; 11 gl_Position = vec4(vec3(0.0), 1.0); 12 } 13 14 </script> 15 <script id="vs-attrib" type="x-shader/x-vertex"> 16 17 attribute vec3 aPosition; 18 19 void main(void) { 20 gl_PointSize = 64.0; 21 gl_Position = vec4(aPosition, 1.0); 22 } 23 24 </script> 25 <script id="fs" type="x-shader/x-fragment"> 26 27 precision mediump float; 28 29 void main(void) { 30 gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0); 31 } 32 33 </script> 34 <body> 35 <canvas id="c" width="64" height="64"></canvas> 36 <script> 37 38 // Give ourselves a scope to return early from: 39 (function() { 40 var gl = c.getContext('webgl'); 41 if (!gl) { 42 todo(false, 'WebGL is unavailable.'); 43 return; 44 } 45 46 DriverInfo.dump(x => ok(true, x)); 47 48 var attribProg = WebGLUtil.createProgramByIds(gl, 'vs-attrib', 'fs'); 49 var noAttribProg = WebGLUtil.createProgramByIds(gl, 'vs-no-attrib', 'fs'); 50 if (!attribProg || !noAttribProg) { 51 ok(false, 'Program linking should succeed.'); 52 return; 53 } 54 55 attribProg.aPosition = gl.getAttribLocation(attribProg, "aPosition"); 56 ok(attribProg.aPosition >= 0, '`aPosition` should be valid.'); 57 58 function isScreenBlack() { 59 var pixels = gl.drawingBufferWidth * gl.drawingBufferHeight; 60 var data = new Uint8Array(4 * pixels); 61 gl.readPixels(0, 0, 62 gl.drawingBufferWidth, gl.drawingBufferHeight, 63 gl.RGBA, gl.UNSIGNED_BYTE, 64 data); 65 66 var accum = 0; 67 for (var i = 0; i < pixels; i++) { 68 accum += data[4*i + 0]; 69 accum += data[4*i + 1]; 70 accum += data[4*i + 2]; 71 } 72 73 return accum == 0; 74 } 75 76 function checkGLError(func, info) { 77 var error = gl.getError(); 78 func(!error, '[' + info + '] gl.getError should be 0, was 0x' + error.toString(16) + '.'); 79 } 80 81 function testDrawing(info) { 82 var cruelNumber = 1024*1024; 83 // Really, we should test for INT32_MAX-1 here, but we don't gracefully chunk these calls, 84 // and so try to create a VBO of size INT32_MAX-1 to pretend that vert attrib 0 is an array. 85 // (INT32_MAX-1 because we check that `first+count` is a valid GLsizei, which is int32_t) 86 var UINT16_MAX = 0xffff; 87 var INT32_MAX = 0x7fffffff; 88 var UINT32_MAX = 0xffffffff; 89 90 // `first` needs room for `first+count` <= sizeof(GLsizei) == INT32_MAX 91 var hugeFirst = Math.min(cruelNumber, INT32_MAX-1); 92 var hugeIndex = Math.min(cruelNumber, UINT32_MAX); 93 94 var indexType = gl.UNSIGNED_SHORT; 95 var indexStride = 2; 96 var indexArr = new Uint16Array([0, 1, Math.min(hugeIndex, UINT16_MAX)]); 97 if (gl.getExtension('OES_element_index_uint')) { 98 indexType = gl.UNSIGNED_INT; 99 indexStride = 4; 100 indexArr = new Uint32Array([0, 1, hugeIndex]); 101 } 102 103 gl.clear(gl.COLOR_BUFFER_BIT); 104 gl.drawArrays(gl.POINTS, 0, 1); 105 ok(!isScreenBlack(), '[' + info + '] drawArrays should color pixels.'); 106 107 gl.clear(gl.COLOR_BUFFER_BIT); 108 gl.drawArrays(gl.POINTS, hugeFirst, 1); 109 ok(!isScreenBlack(), '[' + info + '] drawArrays[huge first] should color pixels.'); 110 111 checkGLError(ok, info); 112 113 var elemTestFunc = ok; 114 var checkGLTestFunc = ok; 115 if (DriverInfo.getDriver() == DriverInfo.DRIVER.ANDROID_X86_EMULATOR) { 116 // ...but the Android 4.2 x86 emulator environment is different 117 elemTestFunc = todo; 118 checkGLTestFunc = ok; 119 } 120 121 // Now for drawElements: 122 gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, gl.createBuffer()); 123 gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indexArr, gl.STATIC_DRAW); 124 125 gl.clear(gl.COLOR_BUFFER_BIT); 126 gl.drawElements(gl.POINTS, 1, indexType, 0); 127 elemTestFunc(!isScreenBlack(), '[' + info + '] drawElements[0] should color pixels.'); 128 129 gl.clear(gl.COLOR_BUFFER_BIT); 130 gl.drawElements(gl.POINTS, 1, indexType, 1*indexStride); 131 elemTestFunc(!isScreenBlack(), '[' + info + '] drawElements[1] should color pixels.'); 132 133 gl.clear(gl.COLOR_BUFFER_BIT); 134 gl.drawElements(gl.POINTS, 1, indexType, 2*indexStride); 135 elemTestFunc(!isScreenBlack(), '[' + info + '] drawElements[huge offset] should color pixels.'); 136 137 checkGLError(checkGLTestFunc, info); 138 } 139 140 // Begin drawing 141 gl.clearColor(0.0, 0.0, 0.0, 1.0); 142 gl.disable(gl.DEPTH_TEST); 143 144 // No-attrib prog: 145 gl.useProgram(noAttribProg); 146 testDrawing('no-attrib'); 147 148 // One-attrib, no-array prog: 149 gl.useProgram(attribProg); 150 gl.disableVertexAttribArray(attribProg.aPosition); 151 gl.vertexAttrib3fv(attribProg.aPosition, [0.0, 0.0, 0.0]); 152 testDrawing('one-attrib, no-array'); 153 })(); 154 155 </script>