content/canvas/test/webgl-conformance/conformance/reading/read-pixels-test.html

Wed, 31 Dec 2014 13:27:57 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 13:27:57 +0100
branch
TOR_BUG_3246
changeset 6
8bccb770b82d
permissions
-rw-r--r--

Ignore runtime configuration files generated during quality assurance.

     1 <!--
     2 Copyright (c) 2011 The Chromium Authors. All rights reserved.
     3 Use of this source code is governed by a BSD-style license that can be
     4 found in the LICENSE file.
     5  -->
     6 <!DOCTYPE html>
     7 <html>
     8 <head>
     9 <meta charset="utf-8">
    10 <title>WebGL ReadPixels conformance test.</title>
    11 <link rel="stylesheet" href="../../resources/js-test-style.css"/>
    12 <script src="../../resources/js-test-pre.js"></script>
    13 <script src="../resources/webgl-test.js"> </script>
    14 <script src="../resources/webgl-test-utils.js"> </script>
    15 </head>
    16 <body>
    17 <canvas id="example" width="200" height="200" style="width: 20px; height: 20px"></canvas>
    18 <div id="description"></div>
    19 <div id="console"></div>
    20 <script>
    21 description("Checks that ReadPixels works as expected.");
    22 testPassed("read-pixels-test start: " + (new Date().getTime()));
    24 var wtu = WebGLTestUtils;
    25 var canvas = document.getElementById("example");
    26 var gl = create3DContext(canvas);
    28 if (window.initNonKhronosFramework) {
    29    window.initNonKhronosFramework(true);
    30 }
    32 var actual;
    33 var expected;
    34 var width = 2;
    35 var height = 2;
    36 var continueTestFunc = continueTestPart1;
    38 gl.clearColor(1, 1, 1, 1);
    39 gl.clear(gl.COLOR_BUFFER_BIT);
    41 // Resize the canvas to 2x2. This is an attempt to get stuff in the backbuffer.
    42 // that shouldn't be there.
    43 canvas.addEventListener("webglcontextlost", function(e) { e.preventDefault(); }, false);
    44 canvas.addEventListener("webglcontextrestored", continueTestAfterContextRestored, false);
    45 canvas.width = width;
    46 canvas.height = height;
    47 if (gl.getError() != gl.CONTEXT_LOST_WEBGL) {
    48   continueTestPart1();
    49 }
    51 function continueTestAfterContextRestored() {
    52   window.gl = create3DContext(canvas);
    53   var func = continueTestFunc;
    54   window.continueTestFunc = function() { testFailed("should not be here"); };
    55   func();
    56 }
    58 function continueTestPart1() {
    59   gl.clearColor(0.5, 0.7, 1.0, 1);
    60   gl.clear(gl.COLOR_BUFFER_BIT);
    62   var innerColor = [0.5, 0.7, 1.0, 1];
    63   var outerColor = [0, 0, 0, 0];
    65   var tests = [
    66     { msg: 'in range', checkColor: innerColor, x:  0, y:  0,
    67       oneColor: innerColor, oneX: 0, oneY: 0},
    68     { msg: 'off top left', checkColor: outerColor, x: -1, y: -1,
    69       oneColor: innerColor, oneX: 1, oneY: 1},
    70     { msg: 'off bottom right', checkColor: outerColor, x:  1, y:  1,
    71       oneColor: innerColor, oneX: 0, oneY: 0},
    72     { msg: 'completely off top ', checkColor: outerColor, x:  0, y: -2,
    73       oneColor: outerColor, oneX: 0, oneY: 0},
    74     { msg: 'completely off bottom', checkColor: outerColor, x:  0, y:  2,
    75       oneColor: outerColor, oneX: 0, oneY: 0},
    76     { msg: 'completely off left', checkColor: outerColor, x: -2, y:  0,
    77       oneColor: outerColor, oneX: 0, oneY: 0},
    78     { msg: 'completeley off right', checkColor: outerColor, x:  2, y:  0,
    79       oneColor: outerColor, oneX: 0, oneY: 0}
    80   ];
    82   for (var tt = 0; tt < tests.length; ++tt) {
    83     var test = tests[tt];
    84     debug("");
    85     debug("checking: " + test.msg);
    86     checkBuffer(test.checkColor, test.x, test.y,
    87                 test.oneColor, test.oneX, test.oneY);
    88   }
    90   glErrorShouldBe(gl, gl.NO_ERROR, "there should be no GL errors");
    92   function checkBuffer(checkColor, x, y, oneColor, oneX, oneY) {
    93     var buf = new Uint8Array(width * height * 4);
    94     gl.readPixels(x, y, width, height, gl.RGBA, gl.UNSIGNED_BYTE, buf);
    95     for (var yy = 0; yy < height; ++yy) {
    96       for (var xx = 0; xx < width; ++xx) {
    97         var offset = (yy * width + xx) * 4;
    98         var expectedColors = (oneX == xx && oneY == yy) ? oneColor : checkColor;
    99         for (var cc = 0; cc < 4; ++cc) {
   100           var expectedColor = expectedColors[cc] * 255;
   101           var color = buf[offset + cc];
   102           var diff = Math.abs(expectedColor - color);
   103           assertMsg(diff < 3,
   104                     "color pixel at " + xx + ", " + yy + " should be about " + expectedColor);
   105         }
   106       }
   107     }
   108   }
   110   var badFormats = [
   111     {
   112       format: gl.RGB,
   113       type: gl.UNSIGNED_BYTE,
   114       dest: new Uint8Array(3),
   115       error: gl.INVALID_OPERATION
   116     },
   117     {
   118       format: gl.RGB,
   119       type: gl.UNSIGNED_SHORT_5_6_5,
   120       dest: new Uint8Array(3),
   121       error: gl.INVALID_OPERATION
   122     },
   123     {
   124       format: gl.RGBA,
   125       type: gl.UNSIGNED_SHORT_5_5_5_1,
   126       dest: new Uint16Array(1),
   127       error: gl.INVALID_OPERATION
   128     },
   129     {
   130       format: gl.RGBA,
   131       type: gl.UNSIGNED_SHORT_4_4_4_4,
   132       dest: new Uint16Array(1),
   133       error: gl.INVALID_OPERATION
   134     },
   135     {
   136       format: gl.ALPHA,
   137       type: gl.UNSIGNED_BYTE,
   138       dest: new Uint8Array(1),
   139       error: gl.INVALID_OPERATION
   140     },
   141     {
   142       format: gl.LUMINANCE,
   143       type: gl.UNSIGNED_BYTE,
   144       dest: new Uint8Array(1),
   145       error: gl.INVALID_ENUM
   146     },
   147     {
   148       format: gl.LUMINANCE_ALPHA,
   149       type: gl.UNSIGNED_BYTE,
   150       dest: new Uint8Array(2),
   151       error: gl.INVALID_ENUM
   152     }
   153   ];
   154   debug("");
   155   debug("check disallowed formats");
   156   for (var tt = 0; tt < badFormats.length; ++ tt) {
   157     var info = badFormats[tt]
   158     var format = info.format;
   159     var type = info.type;
   160     var dest = info.dest;
   161     var error = info.error;
   162     gl.readPixels(0, 0, 1, 1, format, type, dest);
   163     // note that the GL error is INVALID_OPERATION if both format and type are invalid, but
   164     // INVALID_ENUM if only one is.
   165     glErrorShouldBe(
   166         gl, error,
   167         "Should not be able to read as " + wtu.glEnumToString(gl, format) +
   168         " / " + wtu.glEnumToString(gl, type));
   169   }
   171   debug("");
   172   debug("check reading with lots of drawing");
   173   continueTestFunc = continueTestPart2;
   174   width = 1024;
   175   height = 1024;
   176   canvas.width = width;
   177   canvas.height = height;
   178   if (gl.getError() != gl.CONTEXT_LOST_WEBGL) {
   179     continueTestPart2();
   180   }
   181 }
   183 function continueTestPart2() {
   184   testPassed("read-pixels-test continueTestPart2: " + (new Date().getTime()));
   185   gl.viewport(0, 0, 1024, 1024);
   186   testPassed("read-pixels-test before setupTexturedQuad: " + (new Date().getTime()));
   187   var program = wtu.setupTexturedQuad(gl);
   188   testPassed("read-pixels-test after setupTexturedQuad: " + (new Date().getTime()));
   189   var loc = gl.getUniformLocation(program, "tex");
   190   gl.disable(gl.BLEND);
   191   gl.disable(gl.DEPTH_TEST);
   192   var colors = [[255, 0, 0, 255], [0, 255, 0, 255], [0, 0, 255, 255]];
   193   var textures = [];
   194   var results = [];
   195   testPassed("read-pixels-test before first loop: " + (new Date().getTime()));
   196   for (var ii = 0; ii < colors.length; ++ii) {
   197     gl.activeTexture(gl.TEXTURE0 + ii);
   198     var tex = gl.createTexture();
   199     testPassed("read-pixels-test first loop, ii = " + ii + ", before fillTexture: " + (new Date().getTime()));
   200     wtu.fillTexture(gl, tex, 1, 1, colors[ii]);
   201     testPassed("read-pixels-test first loop, ii = " + ii + ", after fillTexture: " + (new Date().getTime()));
   202     textures.push(tex);
   203   }
   204   for (var ii = 0; ii < colors.length; ++ii) {
   205     testPassed("read-pixels-test second loop, ii = " + ii + ": " + (new Date().getTime()));
   206     for (var jj = 0; jj < 300 + ii + 1; ++jj) {
   207       gl.uniform1i(loc, jj % 3);
   208       gl.drawArrays(gl.TRIANGLES, 0, 6);
   209     }
   210     var buf = new Uint8Array(4);
   211     testPassed("read-pixels-test second loop, before readpixels: " + (new Date().getTime()));
   212     gl.readPixels(512, 512, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, buf);
   213     testPassed("read-pixels-test second loop, after readpixels: " + (new Date().getTime()));
   214     results.push(buf);
   215     for (var kk = 0; kk < 99; ++kk) {
   216       gl.uniform1i(loc, (jj + kk) % 3);
   217       gl.drawArrays(gl.TRIANGLES, 0, 6);
   218     }
   219     testPassed("read-pixels-test second loop end: " + (new Date().getTime()));
   220   }
   221   for (var ii = 0; ii < colors.length; ++ii) {
   222     testPassed("read-pixels-test third loop, ii = " + ii + ": " + (new Date().getTime()));
   223     var buf = results[ii];
   224     var color = colors[ii];
   225     actual = [buf[0], buf[1], buf[2], buf[3]];
   226     expected = [color[0], color[1], color[2], color[3]];
   227     shouldBe("actual", "expected");
   228     testPassed("read-pixels-test third loop end: " + (new Date().getTime()));
   229   }
   230   glErrorShouldBe(gl, gl.NO_ERROR, "there should be no GL errors");
   232   debug("");
   234   // bug 763355: temporary logging of exceptions here to understand intermittent timeout
   235   // in this test, apparently in this finishTest() call.
   236   try {
   237     testPassed("read-pixels-test calling finishTest: " + (new Date().getTime()));
   238     finishTest();
   239     testPassed("read-pixels-test after finishTest: " + (new Date().getTime()));
   240   } catch(e) {
   241     testFailed("finishTest generated exception: " + e);
   242   }
   243 }
   244 </script>
   245 </body>
   246 </html>

mercurial