1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/content/canvas/test/webgl-mochitest/test_no_arr_points.html Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,169 @@ 1.4 +<!DOCTYPE HTML> 1.5 +<title>WebGL test: Drawing without attrib arrays</title> 1.6 +<script src="/tests/SimpleTest/SimpleTest.js"></script> 1.7 +<link rel="stylesheet" href="/tests/SimpleTest/test.css"> 1.8 +<script src="driver-info.js"></script> 1.9 +<script src="webgl-util.js"></script> 1.10 +<script id="vs-no-attrib" type="x-shader/x-vertex"> 1.11 + 1.12 +void main(void) { 1.13 + gl_PointSize = 64.0; 1.14 + gl_Position = vec4(vec3(0.0), 1.0); 1.15 +} 1.16 + 1.17 +</script> 1.18 +<script id="vs-attrib" type="x-shader/x-vertex"> 1.19 + 1.20 +attribute vec3 aPosition; 1.21 + 1.22 +void main(void) { 1.23 + gl_PointSize = 64.0; 1.24 + gl_Position = vec4(aPosition, 1.0); 1.25 +} 1.26 + 1.27 +</script> 1.28 +<script id="fs" type="x-shader/x-fragment"> 1.29 + 1.30 +precision mediump float; 1.31 + 1.32 +void main(void) { 1.33 + gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0); 1.34 +} 1.35 + 1.36 +</script> 1.37 +<body> 1.38 +<canvas id="c" width="64" height="64"></canvas> 1.39 +<script> 1.40 + 1.41 +// Give ourselves a scope to return early from: 1.42 +(function() { 1.43 + var gl = WebGLUtil.getWebGL('c'); 1.44 + if (!gl) { 1.45 + todo(false, 'WebGL is unavailable.'); 1.46 + return; 1.47 + } 1.48 + 1.49 + function errorFunc(str) { 1.50 + ok(false, 'Error: ' + str); 1.51 + } 1.52 + WebGLUtil.setErrorFunc(errorFunc); 1.53 + WebGLUtil.setWarningFunc(errorFunc); 1.54 + 1.55 + var attribProg = WebGLUtil.createProgramByIds(gl, 'vs-attrib', 'fs'); 1.56 + var noAttribProg = WebGLUtil.createProgramByIds(gl, 'vs-no-attrib', 'fs'); 1.57 + if (!attribProg || !noAttribProg) { 1.58 + ok(false, 'Program linking should succeed.'); 1.59 + return; 1.60 + } 1.61 + 1.62 + attribProg.aPosition = gl.getAttribLocation(attribProg, "aPosition"); 1.63 + ok(attribProg.aPosition >= 0, '`aPosition` should be valid.'); 1.64 + 1.65 + function isScreenBlack() { 1.66 + var pixels = gl.drawingBufferWidth * gl.drawingBufferHeight; 1.67 + var data = new Uint8Array(4 * pixels); 1.68 + gl.readPixels(0, 0, 1.69 + gl.drawingBufferWidth, gl.drawingBufferHeight, 1.70 + gl.RGBA, gl.UNSIGNED_BYTE, 1.71 + data); 1.72 + 1.73 + var accum = 0; 1.74 + for (var i = 0; i < pixels; i++) { 1.75 + accum += data[4*i + 0]; 1.76 + accum += data[4*i + 1]; 1.77 + accum += data[4*i + 2]; 1.78 + } 1.79 + 1.80 + return accum == 0; 1.81 + } 1.82 + 1.83 + function checkGLError(func, info) { 1.84 + var error = gl.getError(); 1.85 + func(!error, '[' + info + '] gl.getError should be 0, was 0x' + error.toString(16) + '.'); 1.86 + } 1.87 + 1.88 + function testDrawing(info) { 1.89 + var cruelNumber = 1024*1024; 1.90 + // Really, we should test for INT32_MAX-1 here, but we don't gracefully chunk these calls, 1.91 + // and so try to create a VBO of size INT32_MAX-1 to pretend that vert attrib 0 is an array. 1.92 + // (INT32_MAX-1 because we check that `first+count` is a valid GLsizei, which is int32_t) 1.93 + var UINT16_MAX = 0xffff; 1.94 + var INT32_MAX = 0x7fffffff; 1.95 + var UINT32_MAX = 0xffffffff; 1.96 + 1.97 + // `first` needs room for `first+count` <= sizeof(GLsizei) == INT32_MAX 1.98 + var hugeFirst = Math.min(cruelNumber, INT32_MAX-1); 1.99 + var hugeIndex = Math.min(cruelNumber, UINT32_MAX); 1.100 + 1.101 + var indexType = gl.UNSIGNED_SHORT; 1.102 + var indexStride = 2; 1.103 + var indexArr = new Uint16Array([0, 1, Math.min(hugeIndex, UINT16_MAX)]); 1.104 + if (gl.getExtension('OES_element_index_uint')) { 1.105 + indexType = gl.UNSIGNED_INT; 1.106 + indexStride = 4; 1.107 + indexArr = new Uint32Array([0, 1, hugeIndex]); 1.108 + } 1.109 + 1.110 + gl.clear(gl.COLOR_BUFFER_BIT); 1.111 + gl.drawArrays(gl.POINTS, 0, 1); 1.112 + ok(!isScreenBlack(), '[' + info + '] drawArrays should color pixels.'); 1.113 + 1.114 + gl.clear(gl.COLOR_BUFFER_BIT); 1.115 + gl.drawArrays(gl.POINTS, hugeFirst, 1); 1.116 + ok(!isScreenBlack(), '[' + info + '] drawArrays[huge first] should color pixels.'); 1.117 + 1.118 + checkGLError(ok, info); 1.119 + 1.120 + var elemTestFunc = todo; // We fail on most implementations. 1.121 + var checkGLTestFunc = todo; 1.122 + if (DriverInfo.getDriver() == DriverInfo.DRIVER.ANGLE || 1.123 + DriverInfo.getOS() == DriverInfo.OS.ANDROID) 1.124 + { 1.125 + // ANGLE and Android slaves seem to work fine. 1.126 + elemTestFunc = ok; 1.127 + checkGLTestFunc = ok; 1.128 + } 1.129 + if (DriverInfo.getDriver() == DriverInfo.DRIVER.ANDROID_X86_EMULATOR || 1.130 + DriverInfo.getOS() == DriverInfo.OS.B2G) 1.131 + { 1.132 + // ...but the Android 4.2 x86 emulator environment is different 1.133 + elemTestFunc = todo; 1.134 + checkGLTestFunc = ok; 1.135 + } 1.136 + 1.137 + // Now for drawElements: 1.138 + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, gl.createBuffer()); 1.139 + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indexArr, gl.STATIC_DRAW); 1.140 + 1.141 + gl.clear(gl.COLOR_BUFFER_BIT); 1.142 + gl.drawElements(gl.POINTS, 1, indexType, 0); 1.143 + elemTestFunc(!isScreenBlack(), '[' + info + '] drawElements[0] should color pixels.'); 1.144 + 1.145 + gl.clear(gl.COLOR_BUFFER_BIT); 1.146 + gl.drawElements(gl.POINTS, 1, indexType, 1*indexStride); 1.147 + elemTestFunc(!isScreenBlack(), '[' + info + '] drawElements[1] should color pixels.'); 1.148 + 1.149 + gl.clear(gl.COLOR_BUFFER_BIT); 1.150 + gl.drawElements(gl.POINTS, 1, indexType, 2*indexStride); 1.151 + elemTestFunc(!isScreenBlack(), '[' + info + '] drawElements[huge offset] should color pixels.'); 1.152 + 1.153 + checkGLError(checkGLTestFunc, info); 1.154 + } 1.155 + 1.156 + // Begin drawing 1.157 + gl.clearColor(0.0, 0.0, 0.0, 1.0); 1.158 + gl.disable(gl.DEPTH_TEST); 1.159 + 1.160 + // No-attrib prog: 1.161 + gl.useProgram(noAttribProg); 1.162 + testDrawing('no-attrib'); 1.163 + 1.164 + // One-attrib, no-array prog: 1.165 + gl.useProgram(attribProg); 1.166 + gl.disableVertexAttribArray(attribProg.aPosition); 1.167 + gl.vertexAttrib3fv(attribProg.aPosition, [0.0, 0.0, 0.0]); 1.168 + testDrawing('one-attrib, no-array'); 1.169 +})(); 1.170 + 1.171 +</script> 1.172 +