tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

readbuffer.html (7078B)


      1 <!--
      2 Copyright (c) 2019 The Khronos Group Inc.
      3 Use of this source code is governed by an MIT-style license that can be
      4 found in the LICENSE.txt file.
      5 -->
      6 
      7 <!DOCTYPE html>
      8 <html>
      9 <head>
     10 <meta charset="utf-8">
     11 <title>Test readBuffer Against WebGL 2</title>
     12 <link rel="stylesheet" href="../../resources/js-test-style.css"/>
     13 <script src="../../js/js-test-pre.js"></script>
     14 <script src="../../js/webgl-test-utils.js"></script>
     15 </head>
     16 <body>
     17 <div id="description"></div>
     18 <div id="console"></div>
     19 <canvas id="canvas" width="20" height="20"> </canvas>
     20 <script>
     21 "use strict";
     22 description("This tests reading from fbo");
     23 
     24 var clearDrawingbuffer = function(color) {
     25  gl.clearColor(color[0] / 255, color[1] / 255, color[2] / 255, color[3] / 255);
     26  gl.clear(gl.COLOR_BUFFER_BIT);
     27 }
     28 
     29 var validateReadingFromFramebuffer = function(color, expected, msg) {
     30  var pixels = new Uint8Array(1 * 1 * 4);
     31  gl.readPixels(0, 0, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, pixels);
     32  wtu.glErrorShouldBe(gl, expected, msg);
     33  if (expected == gl.NO_ERROR)
     34    wtu.checkCanvasRect(gl, 0, 0, canvas.width, canvas.height, color,
     35    "the color should be [" + color + "]");
     36 }
     37 
     38 var setupRenderbuffer = function(attachment) {
     39  var renderbuffer = gl.createRenderbuffer();
     40  gl.bindRenderbuffer(gl.RENDERBUFFER, renderbuffer);
     41  gl.framebufferRenderbuffer(gl.FRAMEBUFFER, attachment, gl.RENDERBUFFER, renderbuffer);
     42  gl.renderbufferStorage(gl.RENDERBUFFER, gl.RGBA8, canvas.width, canvas.height);
     43  return renderbuffer;
     44 }
     45 
     46 var testReadBufferOnDefaultFB = function() {
     47  gl.readBuffer(gl.NONE);
     48  wtu.glErrorShouldBe(gl, gl.NO_ERROR,
     49      "calling readBuffer with GL_NONE on the default framebuffer should succeed.");
     50  var pixels = new Uint8Array(1 * 1 * 4);
     51  gl.readPixels(0, 0, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, pixels);
     52  wtu.glErrorShouldBe(gl, gl.INVALID_OPERATION,
     53      "should generate INVALID_OPERATION when reading from framebuffer and read buffer is GL_NONE.");
     54  gl.readBuffer(gl.BACK);
     55  wtu.glErrorShouldBe(gl, gl.NO_ERROR,
     56      "calling readBuffer with GL_BACK on the default framebuffer should succeed.");
     57 
     58  gl.readBuffer(gl.COLOR_ATTACHMENT0);
     59  wtu.glErrorShouldBe(gl, gl.INVALID_OPERATION,
     60      "calling readBuffer with GL_COLOR_ATTACHMENT0 on the default framebuffer should generate INVALID_OPERATION.");
     61 }
     62 
     63 var testReadBufferOnFBO = function() {
     64  gl.readBuffer(gl.BACK);
     65  wtu.glErrorShouldBe(gl, gl.INVALID_OPERATION,
     66      "calling readBuffer with GL_BACK on fbo should generate INVALID_OPERATION.");
     67 
     68  gl.readBuffer(gl.NONE);
     69  wtu.glErrorShouldBe(gl, gl.NO_ERROR,
     70      "calling readBuffer with GL_NONE on fbo should succeed.");
     71  var pixels = new Uint8Array(1 * 1 * 4);
     72  gl.readPixels(0, 0, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, pixels);
     73  wtu.glErrorShouldBe(gl, gl.INVALID_OPERATION,
     74      "should generate INVALID_OPERATION when reading from framebuffer and read buffer is GL_NONE.");
     75  gl.readBuffer(gl.COLOR_ATTACHMENT0);
     76  wtu.glErrorShouldBe(gl, gl.NO_ERROR,
     77      "calling readBuffer with GL_COLOR_ATTACHMENT0 on fbo should succeed.");
     78 
     79  var maxColorAttachments = gl.getParameter(gl.MAX_COLOR_ATTACHMENTS);
     80  gl.readBuffer(gl.COLOR_ATTACHMENT0 + maxColorAttachments);
     81  wtu.glErrorShouldBe(gl, gl.INVALID_OPERATION,
     82      "calling readBuffer with GL_COLOR_ATTACHMENTi that exceeds MAX_COLOR_ATTACHMENT on fbo should generate INVALID_OPERATION.");
     83  gl.readBuffer(gl.COLOR_ATTACHMENT1);
     84  wtu.glErrorShouldBe(gl, gl.NO_ERROR,
     85      "calling readBuffer with GL_COLOR_ATTACHMENT1 on the fbo should succeed.");
     86  shouldBe('gl.getParameter(gl.READ_BUFFER)', 'gl.COLOR_ATTACHMENT1');
     87 }
     88 
     89 debug("");
     90 debug("Canvas.getContext");
     91 
     92 var wtu = WebGLTestUtils;
     93 var canvas = document.getElementById("canvas");
     94 var gl = wtu.create3DContext(canvas, undefined, 2);
     95 if (!gl) {
     96  testFailed("context does not exist");
     97 } else {
     98  testPassed("context exists");
     99 
    100  debug("");
    101  debug("Checking reading from framebuffer.");
    102 
    103  // Test on the default framebuffer. Read buffer is GL_BACK by default.
    104  var backColor = [0, 0, 0, 255];
    105  clearDrawingbuffer(backColor);
    106  validateReadingFromFramebuffer(backColor, gl.NO_ERROR,
    107      "should be no errors when reading from GL_BACK on the default framebuffer.");
    108 
    109  shouldBe('gl.getParameter(gl.READ_BUFFER)', 'gl.BACK');
    110  testReadBufferOnDefaultFB();
    111 
    112  // Test on fbo. Read buffer is GL_COLOR_ATTACHMENT0 by default
    113  var fb = gl.createFramebuffer();
    114  gl.bindFramebuffer(gl.FRAMEBUFFER, fb);
    115  var colorbuffer = setupRenderbuffer(gl.COLOR_ATTACHMENT0);
    116  var red = [255, 0, 0, 255];
    117  clearDrawingbuffer(red);
    118  validateReadingFromFramebuffer(red, gl.NO_ERROR,
    119      "should be no errors when reading from GL_COLOR_ATTACHMENT0 on fbo.");
    120 
    121  shouldBe('gl.getParameter(gl.READ_BUFFER)', 'gl.COLOR_ATTACHMENT0');
    122  testReadBufferOnFBO();
    123 
    124  // Test on user defined read buffer (GL_COLOR_ATTACHMENT1) with or without corresponding image on fbo.
    125  gl.bindFramebuffer(gl.FRAMEBUFFER, fb);
    126  var colorbuffer1 = setupRenderbuffer(gl.COLOR_ATTACHMENT1);
    127  var green = [0, 255, 0, 255];
    128  gl.drawBuffers([gl.NONE, gl.COLOR_ATTACHMENT1]);
    129  clearDrawingbuffer(green);
    130  wtu.glErrorShouldBe(gl, gl.NO_ERROR, "should be no error after setup and clear render buffer");
    131  gl.readBuffer(gl.COLOR_ATTACHMENT1);
    132  validateReadingFromFramebuffer(green, gl.NO_ERROR,
    133      "should be no errors when reading from GL_COLOR_ATTACHMENT1 on fbo.");
    134  shouldBe('gl.getParameter(gl.READ_BUFFER)', 'gl.COLOR_ATTACHMENT1');
    135  // Need to reset draw buffers, otherwise it triggers a mac driver bug.
    136  // We add a separate test for that bug: conformance2/rendering/framebuffer-completeness-unaffected.html
    137  gl.drawBuffers([gl.COLOR_ATTACHMENT0]);
    138 
    139  gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT1, gl.RENDERBUFFER, null)
    140  gl.readBuffer(gl.COLOR_ATTACHMENT1);
    141  validateReadingFromFramebuffer(null, gl.INVALID_OPERATION,
    142      "should generate INVALID_OPERATION when reading from GL_COLOR_ATTACHMENT1 but this attachment has no image currently.");
    143 
    144  // switch to another fbo, read buffer is GL_COLOR_ATTACHMENT0, not GL_COLOR_ATTACHMENT1
    145  var fb1 = gl.createFramebuffer();
    146  gl.bindFramebuffer(gl.FRAMEBUFFER, fb1);
    147  var buffer = setupRenderbuffer(gl.COLOR_ATTACHMENT0);
    148  shouldBe('gl.getParameter(gl.READ_BUFFER)', 'gl.COLOR_ATTACHMENT0');
    149  var blue = [0, 0, 255, 255];
    150  clearDrawingbuffer(blue);
    151  validateReadingFromFramebuffer(blue, gl.NO_ERROR,
    152      "should be no errors when reading from GL_COLOR_ATTACHMENT0 on another fbo.");
    153 
    154  // switch from fbo to default fb, read buffer will switch to GL_BACK from GL_COLOR_ATTACHMENT0
    155  gl.bindFramebuffer(gl.FRAMEBUFFER, null);
    156  shouldBe('gl.getParameter(gl.READ_BUFFER)', 'gl.BACK');
    157  validateReadingFromFramebuffer(backColor, gl.NO_ERROR,
    158      "should be no errors when reading from GL_BACK on the default framebuffer.");
    159 
    160  gl.deleteFramebuffer(fb);
    161  gl.deleteRenderbuffer(colorbuffer);
    162  gl.deleteRenderbuffer(colorbuffer1);
    163  gl.deleteFramebuffer(fb1);
    164  gl.deleteRenderbuffer(buffer);
    165 }
    166 
    167 debug("");
    168 var successfullyParsed = true;
    169 
    170 </script>
    171 <script src="../../js/js-test-post.js"></script>
    172 
    173 </body>
    174 </html>