| 'use strict'; |
| |
| const TestStates = Object.freeze({ |
| "ShouldSucceedPauseScheduleRAF": 1, |
| "ShouldFailResumeScheduleRAF": 2, |
| "ShouldSucceedTestDone": 3, |
| }); |
| |
| const framesToWait = 10; |
| const pauseResumeTestFunction = function(session, controller, t, sessionObjects) { |
| const isCpuOptimized = session.depthUsage === 'cpu-optimized'; |
| let state = TestStates.ShouldSucceedPauseScheduleRAF; |
| |
| return session.requestReferenceSpace('viewer').then((viewerSpace) => { |
| let done = false; |
| |
| const glBinding = new XRWebGLBinding(session, sessionObjects.gl); |
| |
| let stepFrameCount = 0; |
| let advanceState = false; |
| |
| const rafCb = function(time, frame) { |
| const pose = frame.getViewerPose(viewerSpace); |
| stepFrameCount++; |
| for(const view of pose.views) { |
| const depthInformation = isCpuOptimized ? frame.getDepthInformation(view) |
| : glBinding.getDepthInformation(view); |
| |
| if (state == TestStates.ShouldSucceedPauseScheduleRAF |
| || state == TestStates.ShouldSucceedTestDone) { |
| t.step(() => { |
| assert_true(session.depthActive); |
| }); |
| // We have no guarantees about when data should start returning, |
| // so we need to potentially wait a few frames. |
| |
| // Final chance. If we haven't advanced the state by now, fail the |
| // test if it doesn't pass this time. |
| if (stepFrameCount >= framesToWait) { |
| t.step(() => { |
| assert_not_equals(depthInformation, null); |
| }); |
| } |
| |
| // Either we have data, or we've waited long enough to keep moving. |
| if (depthInformation != null || stepFrameCount >= framesToWait) { |
| advanceState = true; |
| } |
| } else { |
| // Depth should stop being available immediately. |
| t.step(() => { |
| assert_false(session.depthActive); |
| assert_equals(depthInformation, null); |
| }); |
| advanceState = true; |
| } |
| } |
| |
| switch(state) { |
| case TestStates.ShouldSucceedPauseScheduleRAF: |
| if (advanceState) { |
| session.pauseDepthSensing(); |
| for(const view of pose.views) { |
| const newDepthInformation = isCpuOptimized ? frame.getDepthInformation(view) |
| : glBinding.getDepthInformation(view); |
| t.step(()=> { |
| // depthActive state should update and stop returning depth info |
| // immediately. |
| assert_false(session.depthActive); |
| assert_equals(newDepthInformation, null); |
| }); |
| } |
| state = TestStates.ShouldFailResumeScheduleRAF; |
| stepFrameCount = 0; |
| advanceState = false; |
| } |
| session.requestAnimationFrame(rafCb); |
| break; |
| case TestStates.ShouldFailResumeScheduleRAF: |
| if (advanceState) { |
| session.resumeDepthSensing(); |
| // In pausing depth sensing, any controller data may have been |
| // thrown away since the UA can "tear down" any depth controller. |
| // So attempt to repopulate the data once we've resumed it. |
| controller.setDepthSensingData(DEPTH_SENSING_DATA); |
| t.step(()=> { |
| // While depth data may not return for a few frames, depthActive |
| // should be updated immediately. |
| assert_true(session.depthActive); |
| }); |
| state = TestStates.ShouldSucceedTestDone; |
| stepFrameCount = 0; |
| advanceState = false; |
| } |
| session.requestAnimationFrame(rafCb); |
| break; |
| case TestStates.ShouldSucceedTestDone: |
| // If we are advancing the state, we can stop pumping the rAF, but |
| // if we're still waiting for data to come back we need to keep it |
| // going. |
| if (advanceState) { |
| done = true; |
| } else { |
| session.requestAnimationFrame(rafCb); |
| } |
| break; |
| } |
| }; |
| |
| session.requestAnimationFrame(rafCb); |
| |
| return t.step_wait(() => done); |
| }); |
| }; |