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>