summaryrefslogtreecommitdiffstats
path: root/dom/canvas/test/webgl-mochitest/test_pixel_pack_buffer.html
diff options
context:
space:
mode:
Diffstat (limited to 'dom/canvas/test/webgl-mochitest/test_pixel_pack_buffer.html')
-rw-r--r--dom/canvas/test/webgl-mochitest/test_pixel_pack_buffer.html288
1 files changed, 288 insertions, 0 deletions
diff --git a/dom/canvas/test/webgl-mochitest/test_pixel_pack_buffer.html b/dom/canvas/test/webgl-mochitest/test_pixel_pack_buffer.html
new file mode 100644
index 0000000000..bfacc5bfa9
--- /dev/null
+++ b/dom/canvas/test/webgl-mochitest/test_pixel_pack_buffer.html
@@ -0,0 +1,288 @@
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <meta charset='UTF-8'>
+ <script src='/tests/SimpleTest/SimpleTest.js'></script>
+ <link rel='stylesheet' href='/tests/SimpleTest/test.css'>
+ </head>
+ <body>
+ <script>
+
+var RED = [1, 0, 0, 1];
+var GREEN = [0, 1, 0, 1];
+var BLUE = [0, 0, 1, 1];
+var WHITE = [1, 1, 1, 1];
+var ZERO = [0, 0, 0, 0];
+
+function DrawColors(gl) {
+ var fnClearToColor = function(color) {
+ gl.clearColor(color[0], color[1], color[2], color[3]);
+ gl.clear(gl.COLOR_BUFFER_BIT);
+ };
+
+ gl.enable(gl.SCISSOR_TEST);
+
+ // +---+
+ // |G W|
+ // |R B|
+ // +---+
+
+ gl.scissor(0, 0, 1, 1);
+ fnClearToColor(RED);
+
+ gl.scissor(1, 0, 1, 1);
+ fnClearToColor(BLUE);
+
+ gl.scissor(0, 1, 1, 1);
+ fnClearToColor(GREEN);
+
+ gl.scissor(1, 1, 1, 1);
+ fnClearToColor(WHITE);
+}
+
+function ClearBufferPair(gl, byteCount) {
+ // Using `null` here clears to zero according to WebGL.
+ gl.bufferData(gl.PIXEL_PACK_BUFFER, byteCount, gl.STREAM_READ);
+
+ var arr = new Uint8Array(byteCount);
+ return arr;
+}
+
+function ColorToString(color, offset=0) {
+ var arr = [ color[offset+0],
+ color[offset+1],
+ color[offset+2],
+ color[offset+3] ];
+ return '[' + arr.join(', ') + ']';
+}
+
+function TestIsUNormColor(refColor, testData, offset) {
+ if (testData.length < offset + 4) {
+ ok(false, 'testData not long enough.');
+ }
+
+ var refUNormColor = [
+ (refColor[0] * 255) | 0,
+ (refColor[1] * 255) | 0,
+ (refColor[2] * 255) | 0,
+ (refColor[3] * 255) | 0,
+ ];
+
+ var refStr = ColorToString(refUNormColor);
+ var testStr = ColorToString(testData, offset);
+ ok(testStr == refStr, 'Expected ' + refStr + ', was ' + testStr + '.');
+}
+
+function section(text) {
+ ok(true, '');
+ ok(true, 'Section: ' + text);
+}
+
+function EnsureNoError(gl) {
+ var glErr = gl.getError();
+ while (gl.getError()) {}
+
+ if (!glErr)
+ return;
+
+ var extraInfo = '';
+
+ var err = new Error();
+ var stackStr = err.stack;
+ if (stackStr !== undefined) {
+ var stackArr = stackStr.split('\n');
+ stackStr = stackArr[1]; // First one after present scope.
+ extraInfo = ': ' + stackStr;
+ }
+
+ ok(false, 'Unexpected GL error: 0x' + glErr.toString(16) + extraInfo);
+}
+
+function TestError(gl, refErrVal, str='') {
+ if (str == '') {
+ str = 'gl.getError()';
+ } else {
+ str = str + ': gl.getError()';
+ }
+
+ var err = gl.getError();
+ while (gl.getError()) {}
+
+ ShouldBe(err.toString(16), refErrVal.toString(16), str);
+}
+
+function ShouldBe(val, ref, str='') {
+ if (str != '') {
+ str += ': ';
+ }
+
+ ok(val == ref, str + 'Should be `' + ref + '`, was `' + val + '`.');
+}
+
+var gl;
+
+function Test() {
+ var canvas = document.createElement('canvas');
+ canvas.width = 2;
+ canvas.height = 2;
+ canvas.style = 'width: 256px; height: 256px; border: 1px solid black;';
+ document.body.appendChild(canvas);
+
+ var attribs = {
+ antialias: false,
+ alpha: false,
+ };
+ gl = canvas.getContext('webgl2', attribs);
+ if (!gl) {
+ todo(false, 'WebGL 2 not present, skipping.');
+ return;
+ }
+
+ ////////
+
+ TestIsUNormColor(RED, new Uint8Array([255, 0, 0, 255]), 0);
+
+ ////////
+
+ gl.clearColor(RED[0], RED[1], RED[2], RED[3]);
+ gl.clear(gl.COLOR_BUFFER_BIT);
+
+ var data = new Uint8Array(16);
+ gl.readPixels(0, 0, 2, 2, gl.RGBA, gl.UNSIGNED_BYTE, data);
+ console.log(JSON.stringify(data));
+ TestIsUNormColor(RED, data, 0);
+
+ ////////
+
+ DrawColors(gl);
+
+ ////////
+
+ EnsureNoError(gl);
+ gl.readPixels(0, 0, 2, 2, gl.RGBA, gl.UNSIGNED_BYTE, 0);
+ TestError(gl, gl.INVALID_OPERATION);
+
+ var data = new Uint8Array(16);
+ gl.readPixels(0, 0, 2, 2, gl.RGBA, gl.UNSIGNED_BYTE, data);
+ EnsureNoError(gl);
+ TestIsUNormColor(RED, data, 0);
+ TestIsUNormColor(BLUE, data, 4);
+ TestIsUNormColor(GREEN, data, 8);
+ TestIsUNormColor(WHITE, data, 12);
+
+ ////////
+
+ var a = gl.createBuffer();
+ gl.bindBuffer(gl.PIXEL_PACK_BUFFER, a);
+ EnsureNoError(gl);
+
+ gl.readPixels(0, 0, 2, 2, gl.RGBA, gl.UNSIGNED_BYTE, data);
+ TestError(gl, gl.INVALID_OPERATION);
+
+ ////////
+
+ // Basic
+ section('Basic readback');
+ data = ClearBufferPair(gl, 16);
+ EnsureNoError(gl);
+ gl.readPixels(0, 0, 2, 2, gl.RGBA, gl.UNSIGNED_BYTE, 0);
+ EnsureNoError(gl);
+ gl.getBufferSubData(gl.PIXEL_PACK_BUFFER, 0, data);
+ EnsureNoError(gl);
+ TestIsUNormColor(RED, data, 0);
+ TestIsUNormColor(BLUE, data, 4);
+ TestIsUNormColor(GREEN, data, 8);
+ TestIsUNormColor(WHITE, data, 12);
+
+ section('Subrect readback');
+ data = ClearBufferPair(gl, 8);
+ gl.readPixels(1, 1, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, 0);
+ gl.getBufferSubData(gl.PIXEL_PACK_BUFFER, 0, data);
+ EnsureNoError(gl);
+ TestIsUNormColor(WHITE, data, 0);
+ TestIsUNormColor(ZERO, data, 4);
+
+ section('ReadPixels offset:4');
+ data = ClearBufferPair(gl, 16);
+ gl.readPixels(1, 1, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, 4);
+ gl.getBufferSubData(gl.PIXEL_PACK_BUFFER, 0, data);
+ EnsureNoError(gl);
+ TestIsUNormColor(ZERO, data, 0);
+ TestIsUNormColor(WHITE, data, 4);
+ TestIsUNormColor(ZERO, data, 8);
+ TestIsUNormColor(ZERO, data, 12);
+
+ section('ReadPixels offset:5');
+ gl.readPixels(1, 1, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, 5);
+ gl.getBufferSubData(gl.PIXEL_PACK_BUFFER, 0, data);
+ EnsureNoError(gl);
+ TestIsUNormColor(ZERO, data, 0);
+ TestIsUNormColor(WHITE, data, 4); // Should remain from previous read.
+ TestIsUNormColor(WHITE, data, 5);
+ TestIsUNormColor(ZERO, data, 9);
+ TestIsUNormColor(ZERO, data, 12);
+
+ section('GetBufferSubData src too small');
+ data = ClearBufferPair(gl, 16);
+ EnsureNoError(gl);
+ gl.getBufferSubData(gl.PIXEL_PACK_BUFFER, 1, data);
+ TestError(gl, gl.INVALID_VALUE);
+ TestIsUNormColor(ZERO, data, 0);
+ TestIsUNormColor(ZERO, data, 4);
+ TestIsUNormColor(ZERO, data, 8);
+ TestIsUNormColor(ZERO, data, 12);
+
+ section('GetBufferSubData offset:1');
+ data = new Uint8Array(15);
+ gl.readPixels(1, 1, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, 8);
+ gl.getBufferSubData(gl.PIXEL_PACK_BUFFER, 1, data);
+ EnsureNoError(gl);
+ TestIsUNormColor(ZERO, data, 0);
+ TestIsUNormColor(ZERO, data, 3);
+ TestIsUNormColor(WHITE, data, 7);
+ TestIsUNormColor(ZERO, data, 11);
+
+ //////////////////////////////////////
+
+ section('Test packing state');
+ EnsureNoError(gl);
+
+ function TestPackState(enumStr, initialVal, changedVal) {
+ var enumVal = gl[enumStr];
+
+ ShouldBe(gl.getParameter(enumVal), initialVal, 'Initial ' + enumStr);
+ gl.pixelStorei(enumVal, changedVal);
+ ShouldBe(gl.getParameter(enumVal), changedVal, 'Changed ' + enumStr);
+ gl.pixelStorei(enumVal, initialVal);
+ ShouldBe(gl.getParameter(enumVal), initialVal, 'Reverted ' + enumStr);
+ EnsureNoError(gl);
+ }
+
+ TestPackState('PACK_ALIGNMENT', 4, 1);
+ TestPackState('PACK_ROW_LENGTH', 0, 16);
+ TestPackState('PACK_SKIP_PIXELS', 0, 3);
+ TestPackState('PACK_SKIP_ROWS', 0, 3);
+}
+
+function RunTest() {
+ Test();
+ SimpleTest.finish();
+}
+
+SimpleTest.waitForExplicitFinish();
+
+try {
+ var prefArrArr = [
+ ['webgl.force-enabled', true],
+ ['webgl.disable-angle', true],
+ ];
+ var prefEnv = {'set': prefArrArr};
+ SpecialPowers.pushPrefEnv(prefEnv, RunTest);
+} catch (e) {
+ todo(false, 'No SpecialPowers, but trying anyway...');
+ RunTest();
+}
+
+ </script>
+ </body>
+</html>