tor-browser

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

bind-framebuffer-flush-bug.html (4878B)


      1 <!--
      2 Copyright (c) 2020 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 <link rel="stylesheet" href="../../resources/js-test-style.css"/>
     12 <script src="../../js/js-test-pre.js"></script>
     13 <script src="../../js/webgl-test-utils.js"></script>
     14 <script>
     15 "use strict";
     16 const wtu = WebGLTestUtils;
     17 
     18 function runTest() {
     19    let canvas = document.createElement('canvas');
     20    document.body.appendChild(canvas);
     21    const gl = wtu.create3DContext(canvas);
     22    if (!gl) {
     23        testFailed('could not create context');
     24        return;
     25    }
     26    const size = 100;
     27 
     28    debug('Setup');
     29    canvas.width = size;
     30    canvas.height = size;
     31 
     32    const texture = gl.createTexture();
     33    gl.bindTexture(gl.TEXTURE_2D, texture);
     34    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
     35    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
     36    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
     37    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
     38    gl.bindTexture(gl.TEXTURE_2D, texture);
     39    gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, size, size, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
     40 
     41    const backbuffer = gl.createFramebuffer();
     42    gl.bindFramebuffer(gl.FRAMEBUFFER, backbuffer);
     43    gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0);
     44 
     45    const vertexBuffer = gl.createBuffer();
     46    gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
     47    gl.bufferData(gl.ARRAY_BUFFER, 32, gl.DYNAMIC_DRAW);
     48    gl.bufferSubData(gl.ARRAY_BUFFER, 0, new Float32Array([
     49        1, 1,
     50        1, -1,
     51        -1, 1,
     52        -1, -1,
     53    ]));
     54    gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 8, 0);
     55    gl.enableVertexAttribArray(0);
     56 
     57    const blitTextureProgram = gl.createProgram();
     58    const blitTextureVertex = gl.createShader(gl.VERTEX_SHADER);
     59    gl.shaderSource(blitTextureVertex, `
     60        precision mediump float;
     61        attribute vec2 pos;
     62        varying vec2 uv;
     63        void main(){
     64            uv = (pos + vec2(1.0)) / 2.0;
     65            gl_Position=vec4(pos*2.-1.,0.,1.);
     66        }
     67    `);
     68    gl.compileShader(blitTextureVertex);
     69    gl.attachShader(blitTextureProgram, blitTextureVertex);
     70    const blitTextureFragment = gl.createShader(gl.FRAGMENT_SHADER);
     71    gl.shaderSource(blitTextureFragment, `
     72        precision mediump float;
     73        uniform sampler2D texture;
     74        varying vec2 uv;
     75        void main(){
     76            gl_FragColor=texture2D(texture, uv);
     77        }
     78    `);
     79    gl.compileShader(blitTextureFragment);
     80    gl.attachShader(blitTextureProgram, blitTextureFragment);
     81    gl.linkProgram(blitTextureProgram);
     82 
     83    const solidColorProgram = gl.createProgram();
     84    const solidColorVertex = gl.createShader(gl.VERTEX_SHADER);
     85    gl.shaderSource(solidColorVertex, `
     86        precision mediump float;
     87        attribute vec2 pos;
     88        void main(){
     89            gl_Position=vec4(pos,0.,1.);
     90        }
     91    `);
     92    gl.compileShader(solidColorVertex);
     93    gl.attachShader(solidColorProgram, solidColorVertex);
     94    const solidColorFragment = gl.createShader(gl.FRAGMENT_SHADER);
     95    gl.shaderSource(solidColorFragment, `
     96        precision mediump float;
     97        void main(){
     98            gl_FragColor=vec4(0.,0.,1.,1.);
     99        }
    100    `);
    101    gl.compileShader(solidColorFragment);
    102    gl.attachShader(solidColorProgram, solidColorFragment);
    103    gl.bindAttribLocation(solidColorProgram, 0, "pos");
    104    gl.linkProgram(solidColorProgram);
    105    gl.clearColor(1, 0, 0, 1);
    106 
    107    debug('Drawing');
    108    // Draw blue rectangle to backbuffer texture
    109    gl.bindFramebuffer(gl.FRAMEBUFFER, backbuffer);
    110    gl.useProgram(solidColorProgram);
    111    gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
    112 
    113    // Blit backbuffer texture to screen
    114    gl.bindFramebuffer(gl.FRAMEBUFFER, null);
    115    gl.useProgram(blitTextureProgram);
    116    gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
    117 
    118    // Clear backbuffer texture to red
    119    gl.bindFramebuffer(gl.FRAMEBUFFER, backbuffer);
    120    gl.clear(gl.COLOR_BUFFER_BIT);
    121 
    122    // Blit backbuffer texture to screen
    123    gl.bindFramebuffer(gl.FRAMEBUFFER, null);
    124    gl.useProgram(blitTextureProgram);
    125    gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
    126 
    127    debug('Expected: canvas should be red');
    128    debug('Buggy: canvas is blue');
    129    wtu.checkCanvasRect(gl, 0, 0, 1, 1, [255, 0, 0], 'should be red');
    130 }
    131 </script>
    132 </head>
    133 <body>
    134 <div id="description"></div>
    135 <div id="console"></div>
    136 <script>
    137 "use strict";
    138 description('Verifies workaround for bug in Intel drivers where clear and drawArrays calls are reordered across bindFramebuffer.');
    139 debug('Regression test for <a href="http://crbug.com/1018028">http://crbug.com/1018028</a>');
    140 runTest();
    141 var successfullyParsed = true;
    142 </script>
    143 <script src="../../js/js-test-post.js"></script>
    144 
    145 </body>
    146 </html>