render_state_update.https.html (3936B)
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 fakeDeviceInitParams = TRACKED_IMMERSIVE_DEVICE; 9 10 let testSessionEnded = function(session, fakeDeviceController, t) { 11 return new Promise((resolve, reject) => { 12 resolve(session.end().then(() => { 13 t.step(() => { 14 assert_throws_dom('InvalidStateError', () => session.updateRenderState({})); 15 }); 16 })); 17 }); 18 }; 19 20 21 let testBaseLayer = function(session, fakeDeviceController, t, sessionObjects) { 22 return new Promise((resolve, reject) => { 23 navigator.xr.test.simulateUserActivation(() => { 24 navigator.xr.requestSession('inline').then((tempSession) => { 25 t.step(() => { 26 assert_not_equals(session, tempSession); 27 assert_throws_dom('InvalidStateError', () => session.updateRenderState({ baseLayer : new XRWebGLLayer(tempSession, sessionObjects.gl), })); 28 }); 29 }); 30 resolve(); 31 }); 32 }); 33 }; 34 35 let testFieldOfView = function(session, fakeDeviceController, t) { 36 return new Promise((resolve, reject) => { 37 t.step(() => { 38 assert_throws_dom('InvalidStateError', () => session.updateRenderState({ inlineVerticalFieldOfView : Math.PI, })); 39 }); 40 resolve(); 41 }); 42 }; 43 44 let testNoParams = function(session, fakeDeviceController, t) { 45 return new Promise((resolve, reject) => { 46 try { 47 session.updateRenderState({}); 48 } catch (err) { 49 assert_unreached("updateRenderState should not fail (actually not do anything) with no params"); 50 } 51 resolve(); 52 }); 53 }; 54 55 let testMinMaxClippingPlanes = function(session, fakeDeviceController, t, sessionObjects) { 56 return new Promise((resolve, reject) => { 57 let gl = sessionObjects.gl; 58 gl.makeXRCompatible().then(() => { 59 t.step(() => { 60 let near = 0.2; 61 let far = 0.8; 62 let layer = new XRWebGLLayer(session, gl); 63 session.updateRenderState({ depthNear: near, depthFar: far, baseLayer: layer }); 64 assert_not_equals(session.renderState.depthNear, near); 65 assert_not_equals(session.renderState.depthFar, far); 66 assert_not_equals(session.renderState.baseLayer, layer); 67 session.requestAnimationFrame((time, xrFrame) => { 68 t.step(() => { 69 assert_equals(session.renderState.depthNear, near); 70 assert_equals(session.renderState.depthFar, far); 71 // Clamp negative values 72 near = -20.3; 73 far = -1.5; 74 session.updateRenderState({ depthNear: near, depthFar: far }); 75 session.requestAnimationFrame((time, xrFrame) => { 76 t.step(() => { 77 assert_equals(session.renderState.depthNear, 0.0); 78 assert_equals(session.renderState.depthFar, 0.0); 79 resolve(); 80 }); 81 }); 82 }); 83 }); 84 }); 85 }); 86 }); 87 }; 88 89 let testName = "updateRenderState handles appropriately ended sessions"; 90 xr_session_promise_test(testName, testSessionEnded, fakeDeviceInitParams, 'immersive-vr'); 91 92 testName = "updateRenderState handles appropriately baseLayers created with different sessions"; 93 xr_session_promise_test(testName, testBaseLayer, fakeDeviceInitParams, 'immersive-vr'); 94 95 testName = "updateRenderState handles appropriately immersive sessions with specified inlineVerticalFieldOfView"; 96 xr_session_promise_test(testName, testFieldOfView, fakeDeviceInitParams, 'immersive-vr'); 97 98 testName = "updateRenderState handles appropriately XRRenderStateInit with no params"; 99 xr_session_promise_test(testName, testNoParams, fakeDeviceInitParams, 'immersive-vr'); 100 101 testName = "updateRenderState clamps appropriately near/far clipping planes"; 102 xr_session_promise_test(testName, testMinMaxClippingPlanes, fakeDeviceInitParams, 'immersive-vr'); 103 104 </script>