tor-browser

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

xrWebGLLayer_framebuffer_draw.https.html (2913B)


      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 
      9 let testName =
     10  "Ensure a WebGL layer's framebuffer can only be drawn to inside a XR frame";
     11 
     12 let fakeDeviceInitParams = TRACKED_IMMERSIVE_DEVICE;
     13 
     14 // Very simple program setup with no error checking.
     15 function setupProgram(gl, vertexSrc, fragmentSrc) {
     16  let program = gl.createProgram();
     17 
     18  let vertexShader = gl.createShader(gl.VERTEX_SHADER);
     19  gl.shaderSource(vertexShader, vertexSrc);
     20  gl.compileShader(vertexShader);
     21  gl.attachShader(program, vertexShader);
     22 
     23  let fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);
     24  gl.shaderSource(fragmentShader, fragmentSrc);
     25  gl.compileShader(fragmentShader);
     26  gl.attachShader(program, fragmentShader);
     27 
     28  gl.linkProgram(program);
     29  gl.useProgram(program);
     30 
     31  return program;
     32 }
     33 
     34 let testFunction =
     35  (session, fakeDeviceController, t, sessionObjects) => new Promise((resolve, reject) => {
     36  let gl = sessionObjects.gl;
     37  let webglLayer = sessionObjects.glLayer;
     38  // Setup simple WebGL geometry to draw with.
     39  let program = setupProgram(gl,
     40    "attribute vec4 vPosition; void main() { gl_Position = vPosition; }",
     41    "void main() { gl_FragColor = vec4(1.0,0.0,0.0,1.0); }"
     42  );
     43 
     44  let vertexObject = gl.createBuffer();
     45  gl.bindBuffer(gl.ARRAY_BUFFER, vertexObject);
     46  gl.bufferData(
     47    gl.ARRAY_BUFFER,
     48    new Float32Array([ 0,0.5,0, -0.5,-0.5,0, 0.5,-0.5,0 ]),
     49    gl.STATIC_DRAW);
     50  gl.enableVertexAttribArray(0);
     51  gl.vertexAttribPointer(0, 3, gl.FLOAT, false, 0, 0);
     52 
     53  let indexObject = gl.createBuffer();
     54  gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexObject);
     55  gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array([0, 1, 2]), gl.STATIC_DRAW);
     56 
     57  let xrFramebuffer = webglLayer.framebuffer;
     58 
     59  function runDrawTests(expectedError) {
     60    // Make sure we're starting with a clean error slate.
     61    assert_equals(gl.getError(), gl.NO_ERROR);
     62 
     63    gl.bindFramebuffer(gl.FRAMEBUFFER, xrFramebuffer);
     64    assert_equals(gl.getError(), gl.NO_ERROR);
     65 
     66    gl.clear(gl.COLOR_BUFFER_BIT);
     67    assert_equals(gl.getError(), gl[expectedError]);
     68 
     69    gl.clear(gl.DEPTH_BUFFER_BIT);
     70    assert_equals(gl.getError(), gl[expectedError]);
     71 
     72    gl.drawArrays(gl.TRIANGLES, 0, 3);
     73    assert_equals(gl.getError(), gl[expectedError]);
     74 
     75    gl.drawElements(gl.TRIANGLES, 3, gl.UNSIGNED_BYTE, 0);
     76    assert_equals(gl.getError(), gl[expectedError]);
     77  }
     78 
     79  // Drawing operations outside of a XR frame should fail.
     80  runDrawTests("INVALID_FRAMEBUFFER_OPERATION");
     81 
     82  // Drawing operations within a XR frame should succeed.
     83  session.requestAnimationFrame((time, xrFrame) => {
     84    runDrawTests("NO_ERROR");
     85    resolve();
     86  });
     87 });
     88 
     89 xr_session_promise_test(
     90  testName, testFunction, fakeDeviceInitParams, 'immersive-vr');
     91 
     92 </script>