tor-browser

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

buffer-data-and-buffer-sub-data.html (7837B)


      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 <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 </head>
     15 <body>
     16 <div id="description"></div>
     17 <div id="console"></div>
     18 
     19 <script>
     20 "use strict";
     21 description("Test bufferData/bufferSubData with or without ArrayBuffer input");
     22 
     23 debug('Regression test for <a href="https://bugs.webkit.org/show_bug.cgi?id=41884">https://bugs.webkit.org/show_bug.cgi?id=41884</a> : <code>Implement bufferData and bufferSubData with ArrayBuffer as input</code>');
     24 
     25 var wtu = WebGLTestUtils;
     26 var gl = wtu.create3DContext();
     27 if (!gl) {
     28    testFailed("WebGL context does not exist");
     29 } else {
     30    testPassed("WebGL context exists");
     31 
     32    bufferDataTest();
     33    bufferDataSizesTest();
     34 
     35    bufferSubDataTest();
     36 }
     37 
     38 function bufferDataTest() {
     39    debug("");
     40    debug("Test bufferData without ArrayBuffer input");
     41 
     42    var buf = gl.createBuffer();
     43    shouldBeNonNull(buf);
     44 
     45    gl.bufferData(gl.ARRAY_BUFFER, 4, gl.STATIC_DRAW);
     46    wtu.glErrorShouldBe(gl, gl.INVALID_OPERATION, "no buffer bound");
     47 
     48    gl.bindBuffer(gl.ARRAY_BUFFER, buf);
     49    wtu.glErrorShouldBe(gl, gl.NO_ERROR);
     50 
     51    gl.bufferData(gl.ARRAY_BUFFER, -4, gl.STATIC_DRAW);
     52    wtu.glErrorShouldBe(gl, gl.INVALID_VALUE,
     53        "calling bufferData when buffer size is negative should generate INVALID_VALUE");
     54 
     55    gl.bufferData(gl.ARRAY_BUFFER, null, gl.STATIC_DRAW);
     56    wtu.glErrorShouldBe(gl, gl.INVALID_VALUE,
     57        "calling bufferData when BufferDataSource is null should generate INVALID_VALUE");
     58 
     59    gl.bufferData(gl.ARRAY_BUFFER, undefined, gl.STATIC_DRAW);
     60    wtu.glErrorShouldBe(gl, gl.INVALID_VALUE,
     61        "calling bufferData when BufferDataSource is undefined should generate INVALID_VALUE");
     62 
     63    gl.bindBuffer(gl.ARRAY_BUFFER, null);
     64 }
     65 
     66 function bufferDataSizesTest() {
     67    debug("");
     68    debug("Test bufferData overloads");
     69 
     70    // bufferData has an integer overload and an ArrayBuffer overload.
     71    // Per the WebIDL spec, the overload resolution algorithm should resolve types as follows:
     72    // - If the argument is null or undefined, pick the nullable type, which is ArrayBuffer.
     73    //   Per the WebGL spec, null should flag INVALID_VALUE.
     74    // - If the argument is an ArrayBuffer, then pick the ArrayBuffer overload
     75    // - Everything else should pick the numeric overload. This means things like objects, strings,
     76    //   floating point numbers, arrays of numbers and strings, etc should convert themselves to a number.
     77    var bufferDataParams = [
     78        { parameter: 0, expectedBufferSize: 0 },
     79        { parameter: 4, expectedBufferSize: 4 },
     80        { parameter: 5.1, expectedBufferSize: 5 },
     81        { parameter: 5.8, expectedBufferSize: 5 },
     82        { parameter: 5.5, expectedBufferSize: 5 },
     83 
     84        { parameter: "4", expectedBufferSize: 4 },
     85        { parameter: "5.1", expectedBufferSize: 5 },
     86        { parameter: "5.8", expectedBufferSize: 5 },
     87        { parameter: "5.5", expectedBufferSize: 5 },
     88        { parameter: "0", expectedBufferSize: 0 },
     89 
     90        { parameter: [42, 64], expectedBufferSize: 0 },
     91        { parameter: [42], expectedBufferSize: 42 },
     92        { parameter: ["42"], expectedBufferSize: 42 },
     93        { parameter: ["42", "64"], expectedBufferSize: 0 },
     94 
     95        { parameter: new ArrayBuffer(0), expectedBufferSize: 0 },
     96        { parameter: new ArrayBuffer(4), expectedBufferSize: 4 },
     97        { parameter: new Uint8Array(new ArrayBuffer(5)), expectedBufferSize: 5 },
     98        { parameter: new DataView(new ArrayBuffer(7)), expectedBufferSize: 7 },
     99 
    100        { parameter: "WebGL Rocks!", expectedBufferSize: 0 },
    101        { parameter: { mystring: "WebGL Rocks!" }, expectedBufferSize: 0 },
    102    ];
    103 
    104    if (window.SharedArrayBuffer) {
    105        bufferDataParams.push(
    106            { parameter: new SharedArrayBuffer(3), expectedBufferSize: 3 },
    107            { parameter: new Uint8Array(new SharedArrayBuffer(6)), expectedBufferSize: 6 },
    108            { parameter: new DataView(new SharedArrayBuffer(8)), expectedBufferSize: 8 }
    109        );
    110    }
    111 
    112    bufferDataParams.forEach(function (bufferDataParam) {
    113        var buffer = gl.createBuffer();
    114        gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
    115        gl.bufferData(gl.ARRAY_BUFFER, bufferDataParam.parameter, gl.STATIC_DRAW);
    116        wtu.glErrorShouldBe(gl, gl.NO_ERROR, "Passing " + bufferDataParam.parameter + " to bufferData");
    117 
    118        shouldEvaluateTo("gl.getBufferParameter(gl.ARRAY_BUFFER, gl.BUFFER_SIZE)", bufferDataParam.expectedBufferSize);
    119    });
    120 
    121    gl.bindBuffer(gl.ARRAY_BUFFER, null);
    122 }
    123 
    124 function bufferSubDataTest() {
    125    debug("");
    126    debug("Test bufferSubData");
    127 
    128    var buf = gl.createBuffer();
    129    gl.bindBuffer(gl.ARRAY_BUFFER, buf);
    130 
    131    gl.bufferSubData(gl.ARRAY_BUFFER, 0, new ArrayBuffer(1));
    132    wtu.glErrorShouldBe(gl, gl.INVALID_VALUE, "Calling bufferSubData before bufferData should fail");
    133 
    134    gl.bufferData(gl.ARRAY_BUFFER, 128, gl.STATIC_DRAW);
    135    wtu.glErrorShouldBe(gl, gl.NO_ERROR);
    136 
    137    var array = new ArrayBuffer(64);
    138 
    139    gl.bufferSubData(gl.ARRAY_BUFFER, -10, array);
    140    wtu.glErrorShouldBe(gl, gl.INVALID_VALUE,
    141        "calling bufferSubData with ArrayBuffer when offset is negative should INVALID_VALUE");
    142 
    143    gl.bufferSubData(gl.ARRAY_BUFFER, 65, array);
    144    wtu.glErrorShouldBe(gl, gl.INVALID_VALUE, "buffer overflow");
    145 
    146    gl.bufferSubData(gl.ARRAY_BUFFER, -10, new Float32Array(8));
    147    wtu.glErrorShouldBe(gl, gl.INVALID_VALUE,
    148        "calling bufferSubData with ArrayBufferView when offset is negative should generate INVALID_VALUE");
    149 
    150    gl.bufferSubData(gl.ARRAY_BUFFER, 10, array);
    151    wtu.glErrorShouldBe(gl, gl.NO_ERROR,
    152        "calling bufferSubData with ArrayBuffer should succeed");
    153 
    154    gl.bufferSubData(gl.ARRAY_BUFFER, 10, new Float32Array(0));
    155    wtu.glErrorShouldBe(gl, gl.NO_ERROR,
    156        "calling bufferSubData with zero-sized ArrayBufferView should succeed");
    157 
    158    // Arguments that are not ArrayBuffers, null or undefined should throw a TypeError exception
    159    shouldThrow("gl.bufferSubData(gl.ARRAY_BUFFER, 0, 42);");
    160    shouldThrow("gl.bufferSubData(gl.ARRAY_BUFFER, 0, 5.5);");
    161    shouldThrow("gl.bufferSubData(gl.ARRAY_BUFFER, 0, \"5.5\");");
    162    shouldThrow("gl.bufferSubData(gl.ARRAY_BUFFER, 0, [4]);");
    163    shouldThrow("gl.bufferSubData(gl.ARRAY_BUFFER, 0, { mynumber: 42});");
    164    shouldThrow("gl.bufferSubData(gl.ARRAY_BUFFER, 10, null)");
    165    shouldThrow("gl.bufferSubData(gl.ARRAY_BUFFER, 10, undefined)");
    166 
    167    if (window.SharedArrayBuffer) {
    168        const validDatas = [
    169            'new SharedArrayBuffer(3)',
    170            'new Uint8Array(new SharedArrayBuffer(3))',
    171            'new DataView(new SharedArrayBuffer(3))',
    172        ];
    173        for (const x of validDatas) {
    174            shouldNotThrow(`gl.bufferSubData(gl.ARRAY_BUFFER, 0, ${x})`);
    175        }
    176    }
    177 
    178    wtu.glErrorShouldBe(gl, gl.NO_ERROR, "should generate no GL error");
    179 
    180    // -
    181    // Firefox bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1611837
    182 
    183    gl.bindBuffer(gl.ARRAY_BUFFER, null);
    184    gl.bufferSubData(gl.ARRAY_BUFFER, 0, new ArrayBuffer(0));
    185    wtu.glErrorShouldBe(gl, gl.INVALID_OPERATION,
    186        "Calling bufferSubData with empty ArrayBuffer and null WebGLBuffer should fail");
    187 
    188    gl.bindBuffer(gl.ARRAY_BUFFER, gl.createBuffer());
    189    gl.bufferSubData(gl.ARRAY_BUFFER, 0, new ArrayBuffer(0));
    190    wtu.glErrorShouldBe(gl, 0,
    191        "Calling bufferSubData with empty ArrayBuffer and non-null WebGLBuffer should succeed");
    192 
    193    // -
    194 
    195    gl.bindBuffer(gl.ARRAY_BUFFER, null);
    196 }
    197 
    198 var successfullyParsed = true;
    199 </script>
    200 
    201 <script src="../../js/js-test-post.js"></script>
    202 </body>
    203 </html>