diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 17:32:43 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 17:32:43 +0000 |
commit | 6bf0a5cb5034a7e684dcc3500e841785237ce2dd (patch) | |
tree | a68f146d7fa01f0134297619fbe7e33db084e0aa /dom/canvas/test/webgl-mochitest/test_no_arr_points.html | |
parent | Initial commit. (diff) | |
download | thunderbird-upstream.tar.xz thunderbird-upstream.zip |
Adding upstream version 1:115.7.0.upstream/1%115.7.0upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'dom/canvas/test/webgl-mochitest/test_no_arr_points.html')
-rw-r--r-- | dom/canvas/test/webgl-mochitest/test_no_arr_points.html | 156 |
1 files changed, 156 insertions, 0 deletions
diff --git a/dom/canvas/test/webgl-mochitest/test_no_arr_points.html b/dom/canvas/test/webgl-mochitest/test_no_arr_points.html new file mode 100644 index 0000000000..c4556c9b5c --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/test_no_arr_points.html @@ -0,0 +1,156 @@ +<!DOCTYPE HTML> +<title>WebGL test: Drawing without attrib arrays</title> +<script src="/tests/SimpleTest/SimpleTest.js"></script> +<link rel="stylesheet" href="/tests/SimpleTest/test.css"> +<script src="driver-info.js"></script> +<script src="webgl-util.js"></script> +<script id="vs-no-attrib" type="x-shader/x-vertex"> + +void main(void) { + gl_PointSize = 64.0; + gl_Position = vec4(vec3(0.0), 1.0); +} + +</script> +<script id="vs-attrib" type="x-shader/x-vertex"> + +attribute vec3 aPosition; + +void main(void) { + gl_PointSize = 64.0; + gl_Position = vec4(aPosition, 1.0); +} + +</script> +<script id="fs" type="x-shader/x-fragment"> + +precision mediump float; + +void main(void) { + gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0); +} + +</script> +<body> +<canvas id="c" width="64" height="64"></canvas> +<script> + +// Give ourselves a scope to return early from: +(function() { + var gl = c.getContext('webgl'); + if (!gl) { + todo(false, 'WebGL is unavailable.'); + return; + } + + DriverInfo.dump(x => ok(true, x)); + + var attribProg = WebGLUtil.createProgramByIds(gl, 'vs-attrib', 'fs'); + var noAttribProg = WebGLUtil.createProgramByIds(gl, 'vs-no-attrib', 'fs'); + if (!attribProg || !noAttribProg) { + ok(false, 'Program linking should succeed.'); + return; + } + + attribProg.aPosition = gl.getAttribLocation(attribProg, "aPosition"); + ok(attribProg.aPosition >= 0, '`aPosition` should be valid.'); + + function isScreenBlack() { + var pixels = gl.drawingBufferWidth * gl.drawingBufferHeight; + var data = new Uint8Array(4 * pixels); + gl.readPixels(0, 0, + gl.drawingBufferWidth, gl.drawingBufferHeight, + gl.RGBA, gl.UNSIGNED_BYTE, + data); + + var accum = 0; + for (var i = 0; i < pixels; i++) { + accum += data[4*i + 0]; + accum += data[4*i + 1]; + accum += data[4*i + 2]; + } + + return accum == 0; + } + + function checkGLError(func, info) { + var error = gl.getError(); + func(!error, '[' + info + '] gl.getError should be 0, was 0x' + error.toString(16) + '.'); + } + + function testDrawing(info) { + var cruelNumber = 1024*1024; + // Really, we should test for INT32_MAX-1 here, but we don't gracefully chunk these calls, + // and so try to create a VBO of size INT32_MAX-1 to pretend that vert attrib 0 is an array. + // (INT32_MAX-1 because we check that `first+count` is a valid GLsizei, which is int32_t) + var UINT16_MAX = 0xffff; + var INT32_MAX = 0x7fffffff; + var UINT32_MAX = 0xffffffff; + + // `first` needs room for `first+count` <= sizeof(GLsizei) == INT32_MAX + var hugeFirst = Math.min(cruelNumber, INT32_MAX-1); + var hugeIndex = Math.min(cruelNumber, UINT32_MAX); + + var indexType = gl.UNSIGNED_SHORT; + var indexStride = 2; + var indexArr = new Uint16Array([0, 1, Math.min(hugeIndex, UINT16_MAX)]); + if (gl.getExtension('OES_element_index_uint')) { + indexType = gl.UNSIGNED_INT; + indexStride = 4; + indexArr = new Uint32Array([0, 1, hugeIndex]); + } + + gl.clear(gl.COLOR_BUFFER_BIT); + gl.drawArrays(gl.POINTS, 0, 1); + ok(!isScreenBlack(), '[' + info + '] drawArrays should color pixels.'); + + gl.clear(gl.COLOR_BUFFER_BIT); + gl.drawArrays(gl.POINTS, hugeFirst, 1); + ok(!isScreenBlack(), '[' + info + '] drawArrays[huge first] should color pixels.'); + + checkGLError(ok, info); + + var elemTestFunc = ok; + var checkGLTestFunc = ok; + if (DriverInfo.getDriver() == DriverInfo.DRIVER.ANDROID_X86_EMULATOR) { + // ...but the Android 4.2 x86 emulator environment is different + elemTestFunc = todo; + checkGLTestFunc = ok; + } + + // Now for drawElements: + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, gl.createBuffer()); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indexArr, gl.STATIC_DRAW); + + gl.clear(gl.COLOR_BUFFER_BIT); + gl.drawElements(gl.POINTS, 1, indexType, 0); + elemTestFunc(!isScreenBlack(), '[' + info + '] drawElements[0] should color pixels.'); + + gl.clear(gl.COLOR_BUFFER_BIT); + gl.drawElements(gl.POINTS, 1, indexType, 1*indexStride); + elemTestFunc(!isScreenBlack(), '[' + info + '] drawElements[1] should color pixels.'); + + gl.clear(gl.COLOR_BUFFER_BIT); + gl.drawElements(gl.POINTS, 1, indexType, 2*indexStride); + elemTestFunc(!isScreenBlack(), '[' + info + '] drawElements[huge offset] should color pixels.'); + + checkGLError(checkGLTestFunc, info); + } + + // Begin drawing + gl.clearColor(0.0, 0.0, 0.0, 1.0); + gl.disable(gl.DEPTH_TEST); + + // No-attrib prog: + gl.useProgram(noAttribProg); + testDrawing('no-attrib'); + + // One-attrib, no-array prog: + gl.useProgram(attribProg); + gl.disableVertexAttribArray(attribProg.aPosition); + gl.vertexAttrib3fv(attribProg.aPosition, [0.0, 0.0, 0.0]); + testDrawing('one-attrib, no-array'); +})(); + +</script> + |