tor-browser

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

xrWebGLLayer_opaque_framebuffer.https.html (4699B)


      1 <!DOCTYPE html>
      2 <script src="/resources/testharness.js"></script>
      3 <script src="/resources/testharnessreport.js"></script>
      4 <script src="resources/webxr_util.js"></script>
      5 <script src="resources/webxr_test_constants.js"></script>
      6 
      7 <script>
      8 let immersiveTestName = "Ensure that the framebuffer given by the WebGL layer" +
      9  " is opaque for immersive";
     10 let nonImmersiveTestName = "Ensure that the framebuffer given by the WebGL layer" +
     11  " is opaque for non-immersive";
     12 
     13 let fakeDeviceInitParams = TRACKED_IMMERSIVE_DEVICE;
     14 
     15 let testFunction =
     16  (session, fakeDeviceController, t, sessionObjects) => new Promise((resolve, reject) => {
     17  let gl = sessionObjects.gl;
     18  let webglLayer = sessionObjects.glLayer;
     19  let xrFramebuffer = webglLayer.framebuffer;
     20 
     21  // Make sure we're starting with a clean error slate.
     22  assert_equals(gl.getError(), gl.NO_ERROR);
     23 
     24  if (session.mode == 'inline') {
     25    // Creating a layer with an inline session should return a framebuffer of
     26    // null, and as such most of these tests won't apply.
     27    assert_equals(xrFramebuffer, null);
     28    resolve();
     29    return;
     30  }
     31 
     32  assert_not_equals(xrFramebuffer, null);
     33 
     34  // The XR framebuffer is not bound to the GL context by default.
     35  assert_not_equals(xrFramebuffer, gl.getParameter(gl.FRAMEBUFFER_BINDING));
     36 
     37  assert_greater_than(webglLayer.framebufferWidth, 0);
     38  assert_greater_than(webglLayer.framebufferHeight, 0);
     39 
     40  gl.bindFramebuffer(gl.FRAMEBUFFER, xrFramebuffer);
     41  assert_equals(gl.getError(), gl.NO_ERROR);
     42 
     43  gl.deleteFramebuffer(xrFramebuffer);
     44  assert_equals(gl.getError(), gl.INVALID_OPERATION);
     45 
     46  // Make sure the framebuffer is still bound after failed attempt to delete.
     47  let boundFramebuffer = gl.getParameter(gl.FRAMEBUFFER_BINDING);
     48  assert_equals(xrFramebuffer, boundFramebuffer);
     49  assert_equals(gl.getError(), gl.NO_ERROR);
     50 
     51  // WebGL 2 does not throw an error and instead returns 0 when there are no
     52  // attachments
     53  if (gl.getParameter(gl.VERSION).includes("WebGL 1.0")) {
     54    // Ensure the framebuffer attachment properties cannot be inspected.
     55    let attachments = [
     56      gl.COLOR_ATTACHMENT0,
     57      gl.DEPTH_ATTACHMENT,
     58      gl.STENCIL_ATTACHMENT,
     59    ];
     60 
     61    let parameters = [
     62      gl.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE,
     63      gl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME,
     64      gl.FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL,
     65      gl.FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE,
     66    ];
     67 
     68    for (let attachment of attachments) {
     69      for (let parameter of parameters) {
     70        let value = gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, attachment, parameter);
     71        assert_equals(value, null);
     72        assert_equals(gl.getError(), gl.INVALID_OPERATION);
     73      }
     74    }
     75  }
     76 
     77  let width = 64;
     78  let height = 64;
     79 
     80  // Ensure the framebuffer texture 2D attachmentments cannot be changed.
     81  var texture = gl.createTexture();
     82  gl.bindTexture(gl.TEXTURE_2D, texture);
     83  gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
     84  gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
     85  gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
     86  gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
     87  gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
     88 
     89  gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0);
     90  assert_equals(gl.getError(), gl.INVALID_OPERATION);
     91 
     92  // Ensure the framebuffer renderbuffer attachmentments cannot be changed.
     93  let renderbuffer = gl.createRenderbuffer();
     94  gl.bindRenderbuffer(gl.RENDERBUFFER, renderbuffer);
     95  gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_COMPONENT16, width, height);
     96  gl.framebufferRenderbuffer(
     97    gl.FRAMEBUFFER,
     98    gl.DEPTH_ATTACHMENT,
     99    gl.RENDERBUFFER,
    100    renderbuffer);
    101  assert_equals(gl.getError(), gl.INVALID_OPERATION);
    102 
    103  gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_STENCIL, width, height);
    104  gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_STENCIL_ATTACHMENT, gl.RENDERBUFFER, renderbuffer);
    105  assert_equals(gl.getError(), gl.INVALID_OPERATION);
    106 
    107  // Framebuffer status must be unsupported outside of a XR frame callback.
    108  assert_equals(gl.checkFramebufferStatus(gl.FRAMEBUFFER), gl.FRAMEBUFFER_UNSUPPORTED);
    109 
    110  session.requestAnimationFrame((time, xrFrame) => {
    111    // Framebuffer status must be complete inside of a XR frame callback.
    112    assert_equals(gl.checkFramebufferStatus(gl.FRAMEBUFFER), gl.FRAMEBUFFER_COMPLETE);
    113    // Finished.
    114    resolve();
    115  });
    116 });
    117 
    118 xr_session_promise_test(
    119  immersiveTestName, testFunction, fakeDeviceInitParams, 'immersive-vr');
    120 
    121 xr_session_promise_test(
    122  nonImmersiveTestName, testFunction, fakeDeviceInitParams, 'inline');
    123 
    124 </script>