tor-browser

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

get-buffer-sub-data.html (11452B)


      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>WebGL getBufferSubData test.</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 <script>
     20 "use strict";
     21 description("This test makes sure that getBufferSubData acts as expected governed by WebGL 2.");
     22 
     23 var wtu = WebGLTestUtils;
     24 
     25 var gl = wtu.create3DContext(undefined, undefined, 2);
     26 
     27 var vertices = [
     28     1.1,  1.0,  1.3,
     29    -1.0, -1.0,  -5.0,
     30     5.3, -1.0,  1.0
     31 ];
     32 var floatArray = new Float32Array(vertices);
     33 
     34 wtu.glErrorShouldBe(gl, gl.NO_ERROR, "Should be no errors from setup.");
     35 
     36 var buffer = gl.createBuffer();
     37 gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
     38 gl.bufferData(gl.ARRAY_BUFFER, floatArray, gl.STATIC_DRAW);
     39 
     40 var uninitializedBuffer = gl.createBuffer();
     41 gl.bindBuffer(gl.ARRAY_BUFFER, uninitializedBuffer);
     42 gl.bufferData(gl.ARRAY_BUFFER, 36, gl.STATIC_DRAW);
     43 gl.bindBuffer(gl.ARRAY_BUFFER, null);
     44 
     45 wtu.glErrorShouldBe(gl, gl.NO_ERROR, "Should be no errors from buffer setup.");
     46 
     47 gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
     48 
     49 debug("");
     50 debug("Test that getBufferSubData successfully works reading buffer data from gl.ARRAY_BUFFER");
     51 var retArray = new Float32Array(vertices.length);
     52 wtu.shouldGenerateGLError(gl, gl.NO_ERROR, "gl.getBufferSubData(gl.ARRAY_BUFFER, 0, retArray)");
     53 
     54 debug("Argument must be ArrayBufferView, not ArrayBuffer")
     55 shouldThrow("gl.getBufferSubData(gl.ARRAY_BUFFER, 0, new ArrayBuffer(4))");
     56 wtu.glErrorShouldBe(gl, gl.NO_ERROR, "Should not generate GL error");
     57 debug("Argument must be ArrayBufferView, not null")
     58 shouldThrow("gl.getBufferSubData(gl.ARRAY_BUFFER, 0, null)");
     59 wtu.glErrorShouldBe(gl, gl.NO_ERROR, "Should not generate GL error");
     60 
     61 debug("Check array data to match original data set by the buffer");
     62 shouldBeTrue("areArraysEqual(retArray, floatArray)");
     63 
     64 debug("Test that getBufferSubData successfully works with dstOffset");
     65 retArray = new Float32Array(vertices.length);
     66 wtu.shouldGenerateGLError(gl, gl.NO_ERROR, "gl.getBufferSubData(gl.ARRAY_BUFFER, 0, retArray, 2)");
     67 shouldBeTrue("areArraysEqual(retArray.slice(0, 2), [0, 0])");
     68 shouldBeTrue("areArraysEqual(retArray.slice(2), floatArray.slice(0, floatArray.length - 2))");
     69 
     70 retArray = new Float32Array(vertices.length);
     71 wtu.shouldGenerateGLError(gl, gl.NO_ERROR, "gl.getBufferSubData(gl.ARRAY_BUFFER, 0, retArray, retArray.length)");
     72 shouldBeTrue("areArraysEqual(retArray, [0, 0, 0, 0, 0, 0, 0, 0, 0])");
     73 
     74 debug("Test that getBufferSubData fails when given a dstOffset beyond the end of retArray");
     75 wtu.shouldGenerateGLError(gl, gl.INVALID_VALUE, "gl.getBufferSubData(gl.ARRAY_BUFFER, 0, retArray, retArray.length + 1)");
     76 
     77 debug("Test that getBufferSubData successfully works with dstOffset and length");
     78 retArray = new Float32Array(vertices.length);
     79 wtu.shouldGenerateGLError(gl, gl.NO_ERROR, "gl.getBufferSubData(gl.ARRAY_BUFFER, 0, retArray, 2, 2)");
     80 shouldBeTrue("areArraysEqual(retArray.slice(0, 2), [0, 0])");
     81 shouldBeTrue("areArraysEqual(retArray.slice(2, 4), floatArray.slice(0, 2))");
     82 shouldBeTrue("areArraysEqual(retArray.slice(4), [0, 0, 0, 0, 0])");
     83 
     84 retArray = new Float32Array(vertices.length);
     85 wtu.shouldGenerateGLError(gl, gl.NO_ERROR, "gl.getBufferSubData(gl.ARRAY_BUFFER, 0, retArray, retArray.length - 1, 1)");
     86 shouldBeTrue("areArraysEqual(retArray.slice(0, 8), [0, 0, 0, 0, 0, 0, 0, 0])");
     87 shouldBeTrue("areArraysEqual(retArray.slice(8), floatArray.slice(0, 1))");
     88 
     89 debug("Test that getBufferSubData fails when given a dstOffset+length beyond the end of retArray");
     90 wtu.shouldGenerateGLError(gl, gl.INVALID_VALUE, "gl.getBufferSubData(gl.ARRAY_BUFFER, 0, retArray, retArray.length - 1, 2)");
     91 
     92 debug("Test that getBufferSubData successfully works with srcByteOffset");
     93 retArray = new Float32Array(vertices.length - 2);
     94 const float32Size = Float32Array.BYTES_PER_ELEMENT;
     95 wtu.shouldGenerateGLError(gl, gl.NO_ERROR, "gl.getBufferSubData(gl.ARRAY_BUFFER, 2*float32Size, retArray)");
     96 shouldBeTrue("areArraysEqual(retArray, floatArray.slice(2))");
     97 
     98 retArray = new Float32Array(vertices.length);
     99 wtu.shouldGenerateGLError(gl, gl.NO_ERROR, "gl.getBufferSubData(gl.ARRAY_BUFFER, 2*float32Size, retArray, 2)");
    100 shouldBeTrue("areArraysEqual(retArray.slice(0, 2), [0, 0])");
    101 shouldBeTrue("areArraysEqual(retArray.slice(2), floatArray.slice(2))");
    102 
    103 retArray = new Float32Array(vertices.length);
    104 wtu.shouldGenerateGLError(gl, gl.NO_ERROR, "gl.getBufferSubData(gl.ARRAY_BUFFER, 4*float32Size, retArray, 3, 3)");
    105 shouldBeTrue("areArraysEqual(retArray.slice(0, 3), [0, 0, 0])");
    106 shouldBeTrue("areArraysEqual(retArray.slice(3, 6), floatArray.slice(4, 7))");
    107 shouldBeTrue("areArraysEqual(retArray.slice(6), [0, 0, 0])");
    108 
    109 debug("Test that getBufferSubData fails when given a buffer with its size larger than the original data");
    110 var extraLargeBuffer = new Float32Array(vertices.length + 1);
    111 wtu.shouldGenerateGLError(gl, gl.INVALID_VALUE,
    112                          "gl.getBufferSubData(gl.ARRAY_BUFFER, 0, extraLargeBuffer)",
    113                          "Extra length should generate INVALID_VALUE.");
    114 extraLargeBuffer = new Float32Array(vertices.length - 1);
    115 wtu.shouldGenerateGLError(gl, gl.INVALID_VALUE,
    116                          "gl.getBufferSubData(gl.ARRAY_BUFFER, 2*float32Size, extraLargeBuffer)",
    117                          "Extra length should generate INVALID_VALUE.");
    118 
    119 debug("Test that getBufferSubData fails when offset summed with buffer length is larger than the size of the original data size");
    120 wtu.shouldGenerateGLError(gl, gl.INVALID_VALUE,
    121                          "gl.getBufferSubData(gl.ARRAY_BUFFER, retArray.byteLength + 1, retArray)");
    122 wtu.shouldGenerateGLError(gl, gl.INVALID_VALUE, "gl.getBufferSubData(gl.ARRAY_BUFFER, 1, retArray)");
    123 
    124 debug("Test that getBufferSubData successfully works with offset view into ArrayBuffer");
    125 const verticesLengthInBytes = vertices.length * float32Size;
    126 const retStorage = new ArrayBuffer(4* verticesLengthInBytes); // Over allocate 4x
    127 retArray = new Float32Array(retStorage, verticesLengthInBytes, vertices.length);
    128 wtu.shouldGenerateGLError(gl, gl.NO_ERROR, "gl.getBufferSubData(gl.ARRAY_BUFFER, 0, retArray)");
    129 shouldBeTrue("areArraysEqual(retArray, floatArray)");
    130 
    131 debug("Test that getBufferSubData successfully works with offset view into ArrayBuffer and dstOffset");
    132 retArray = new Float32Array(retStorage, verticesLengthInBytes, vertices.length);
    133 retArray.fill(0);
    134 wtu.shouldGenerateGLError(gl, gl.NO_ERROR, "gl.getBufferSubData(gl.ARRAY_BUFFER, 0, retArray, 2)");
    135 shouldBeTrue("areArraysEqual(retArray.slice(0, 2), [0, 0])");
    136 shouldBeTrue("areArraysEqual(retArray.slice(2), floatArray.slice(0, floatArray.length - 2))");
    137 
    138 retArray = new Float32Array(retStorage, verticesLengthInBytes, vertices.length);
    139 retArray.fill(0);
    140 wtu.shouldGenerateGLError(gl, gl.NO_ERROR, "gl.getBufferSubData(gl.ARRAY_BUFFER, 0, retArray, retArray.length)");
    141 shouldBeTrue("areArraysEqual(retArray, [0, 0, 0, 0, 0, 0, 0, 0, 0])");
    142 
    143 debug("Test that getBufferSubData fails when given a dstOffset beyond the end of offset view into ArrayBuffer");
    144 wtu.shouldGenerateGLError(gl, gl.INVALID_VALUE, "gl.getBufferSubData(gl.ARRAY_BUFFER, 0, retArray, retArray.length + 1)");
    145 
    146 debug("Test that getBufferSubData successfully works with offset view into ArrayBuffer and dstOffset and length");
    147 retArray = new Float32Array(retStorage, verticesLengthInBytes, vertices.length);
    148 retArray.fill(0);
    149 wtu.shouldGenerateGLError(gl, gl.NO_ERROR, "gl.getBufferSubData(gl.ARRAY_BUFFER, 0, retArray, 2, 2)");
    150 shouldBeTrue("areArraysEqual(retArray.slice(0, 2), [0, 0])");
    151 shouldBeTrue("areArraysEqual(retArray.slice(2, 4), floatArray.slice(0, 2))");
    152 shouldBeTrue("areArraysEqual(retArray.slice(4), [0, 0, 0, 0, 0])");
    153 
    154 retArray = new Float32Array(retStorage, verticesLengthInBytes, vertices.length);
    155 retArray.fill(0);
    156 wtu.shouldGenerateGLError(gl, gl.NO_ERROR, "gl.getBufferSubData(gl.ARRAY_BUFFER, 0, retArray, retArray.length - 1, 1)");
    157 shouldBeTrue("areArraysEqual(retArray.slice(0, 8), [0, 0, 0, 0, 0, 0, 0, 0])");
    158 shouldBeTrue("areArraysEqual(retArray.slice(8), floatArray.slice(0, 1))");
    159 
    160 debug("Test that getBufferSubData fails when given a dstOffset+length beyond the end of offset view into ArrayBuffer");
    161 wtu.shouldGenerateGLError(gl, gl.INVALID_VALUE, "gl.getBufferSubData(gl.ARRAY_BUFFER, 0, retArray, retArray.length - 1, 2)");
    162 
    163 debug("Test that getBufferSubData successfully works with offset view into ArrayBuffer and srcByteOffset");
    164 retArray = new Float32Array(retStorage, verticesLengthInBytes, vertices.length - 2);
    165 retArray.fill(0);
    166 wtu.shouldGenerateGLError(gl, gl.NO_ERROR, "gl.getBufferSubData(gl.ARRAY_BUFFER, 2*float32Size, retArray)");
    167 shouldBeTrue("areArraysEqual(retArray, floatArray.slice(2))");
    168 
    169 retArray = new Float32Array(retStorage, verticesLengthInBytes, vertices.length);
    170 retArray.fill(0);
    171 wtu.shouldGenerateGLError(gl, gl.NO_ERROR, "gl.getBufferSubData(gl.ARRAY_BUFFER, 2*float32Size, retArray, 2)");
    172 shouldBeTrue("areArraysEqual(retArray.slice(0, 2), [0, 0])");
    173 shouldBeTrue("areArraysEqual(retArray.slice(2), floatArray.slice(2))");
    174 
    175 retArray = new Float32Array(retStorage, verticesLengthInBytes, vertices.length);
    176 retArray.fill(0);
    177 wtu.shouldGenerateGLError(gl, gl.NO_ERROR, "gl.getBufferSubData(gl.ARRAY_BUFFER, 4*float32Size, retArray, 3, 3)");
    178 shouldBeTrue("areArraysEqual(retArray.slice(0, 3), [0, 0, 0])");
    179 shouldBeTrue("areArraysEqual(retArray.slice(3, 6), floatArray.slice(4, 7))");
    180 shouldBeTrue("areArraysEqual(retArray.slice(6), [0, 0, 0])");
    181 
    182 debug("Test that getBufferSubData fails when 0 is bound to the target");
    183 gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, null);
    184 wtu.shouldGenerateGLError(gl, gl.INVALID_OPERATION,
    185                          "gl.getBufferSubData(gl.ELEMENT_ARRAY_BUFFER, 0, retArray)");
    186 
    187 debug("Test that getBufferSubData fails when offset is less than 0");
    188 wtu.shouldGenerateGLError(gl, gl.INVALID_VALUE, "gl.getBufferSubData(gl.ARRAY_BUFFER, -1, retArray)");
    189 
    190 debug("");
    191 debug("Test that getBufferSubData successfully works with uninitialized buffers");
    192 retArray = new Float32Array([1, 2, 3, 4, 5, 6, 7, 8, 9]);
    193 gl.bindBuffer(gl.ARRAY_BUFFER, uninitializedBuffer);
    194 wtu.shouldGenerateGLError(gl, gl.NO_ERROR,
    195    "gl.getBufferSubData(gl.ARRAY_BUFFER, 0, retArray)");
    196 shouldBeTrue("areArraysEqual(retArray, [0, 0, 0, 0, 0, 0, 0, 0, 0])");
    197 
    198 debug("");
    199 debug("Test that getBufferSubData works when a buffer is immediately resized to be too small");
    200 
    201 retArray = new Float32Array([1, 2, 3, 4, 5, 6, 7, 8, 9]);
    202 gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
    203 wtu.shouldGenerateGLError(gl, gl.NO_ERROR,
    204    "gl.getBufferSubData(gl.ARRAY_BUFFER, 0, retArray)");
    205 gl.bufferData(gl.ARRAY_BUFFER, 4, gl.STATIC_DRAW);
    206 shouldBeTrue("areArraysEqual(retArray, floatArray)");
    207 
    208 debug("");
    209 debug("Test that getBufferSubData works when a buffer is immediately deleted");
    210 retArray = new Float32Array([1, 2, 3, 4, 5, 6, 7, 8, 9]);
    211 gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
    212 gl.bufferData(gl.ARRAY_BUFFER, floatArray, gl.STATIC_DRAW);
    213 wtu.shouldGenerateGLError(gl, gl.NO_ERROR,
    214    "gl.getBufferSubData(gl.ARRAY_BUFFER, 0, retArray)");
    215 gl.deleteBuffer(buffer);
    216 shouldBeTrue("areArraysEqual(retArray, floatArray)");
    217 
    218 finishTest();
    219 
    220 var successfullyParsed = true;
    221 </script>
    222 </body>
    223 </html>