New issue
Advanced search Search tips

Issue 887726 link

Starred by 1 user

Issue metadata

Status: Available
Owner: ----
Cc:
Components:
EstimatedDays: ----
NextAction: ----
OS: Windows
Pri: 2
Type: Bug
Proj-VR
Proj-XR
Proj-XR-VR



Sign in to add a comment

rAFs can fire very slowly in VR browser tests

Project Member Reported by bsheedy@chromium.org, Sep 20

Issue description

While 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.
 
Once 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();
    }
  }
}
Status: Available (was: Untriaged)

Sign in to add a comment