rAFs can fire very slowly in VR browser tests |
||
Issue descriptionWhile working on getting controller input to work in VR browser tests, I ran into weird issues with rAFs being fired very slowly, sometimes as slowly as one every two seconds. Since a lot of tests wait on rAFs, this made tests slow and sometimes flakily time out. The controller input patch works fine with a potentially less safe/flakier approach to waiting for controller input to be registered, but it's stable enough that this shouldn't block submitting that.
,
Nov 6
|
||
►
Sign in to add a comment |
||
Comment 1 by bsheedy@chromium.org
, Sep 20Once the patch is committed, this can be reproduced by replacing the definition of WebXrControllerInputOpenVRMock in webxr_vr_input_browser_test.cc with the following: class WebXrControllerInputOpenVRMock : public MockOpenVRDeviceHookBase { public: void WaitGetControllerData( unsigned int index, device_test::mojom::XRTestHook::WaitGetControllerDataCallback callback) final; void ToggleTrigger(unsigned int index, device::ControllerFrameData& controller_data) { uint64_t trigger_mask = vr::ButtonMaskFromId(vr::k_EButton_SteamVR_Trigger); controller_data.packet_number++; controller_data.buttons_pressed ^= trigger_mask; UpdateController(index, controller_data); // Wait until the updated state has been picked up by OpenVR. DCHECK(!wait_loop_); wait_loop_ = new base::RunLoop(base::RunLoop::Type::kNestableTasksAllowed); num_times_polled_ = 0; wait_loop_->Run(); delete wait_loop_; wait_loop_ = nullptr; } void PressReleaseTrigger(unsigned int index, device::ControllerFrameData& controller_data) { ToggleTrigger(index, controller_data); ToggleTrigger(index, controller_data); } private: base::RunLoop* wait_loop_ = nullptr; unsigned int num_times_polled_ = 0; }; void WebXrControllerInputOpenVRMock::WaitGetControllerData( unsigned int index, device_test::mojom::XRTestHook::WaitGetControllerDataCallback callback) { MockOpenVRDeviceHookBase::WaitGetControllerData(index, std::move(callback)); if (wait_loop_) { num_times_polled_++; // 5 consistent but slow (~10 seconds) // 6 can fail // 7 faster than 5, but still slow (~7 seconds) // 8 about the same (~7 seconds) // 9 slow again, can also fail (~8 seconds) // 10 kinda slow (~6 seconds) if (num_times_polled_ == 8) { wait_loop_->Quit(); } } }