tor-browser

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

buffer-copying-contents.html (5594B)


      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 buffer copying contents 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("Test copying a buffer's contents to another buffer governed by the WebGL 2 spec.");
     22 
     23 var wtu = WebGLTestUtils;
     24 
     25 var gl = wtu.create3DContext(undefined, undefined, 2);
     26 wtu.glErrorShouldBe(gl, gl.NO_ERROR, "Should be no errors from setup.");
     27 
     28 var vertices = [
     29     1.1,  1.0,  1.3,
     30    -1.0, -1.0,  -5.0,
     31     5.3, -1.0,  1.0
     32 ];
     33 
     34 debug("");
     35 debug("Test copying between buffers returns correct data");
     36 
     37 function testCopyBuffers(srcTarget, dstTarget, copyRead, copyWrite) {
     38  var msg = "Copying from " + targetToString(gl, srcTarget) +
     39      " to " + targetToString(gl, dstTarget)
     40  if (copyRead && copyWrite)
     41    msg += " via COPY_READ_BUFFER and COPY_WRITE_BUFFER"
     42  else if (copyRead)
     43    msg += " via COPY_READ_BUFFER"
     44  else if (copyWrite)
     45    msg += " via COPY_WRITE_BUFFER"
     46  else
     47    msg += " directly"
     48  debug("")
     49  debug(msg)
     50 
     51  var srcBuffer = gl.createBuffer(), dstBuffer = gl.createBuffer();
     52  var originalData = new Float32Array(vertices);
     53  var length = vertices.length * 4;
     54 
     55  gl.bindBuffer(srcTarget, srcBuffer);
     56  gl.bufferData(srcTarget, originalData, gl.STATIC_DRAW);
     57  if (copyRead)
     58    gl.bindBuffer(gl.COPY_READ_BUFFER, srcBuffer);
     59 
     60  gl.bindBuffer(dstTarget, dstBuffer);
     61  gl.bufferData(dstTarget, new Float32Array(length), gl.STATIC_DRAW);
     62  if (copyWrite)
     63    gl.bindBuffer(gl.COPY_WRITE_BUFFER, dstBuffer);
     64 
     65  var expectedGLError = gl.NO_ERROR;
     66 
     67  if (srcTarget == dstTarget) {
     68    if (!copyRead && copyWrite) {
     69      // srcBuffer isn't bound to any targets because of setting up dstBuffer.
     70      gl.bindBuffer(srcTarget, srcBuffer);
     71    }
     72    if (!copyRead && !copyWrite) {
     73      // Same buffer object, overlapping range.
     74      expectedGLError = gl.INVALID_VALUE;
     75    }
     76  }
     77  if ((srcTarget == gl.ELEMENT_ARRAY_BUFFER &&
     78       dstTarget != gl.ELEMENT_ARRAY_BUFFER) ||
     79      (srcTarget != gl.ELEMENT_ARRAY_BUFFER &&
     80       dstTarget == gl.ELEMENT_ARRAY_BUFFER)) {
     81    expectedGLError = gl.INVALID_OPERATION;
     82  }
     83 
     84  gl.copyBufferSubData(copyRead ? gl.COPY_READ_BUFFER : srcTarget,
     85                       copyWrite ? gl.COPY_WRITE_BUFFER : dstTarget,
     86                       0, 0, length);
     87  if (expectedGLError == gl.NO_ERROR) {
     88    wtu.glErrorShouldBe(gl, gl.NO_ERROR, "Copying should work");
     89 
     90    var retBuffer = new Uint8Array(length);
     91    gl.getBufferSubData(dstTarget, 0, retBuffer);
     92    wtu.glErrorShouldBe(gl, gl.NO_ERROR,
     93        "gl.getBufferSubData(" + targetToString(gl, dstTarget) +
     94        ", 0, retBuffer) should work");
     95 
     96    var failed = false;
     97    var retArray = new Float32Array(retBuffer.buffer);
     98    for (var i = 0; i < vertices.length; i++) {
     99      if (originalData[i] != retArray[i]) {
    100        failed = true;
    101        break;
    102      }
    103    }
    104    if (failed)
    105      testFailed("The returned array buffer fails to match original data");
    106    else
    107      testPassed("The returned array buffer matches original data");
    108  } else {
    109    wtu.glErrorShouldBe(gl, expectedGLError, "Copying should fail");
    110  }
    111 
    112  gl.deleteBuffer(srcBuffer);
    113  gl.deleteBuffer(dstBuffer);
    114  shouldBeNull("gl.getParameter(gl.ARRAY_BUFFER_BINDING)");
    115  shouldBeNull("gl.getParameter(gl.COPY_READ_BUFFER_BINDING)");
    116  shouldBeNull("gl.getParameter(gl.COPY_WRITE_BUFFER_BINDING)");
    117  shouldBeNull("gl.getParameter(gl.ELEMENT_ARRAY_BUFFER_BINDING)");
    118  shouldBeNull("gl.getParameter(gl.PIXEL_PACK_BUFFER_BINDING)");
    119  shouldBeNull("gl.getParameter(gl.PIXEL_UNPACK_BUFFER_BINDING)");
    120  shouldBeNull("gl.getParameter(gl.TRANSFORM_FEEDBACK_BUFFER_BINDING)");
    121  shouldBeNull("gl.getParameter(gl.UNIFORM_BUFFER_BINDING)");
    122 }
    123 
    124 function targetToString(gl, target) {
    125  switch (target) {
    126    case gl.ARRAY_BUFFER:
    127      return "ARRAY_BUFFER";
    128    case gl.COPY_READ_BUFFER:
    129      return "COPY_READ_BUFFER";
    130    case gl.COPY_WRITE_BUFFER:
    131      return "COPY_WRITE_BUFFER";
    132    case gl.ELEMENT_ARRAY_BUFFER:
    133      return "ELEMENT_ARRAY_BUFFER";
    134    case gl.PIXEL_PACK_BUFFER:
    135      return "PIXEL_PACK_BUFFER";
    136    case gl.PIXEL_UNPACK_BUFFER:
    137      return "PIXEL_UNPACK_BUFFER";
    138    case gl.TRANSFORM_FEEDBACK_BUFFER:
    139      return "TRANSFORM_FEEDBACK_BUFFER";
    140    case gl.UNIFORM_BUFFER:
    141      return "UNIFORM_BUFFER";
    142    default:
    143      return "UNKNOWN BUFFER";
    144  }
    145 }
    146 
    147 var targets = [
    148  gl.ARRAY_BUFFER,
    149  gl.ELEMENT_ARRAY_BUFFER,
    150  gl.PIXEL_PACK_BUFFER,
    151  gl.PIXEL_UNPACK_BUFFER,
    152  gl.TRANSFORM_FEEDBACK_BUFFER,
    153  gl.UNIFORM_BUFFER,
    154 ]
    155 
    156 for (var srcIndex in targets) {
    157  for (var dstIndex in targets) {
    158    if (targets[srcIndex] != gl.TRANSFORM_FEEDBACK_BUFFER &&
    159        targets[dstIndex] != gl.TRANSFORM_FEEDBACK_BUFFER) {
    160      testCopyBuffers(targets[srcIndex], targets[dstIndex], true, true);
    161    }
    162    if (targets[srcIndex] != gl.TRANSFORM_FEEDBACK_BUFFER) {
    163      testCopyBuffers(targets[srcIndex], targets[dstIndex], true, false);
    164    }
    165    if (targets[dstIndex] != gl.TRANSFORM_FEEDBACK_BUFFER) {
    166      testCopyBuffers(targets[srcIndex], targets[dstIndex], false, true);
    167    }
    168    testCopyBuffers(targets[srcIndex], targets[dstIndex], false, false);
    169  }
    170 }
    171 
    172 var successfullyParsed = true;
    173 </script>
    174 <script src="../../js/js-test-post.js"></script>
    175 </body>
    176 </html>