| <!DOCTYPE html> |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| <script src="resources/webxr_util.js"></script> |
| <script src="resources/webxr_test_constants.js"></script> |
| <canvas /> |
| |
| <script> |
| |
| let testName = |
| "Ensure a WebGL layer's framebuffer can only be drawn to inside a XR frame"; |
| |
| let fakeDeviceInitParams = TRACKED_IMMERSIVE_DEVICE; |
| |
| // Very simple program setup with no error checking. |
| function setupProgram(gl, vertexSrc, fragmentSrc) { |
| let program = gl.createProgram(); |
| |
| let vertexShader = gl.createShader(gl.VERTEX_SHADER); |
| gl.shaderSource(vertexShader, vertexSrc); |
| gl.compileShader(vertexShader); |
| gl.attachShader(program, vertexShader); |
| |
| let fragmentShader = gl.createShader(gl.FRAGMENT_SHADER); |
| gl.shaderSource(fragmentShader, fragmentSrc); |
| gl.compileShader(fragmentShader); |
| gl.attachShader(program, fragmentShader); |
| |
| gl.linkProgram(program); |
| gl.useProgram(program); |
| |
| return program; |
| } |
| |
| let testFunction = |
| (session, fakeDeviceController, t, sessionObjects) => new Promise((resolve, reject) => { |
| let gl = sessionObjects.gl; |
| let webglLayer = sessionObjects.glLayer; |
| // Setup simple WebGL geometry to draw with. |
| let program = setupProgram(gl, |
| "attribute vec4 vPosition; void main() { gl_Position = vPosition; }", |
| "void main() { gl_FragColor = vec4(1.0,0.0,0.0,1.0); }" |
| ); |
| |
| let vertexObject = gl.createBuffer(); |
| gl.bindBuffer(gl.ARRAY_BUFFER, vertexObject); |
| gl.bufferData( |
| gl.ARRAY_BUFFER, |
| new Float32Array([ 0,0.5,0, -0.5,-0.5,0, 0.5,-0.5,0 ]), |
| gl.STATIC_DRAW); |
| gl.enableVertexAttribArray(0); |
| gl.vertexAttribPointer(0, 3, gl.FLOAT, false, 0, 0); |
| |
| let indexObject = gl.createBuffer(); |
| gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexObject); |
| gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array([0, 1, 2]), gl.STATIC_DRAW); |
| |
| let xrFramebuffer = webglLayer.framebuffer; |
| |
| function runDrawTests(expectedError) { |
| // Make sure we're starting with a clean error slate. |
| assert_equals(gl.getError(), gl.NO_ERROR); |
| |
| gl.bindFramebuffer(gl.FRAMEBUFFER, xrFramebuffer); |
| assert_equals(gl.getError(), gl.NO_ERROR); |
| |
| gl.clear(gl.COLOR_BUFFER_BIT); |
| assert_equals(gl.getError(), gl[expectedError]); |
| |
| gl.clear(gl.DEPTH_BUFFER_BIT); |
| assert_equals(gl.getError(), gl[expectedError]); |
| |
| gl.drawArrays(gl.TRIANGLES, 0, 3); |
| assert_equals(gl.getError(), gl[expectedError]); |
| |
| gl.drawElements(gl.TRIANGLES, 3, gl.UNSIGNED_BYTE, 0); |
| assert_equals(gl.getError(), gl[expectedError]); |
| } |
| |
| // Drawing operations outside of a XR frame should fail. |
| runDrawTests("INVALID_FRAMEBUFFER_OPERATION"); |
| |
| // Drawing operations within a XR frame should succeed. |
| session.requestAnimationFrame((time, xrFrame) => { |
| runDrawTests("NO_ERROR"); |
| resolve(); |
| }); |
| }); |
| |
| xr_session_promise_test( |
| testName, testFunction, fakeDeviceInitParams, 'immersive-vr'); |
| |
| </script> |