Commit b915d1ef authored by Aldo Culquicondor's avatar Aldo Culquicondor Committed by Commit Bot

Move head pose acquisition to InputDelegate

The ControllerDelegate was renamed to InputDelegate to reflect
that it handles more than just the controller raw input.

Bug: 875291
Cq-Include-Trybots: luci.chromium.try:android_optional_gpu_tests_rel;luci.chromium.try:linux_optional_gpu_tests_rel;luci.chromium.try:linux_vr;luci.chromium.try:mac_optional_gpu_tests_rel;luci.chromium.try:win_optional_gpu_tests_rel
Change-Id: I7415806cf7ba52a7e49899843dcf93079333c8d3
Reviewed-on: https://chromium-review.googlesource.com/1213874
Commit-Queue: Aldo Culquicondor <acondor@chromium.org>
Reviewed-by: default avatarMichael Thiessen <mthiesse@chromium.org>
Cr-Commit-Position: refs/heads/master@{#590522}
parent 9fc3a5c2
...@@ -22,10 +22,10 @@ static_library("vr_android") { ...@@ -22,10 +22,10 @@ static_library("vr_android") {
"browser_renderer_factory.cc", "browser_renderer_factory.cc",
"browser_renderer_factory.h", "browser_renderer_factory.h",
"gl_browser_interface.h", "gl_browser_interface.h",
"gvr_controller_delegate.cc",
"gvr_controller_delegate.h",
"gvr_graphics_delegate.cc", "gvr_graphics_delegate.cc",
"gvr_graphics_delegate.h", "gvr_graphics_delegate.h",
"gvr_input_delegate.cc",
"gvr_input_delegate.h",
"gvr_keyboard_delegate.cc", "gvr_keyboard_delegate.cc",
"gvr_keyboard_delegate.h", "gvr_keyboard_delegate.h",
"gvr_keyboard_shim.cc", "gvr_keyboard_shim.cc",
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
#include <utility> #include <utility>
#include "base/threading/thread_task_runner_handle.h" #include "base/threading/thread_task_runner_handle.h"
#include "chrome/browser/android/vr/gvr_controller_delegate.h" #include "chrome/browser/android/vr/gvr_input_delegate.h"
#include "chrome/browser/android/vr/gvr_keyboard_delegate.h" #include "chrome/browser/android/vr/gvr_keyboard_delegate.h"
#include "chrome/browser/android/vr/gvr_scheduler_delegate.h" #include "chrome/browser/android/vr/gvr_scheduler_delegate.h"
#include "chrome/browser/android/vr/vr_gl_thread.h" #include "chrome/browser/android/vr/vr_gl_thread.h"
...@@ -63,8 +63,8 @@ std::unique_ptr<BrowserRenderer> BrowserRendererFactory::Create( ...@@ -63,8 +63,8 @@ std::unique_ptr<BrowserRenderer> BrowserRendererFactory::Create(
vr_gl_thread, vr_gl_thread, std::move(keyboard_delegate), vr_gl_thread, vr_gl_thread, std::move(keyboard_delegate),
std::move(text_input_delegate), std::move(audio_delegate), std::move(text_input_delegate), std::move(audio_delegate),
params->ui_initial_state); params->ui_initial_state);
auto controller_delegate = auto input_delegate =
std::make_unique<GvrControllerDelegate>(params->gvr_api, vr_gl_thread); std::make_unique<GvrInputDelegate>(params->gvr_api, vr_gl_thread);
auto graphics_delegate = std::make_unique<GvrGraphicsDelegate>( auto graphics_delegate = std::make_unique<GvrGraphicsDelegate>(
vr_gl_thread, vr_gl_thread,
base::BindOnce(&UiInterface::OnGlInitialized, base::Unretained(ui.get())), base::BindOnce(&UiInterface::OnGlInitialized, base::Unretained(ui.get())),
...@@ -84,8 +84,8 @@ std::unique_ptr<BrowserRenderer> BrowserRendererFactory::Create( ...@@ -84,8 +84,8 @@ std::unique_ptr<BrowserRenderer> BrowserRendererFactory::Create(
params->ui_initial_state.in_web_vr)); params->ui_initial_state.in_web_vr));
auto browser_renderer = std::make_unique<BrowserRenderer>( auto browser_renderer = std::make_unique<BrowserRenderer>(
std::move(ui), std::move(scheduler_delegate), std::move(ui), std::move(scheduler_delegate),
std::move(graphics_delegate), std::move(controller_delegate), std::move(graphics_delegate), std::move(input_delegate), vr_gl_thread,
vr_gl_thread, kSlidingAverageSize); kSlidingAverageSize);
return browser_renderer; return browser_renderer;
} }
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
#include "chrome/browser/android/vr/gvr_controller_delegate.h" #include "chrome/browser/android/vr/gvr_input_delegate.h"
#include <utility> #include <utility>
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
#include "chrome/browser/vr/model/controller_model.h" #include "chrome/browser/vr/model/controller_model.h"
#include "chrome/browser/vr/pose_util.h" #include "chrome/browser/vr/pose_util.h"
#include "chrome/browser/vr/render_info.h" #include "chrome/browser/vr/render_info.h"
#include "device/vr/android/gvr/gvr_delegate.h"
namespace { namespace {
constexpr gfx::Vector3dF kForwardVector = {0.0f, 0.0f, -1.0f}; constexpr gfx::Vector3dF kForwardVector = {0.0f, 0.0f, -1.0f};
...@@ -19,13 +20,21 @@ constexpr gfx::Vector3dF kForwardVector = {0.0f, 0.0f, -1.0f}; ...@@ -19,13 +20,21 @@ constexpr gfx::Vector3dF kForwardVector = {0.0f, 0.0f, -1.0f};
namespace vr { namespace vr {
GvrControllerDelegate::GvrControllerDelegate(gvr::GvrApi* gvr_api, GvrInputDelegate::GvrInputDelegate(gvr::GvrApi* gvr_api,
GlBrowserInterface* browser) GlBrowserInterface* browser)
: controller_(std::make_unique<VrController>(gvr_api)), browser_(browser) {} : controller_(std::make_unique<VrController>(gvr_api)),
gvr_api_(gvr_api),
browser_(browser) {}
GvrControllerDelegate::~GvrControllerDelegate() = default; GvrInputDelegate::~GvrInputDelegate() = default;
void GvrControllerDelegate::UpdateController(const gfx::Transform& head_pose, gfx::Transform GvrInputDelegate::GetHeadPose() {
gfx::Transform head_pose;
device::GvrDelegate::GetGvrPoseWithNeckModel(gvr_api_, &head_pose);
return head_pose;
}
void GvrInputDelegate::UpdateController(const gfx::Transform& head_pose,
base::TimeTicks current_time, base::TimeTicks current_time,
bool is_webxr_frame) { bool is_webxr_frame) {
controller_->UpdateState(head_pose); controller_->UpdateState(head_pose);
...@@ -36,7 +45,7 @@ void GvrControllerDelegate::UpdateController(const gfx::Transform& head_pose, ...@@ -36,7 +45,7 @@ void GvrControllerDelegate::UpdateController(const gfx::Transform& head_pose,
browser_->UpdateGamepadData(controller_data); browser_->UpdateGamepadData(controller_data);
} }
ControllerModel GvrControllerDelegate::GetModel( ControllerModel GvrInputDelegate::GetControllerModel(
const gfx::Transform& head_pose) { const gfx::Transform& head_pose) {
gfx::Vector3dF head_direction = GetForwardVector(head_pose); gfx::Vector3dF head_direction = GetForwardVector(head_pose);
...@@ -88,15 +97,13 @@ ControllerModel GvrControllerDelegate::GetModel( ...@@ -88,15 +97,13 @@ ControllerModel GvrControllerDelegate::GetModel(
return controller_model; return controller_model;
} }
InputEventList GvrControllerDelegate::GetGestures( InputEventList GvrInputDelegate::GetGestures(base::TimeTicks current_time) {
base::TimeTicks current_time) {
if (!controller_->IsConnected()) if (!controller_->IsConnected())
return {}; return {};
return gesture_detector_.DetectGestures(*controller_, current_time); return gesture_detector_.DetectGestures(*controller_, current_time);
} }
device::mojom::XRInputSourceStatePtr device::mojom::XRInputSourceStatePtr GvrInputDelegate::GetInputSourceState() {
GvrControllerDelegate::GetInputSourceState() {
device::mojom::XRInputSourceStatePtr state = device::mojom::XRInputSourceStatePtr state =
device::mojom::XRInputSourceState::New(); device::mojom::XRInputSourceState::New();
state->description = device::mojom::XRInputSourceDescription::New(); state->description = device::mojom::XRInputSourceDescription::New();
...@@ -141,11 +148,11 @@ GvrControllerDelegate::GetInputSourceState() { ...@@ -141,11 +148,11 @@ GvrControllerDelegate::GetInputSourceState() {
return state; return state;
} }
void GvrControllerDelegate::OnResume() { void GvrInputDelegate::OnResume() {
controller_->OnResume(); controller_->OnResume();
} }
void GvrControllerDelegate::OnPause() { void GvrInputDelegate::OnPause() {
controller_->OnPause(); controller_->OnPause();
} }
......
...@@ -2,14 +2,14 @@ ...@@ -2,14 +2,14 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
#ifndef CHROME_BROWSER_ANDROID_VR_GVR_CONTROLLER_DELEGATE_H_ #ifndef CHROME_BROWSER_ANDROID_VR_GVR_INPUT_DELEGATE_H_
#define CHROME_BROWSER_ANDROID_VR_GVR_CONTROLLER_DELEGATE_H_ #define CHROME_BROWSER_ANDROID_VR_GVR_INPUT_DELEGATE_H_
#include <memory> #include <memory>
#include "base/macros.h" #include "base/macros.h"
#include "chrome/browser/android/vr/vr_controller.h" #include "chrome/browser/android/vr/vr_controller.h"
#include "chrome/browser/vr/controller_delegate.h" #include "chrome/browser/vr/input_delegate.h"
namespace gvr { namespace gvr {
class GvrApi; class GvrApi;
...@@ -20,16 +20,17 @@ namespace vr { ...@@ -20,16 +20,17 @@ namespace vr {
class GestureDetector; class GestureDetector;
class GlBrowserInterface; class GlBrowserInterface;
class GvrControllerDelegate : public ControllerDelegate { class GvrInputDelegate : public InputDelegate {
public: public:
GvrControllerDelegate(gvr::GvrApi* gvr_api, GlBrowserInterface* browser); GvrInputDelegate(gvr::GvrApi* gvr_api, GlBrowserInterface* browser);
~GvrControllerDelegate() override; ~GvrInputDelegate() override;
// ControllerDelegate implementation. // InputDelegate implementation.
gfx::Transform GetHeadPose() override;
void UpdateController(const gfx::Transform& head_pose, void UpdateController(const gfx::Transform& head_pose,
base::TimeTicks current_time, base::TimeTicks current_time,
bool is_webxr_frame) override; bool is_webxr_frame) override;
ControllerModel GetModel(const gfx::Transform& head_pose) override; ControllerModel GetControllerModel(const gfx::Transform& head_pose) override;
InputEventList GetGestures(base::TimeTicks current_time) override; InputEventList GetGestures(base::TimeTicks current_time) override;
device::mojom::XRInputSourceStatePtr GetInputSourceState() override; device::mojom::XRInputSourceStatePtr GetInputSourceState() override;
void OnResume() override; void OnResume() override;
...@@ -38,13 +39,14 @@ class GvrControllerDelegate : public ControllerDelegate { ...@@ -38,13 +39,14 @@ class GvrControllerDelegate : public ControllerDelegate {
private: private:
std::unique_ptr<VrController> controller_; std::unique_ptr<VrController> controller_;
GestureDetector gesture_detector_; GestureDetector gesture_detector_;
gvr::GvrApi* gvr_api_;
GlBrowserInterface* browser_; GlBrowserInterface* browser_;
bool was_select_button_down_ = false; bool was_select_button_down_ = false;
DISALLOW_COPY_AND_ASSIGN(GvrControllerDelegate); DISALLOW_COPY_AND_ASSIGN(GvrInputDelegate);
}; };
} // namespace vr } // namespace vr
#endif // CHROME_BROWSER_ANDROID_VR_GVR_CONTROLLER_DELEGATE_H_ #endif // CHROME_BROWSER_ANDROID_VR_GVR_INPUT_DELEGATE_H_
...@@ -99,10 +99,6 @@ void GvrSchedulerDelegate::SetBrowserRenderer( ...@@ -99,10 +99,6 @@ void GvrSchedulerDelegate::SetBrowserRenderer(
browser_renderer_ = browser_renderer; browser_renderer_ = browser_renderer;
} }
gfx::Transform GvrSchedulerDelegate::GetHeadPose() {
return head_pose_;
}
void GvrSchedulerDelegate::AddInputSourceState( void GvrSchedulerDelegate::AddInputSourceState(
device::mojom::XRInputSourceStatePtr state) { device::mojom::XRInputSourceStatePtr state) {
input_states_.push_back(std::move(state)); input_states_.push_back(std::move(state));
...@@ -406,16 +402,10 @@ void GvrSchedulerDelegate::OnVSync(base::TimeTicks frame_time) { ...@@ -406,16 +402,10 @@ void GvrSchedulerDelegate::OnVSync(base::TimeTicks frame_time) {
pending_time_ = frame_time; pending_time_ = frame_time;
WebXrTryStartAnimatingFrame(true); WebXrTryStartAnimatingFrame(true);
if (ShouldDrawWebVr()) { if (ShouldDrawWebVr())
// When drawing WebVR, controller input doesn't need to be synchronized with
// rendering as WebVR uses the gamepad api. To ensure we always handle input
// like app button presses, process the controller here.
device::GvrDelegate::GetGvrPoseWithNeckModel(gvr_api_, &head_pose_);
DCHECK(browser_renderer_);
browser_renderer_->ProcessControllerInputForWebXr(frame_time); browser_renderer_->ProcessControllerInputForWebXr(frame_time);
} else { else
DrawFrame(-1, frame_time); DrawFrame(-1, frame_time);
}
} }
void GvrSchedulerDelegate::DrawFrame(int16_t frame_index, void GvrSchedulerDelegate::DrawFrame(int16_t frame_index,
...@@ -458,20 +448,6 @@ void GvrSchedulerDelegate::DrawFrame(int16_t frame_index, ...@@ -458,20 +448,6 @@ void GvrSchedulerDelegate::DrawFrame(int16_t frame_index,
// of them. // of them.
DCHECK(!is_webxr_frame || webxr_.HaveProcessingFrame()); DCHECK(!is_webxr_frame || webxr_.HaveProcessingFrame());
// When using async reprojection, we need to know which pose was
// used in the WebVR app for drawing this frame and supply it when
// submitting. Technically we don't need a pose if not reprojecting,
// but keeping it uninitialized seems likely to cause problems down
// the road. Copying it is cheaper than fetching a new one.
if (is_webxr_frame) {
// Copy into render info for overlay UI. WebVR doesn't use this.
DCHECK(webxr_.HaveProcessingFrame());
WebXrFrame* frame = webxr_.GetProcessingFrame();
head_pose_ = frame->head_pose;
} else {
device::GvrDelegate::GetGvrPoseWithNeckModel(gvr_api_, &head_pose_);
}
graphics_->UpdateViewports(); graphics_->UpdateViewports();
if (is_webxr_frame) { if (is_webxr_frame) {
...@@ -485,12 +461,18 @@ void GvrSchedulerDelegate::DrawFrame(int16_t frame_index, ...@@ -485,12 +461,18 @@ void GvrSchedulerDelegate::DrawFrame(int16_t frame_index,
if (!graphics_->AcquireGvrFrame(frame_index)) if (!graphics_->AcquireGvrFrame(frame_index))
return; return;
if (is_webxr_frame) if (is_webxr_frame) {
browser_renderer_->DrawWebXrFrame(current_time); // When using async reprojection, we need to know which pose was
else // used in the WebVR app for drawing this frame and supply it when
// submitting. Technically we don't need a pose if not reprojecting,
// but keeping it uninitialized seems likely to cause problems down
// the road. Copying it is cheaper than fetching a new one.
DCHECK(webxr_.HaveProcessingFrame());
browser_renderer_->DrawWebXrFrame(current_time,
webxr_.GetProcessingFrame()->head_pose);
} else {
browser_renderer_->DrawBrowserFrame(current_time); browser_renderer_->DrawBrowserFrame(current_time);
}
SubmitDrawnFrame(is_webxr_frame);
} }
void GvrSchedulerDelegate::UpdatePendingBounds(int16_t frame_index) { void GvrSchedulerDelegate::UpdatePendingBounds(int16_t frame_index) {
...@@ -525,19 +507,10 @@ void GvrSchedulerDelegate::UpdatePendingBounds(int16_t frame_index) { ...@@ -525,19 +507,10 @@ void GvrSchedulerDelegate::UpdatePendingBounds(int16_t frame_index) {
} }
} }
void GvrSchedulerDelegate::SubmitDrawnFrame(bool is_webxr_frame) { void GvrSchedulerDelegate::SubmitDrawnFrame(FrameType frame_type,
// GVR submit needs the exact head pose that was used for rendering. const gfx::Transform& head_pose) {
gfx::Transform submit_head_pose;
if (is_webxr_frame) {
// Don't use render_info_.head_pose here, that may have been
// overwritten by OnVSync's controller handling. We need the pose that was
// sent to JS.
submit_head_pose = webxr_.GetProcessingFrame()->head_pose;
} else {
submit_head_pose = head_pose_;
}
std::unique_ptr<gl::GLFenceEGL> fence = nullptr; std::unique_ptr<gl::GLFenceEGL> fence = nullptr;
if (is_webxr_frame && graphics_->DoesSurfacelessRendering()) { if (frame_type == kWebXrFrame && graphics_->DoesSurfacelessRendering()) {
webxr_.GetProcessingFrame()->time_copied = base::TimeTicks::Now(); webxr_.GetProcessingFrame()->time_copied = base::TimeTicks::Now();
if (webxr_use_gpu_fence_) { if (webxr_use_gpu_fence_) {
// Continue with submit once the previous frame's GL fence signals that // Continue with submit once the previous frame's GL fence signals that
...@@ -564,21 +537,20 @@ void GvrSchedulerDelegate::SubmitDrawnFrame(bool is_webxr_frame) { ...@@ -564,21 +537,20 @@ void GvrSchedulerDelegate::SubmitDrawnFrame(bool is_webxr_frame) {
base::BindRepeating(&GvrSchedulerDelegate::DrawFrameSubmitWhenReady, base::BindRepeating(&GvrSchedulerDelegate::DrawFrameSubmitWhenReady,
base::Unretained(this))); base::Unretained(this)));
task_runner()->PostTask( task_runner()->PostTask(
FROM_HERE, FROM_HERE, base::BindOnce(webxr_delayed_gvr_submit_.callback(),
base::BindOnce(webxr_delayed_gvr_submit_.callback(), is_webxr_frame, frame_type, head_pose, base::Passed(&fence)));
submit_head_pose, base::Passed(&fence)));
} else { } else {
// Continue with submit immediately. // Continue with submit immediately.
DrawFrameSubmitNow(is_webxr_frame, submit_head_pose); DrawFrameSubmitNow(frame_type, head_pose);
} }
} }
void GvrSchedulerDelegate::DrawFrameSubmitWhenReady( void GvrSchedulerDelegate::DrawFrameSubmitWhenReady(
bool is_webxr_frame, FrameType frame_type,
const gfx::Transform& head_pose, const gfx::Transform& head_pose,
std::unique_ptr<gl::GLFenceEGL> fence) { std::unique_ptr<gl::GLFenceEGL> fence) {
TRACE_EVENT1("gpu", __func__, "is_webxr_frame", is_webxr_frame); TRACE_EVENT1("gpu", __func__, "frame_type", frame_type);
DVLOG(2) << __func__ << ": is_webxr_frame=" << is_webxr_frame; DVLOG(2) << __func__ << ": frame_type=" << frame_type;
bool use_polling = webxr_.mailbox_bridge_ready() && bool use_polling = webxr_.mailbox_bridge_ready() &&
mailbox_bridge_->IsGpuWorkaroundEnabled( mailbox_bridge_->IsGpuWorkaroundEnabled(
gpu::DONT_USE_EGLCLIENTWAITSYNC_WITH_TIMEOUT); gpu::DONT_USE_EGLCLIENTWAITSYNC_WITH_TIMEOUT);
...@@ -600,13 +572,13 @@ void GvrSchedulerDelegate::DrawFrameSubmitWhenReady( ...@@ -600,13 +572,13 @@ void GvrSchedulerDelegate::DrawFrameSubmitWhenReady(
// with a delay of up to one polling interval. // with a delay of up to one polling interval.
task_runner()->PostDelayedTask( task_runner()->PostDelayedTask(
FROM_HERE, FROM_HERE,
base::BindOnce(webxr_delayed_gvr_submit_.callback(), is_webxr_frame, base::BindOnce(webxr_delayed_gvr_submit_.callback(), frame_type,
head_pose, base::Passed(&fence)), head_pose, base::Passed(&fence)),
kWebVRFenceCheckPollInterval); kWebVRFenceCheckPollInterval);
} else { } else {
task_runner()->PostTask( task_runner()->PostTask(
FROM_HERE, FROM_HERE,
base::BindOnce(webxr_delayed_gvr_submit_.callback(), is_webxr_frame, base::BindOnce(webxr_delayed_gvr_submit_.callback(), frame_type,
head_pose, base::Passed(&fence))); head_pose, base::Passed(&fence)));
} }
return; return;
...@@ -620,7 +592,7 @@ void GvrSchedulerDelegate::DrawFrameSubmitWhenReady( ...@@ -620,7 +592,7 @@ void GvrSchedulerDelegate::DrawFrameSubmitWhenReady(
} }
webxr_delayed_gvr_submit_.Cancel(); webxr_delayed_gvr_submit_.Cancel();
DrawFrameSubmitNow(is_webxr_frame, head_pose); DrawFrameSubmitNow(frame_type, head_pose);
} }
void GvrSchedulerDelegate::AddWebVrRenderTimeEstimate( void GvrSchedulerDelegate::AddWebVrRenderTimeEstimate(
...@@ -636,14 +608,13 @@ void GvrSchedulerDelegate::AddWebVrRenderTimeEstimate( ...@@ -636,14 +608,13 @@ void GvrSchedulerDelegate::AddWebVrRenderTimeEstimate(
} }
} }
void GvrSchedulerDelegate::DrawFrameSubmitNow(bool is_webxr_frame, void GvrSchedulerDelegate::DrawFrameSubmitNow(FrameType frame_type,
const gfx::Transform& head_pose) { const gfx::Transform& head_pose) {
TRACE_EVENT1("gpu", "GvrSchedulerDelegate::DrawFrameSubmitNow", TRACE_EVENT1("gpu", "GvrSchedulerDelegate::DrawFrameSubmitNow", "frame_type",
"is_webxr_frame", is_webxr_frame); frame_type);
{ {
std::unique_ptr<ScopedGpuTrace> browser_gpu_trace; std::unique_ptr<ScopedGpuTrace> browser_gpu_trace;
if (gl::GLFence::IsGpuFenceSupported() && is_webxr_frame) { if (gl::GLFence::IsGpuFenceSupported() && frame_type == kWebXrFrame) {
// This fence instance is created for the tracing side effect. Insert it // This fence instance is created for the tracing side effect. Insert it
// before GVR submit. Then replace the previous instance below after GVR // before GVR submit. Then replace the previous instance below after GVR
// submit completes, at which point the previous fence (if any) should be // submit completes, at which point the previous fence (if any) should be
...@@ -667,7 +638,7 @@ void GvrSchedulerDelegate::DrawFrameSubmitNow(bool is_webxr_frame, ...@@ -667,7 +638,7 @@ void GvrSchedulerDelegate::DrawFrameSubmitNow(bool is_webxr_frame,
// false for a WebVR frame. Ignore the ShouldDrawWebVr status to ensure we // false for a WebVR frame. Ignore the ShouldDrawWebVr status to ensure we
// send render notifications while paused for exclusive UI mode. Skip the // send render notifications while paused for exclusive UI mode. Skip the
// steps if we lost the processing state, that means presentation has ended. // steps if we lost the processing state, that means presentation has ended.
if (is_webxr_frame && webxr_.HaveProcessingFrame()) { if (frame_type == kWebXrFrame && webxr_.HaveProcessingFrame()) {
// Report rendering completion to the Renderer so that it's permitted to // Report rendering completion to the Renderer so that it's permitted to
// submit a fresh frame. We could do this earlier, as soon as the frame // submit a fresh frame. We could do this earlier, as soon as the frame
// got pulled off the transfer surface, but that results in overstuffed // got pulled off the transfer surface, but that results in overstuffed
...@@ -697,7 +668,7 @@ void GvrSchedulerDelegate::DrawFrameSubmitNow(bool is_webxr_frame, ...@@ -697,7 +668,7 @@ void GvrSchedulerDelegate::DrawFrameSubmitNow(bool is_webxr_frame,
DVLOG(1) << "fps: " << vr_ui_fps_meter_.GetFPS(); DVLOG(1) << "fps: " << vr_ui_fps_meter_.GetFPS();
TRACE_COUNTER1("gpu", "VR UI FPS", vr_ui_fps_meter_.GetFPS()); TRACE_COUNTER1("gpu", "VR UI FPS", vr_ui_fps_meter_.GetFPS());
if (is_webxr_frame) { if (frame_type == kWebXrFrame) {
// We finished processing a frame, this may make pending WebVR // We finished processing a frame, this may make pending WebVR
// work eligible to proceed. // work eligible to proceed.
webxr_.TryDeferredProcessing(); webxr_.TryDeferredProcessing();
......
...@@ -64,13 +64,14 @@ class GvrSchedulerDelegate : public BaseSchedulerDelegate, ...@@ -64,13 +64,14 @@ class GvrSchedulerDelegate : public BaseSchedulerDelegate,
private: private:
// SchedulerDelegate overrides. // SchedulerDelegate overrides.
gfx::Transform GetHeadPose() override;
void AddInputSourceState(device::mojom::XRInputSourceStatePtr state) override; void AddInputSourceState(device::mojom::XRInputSourceStatePtr state) override;
void OnPause() override; void OnPause() override;
void OnResume() override; void OnResume() override;
void OnTriggerEvent(bool pressed) override; void OnTriggerEvent(bool pressed) override;
void SetWebXrMode(bool enabled) override; void SetWebXrMode(bool enabled) override;
void SetShowingVrDialog(bool showing) override; void SetShowingVrDialog(bool showing) override;
void SubmitDrawnFrame(FrameType frame_type,
const gfx::Transform& head_pose) override;
void SetBrowserRenderer( void SetBrowserRenderer(
SchedulerBrowserRendererInterface* browser_renderer) override; SchedulerBrowserRendererInterface* browser_renderer) override;
void ConnectPresentingService( void ConnectPresentingService(
...@@ -84,11 +85,11 @@ class GvrSchedulerDelegate : public BaseSchedulerDelegate, ...@@ -84,11 +85,11 @@ class GvrSchedulerDelegate : public BaseSchedulerDelegate,
void DrawFrame(int16_t frame_index, base::TimeTicks current_time); void DrawFrame(int16_t frame_index, base::TimeTicks current_time);
void WebVrSendRenderNotification(bool was_rendered); void WebVrSendRenderNotification(bool was_rendered);
void UpdatePendingBounds(int16_t frame_index); void UpdatePendingBounds(int16_t frame_index);
void SubmitDrawnFrame(bool is_webxr_frame); void DrawFrameSubmitWhenReady(FrameType frame_type,
void DrawFrameSubmitWhenReady(bool is_webxr_frame,
const gfx::Transform& head_pose, const gfx::Transform& head_pose,
std::unique_ptr<gl::GLFenceEGL> fence); std::unique_ptr<gl::GLFenceEGL> fence);
void DrawFrameSubmitNow(bool is_webxr_frame, const gfx::Transform& head_pose); void DrawFrameSubmitNow(FrameType frame_type,
const gfx::Transform& head_pose);
// Used for discarding unwanted WebXR frames while UI is showing. We can't // Used for discarding unwanted WebXR frames while UI is showing. We can't
// safely cancel frames from processing start until they show up in // safely cancel frames from processing start until they show up in
...@@ -192,8 +193,6 @@ class GvrSchedulerDelegate : public BaseSchedulerDelegate, ...@@ -192,8 +193,6 @@ class GvrSchedulerDelegate : public BaseSchedulerDelegate,
AndroidVSyncHelper vsync_helper_; AndroidVSyncHelper vsync_helper_;
gfx::Transform head_pose_;
mojo::Binding<device::mojom::XRPresentationProvider> presentation_binding_; mojo::Binding<device::mojom::XRPresentationProvider> presentation_binding_;
mojo::Binding<device::mojom::XRFrameDataProvider> frame_data_binding_; mojo::Binding<device::mojom::XRFrameDataProvider> frame_data_binding_;
...@@ -229,7 +228,7 @@ class GvrSchedulerDelegate : public BaseSchedulerDelegate, ...@@ -229,7 +228,7 @@ class GvrSchedulerDelegate : public BaseSchedulerDelegate,
// for later. If we exit WebVR before it is executed, we need to // for later. If we exit WebVR before it is executed, we need to
// cancel it to avoid inconsistent state. // cancel it to avoid inconsistent state.
base::CancelableOnceCallback< base::CancelableOnceCallback<
void(bool, const gfx::Transform&, std::unique_ptr<gl::GLFenceEGL>)> void(FrameType, const gfx::Transform&, std::unique_ptr<gl::GLFenceEGL>)>
webxr_delayed_gvr_submit_; webxr_delayed_gvr_submit_;
std::unique_ptr<MailboxToSurfaceBridge> mailbox_bridge_; std::unique_ptr<MailboxToSurfaceBridge> mailbox_bridge_;
......
...@@ -203,14 +203,15 @@ component("vr_common") { ...@@ -203,14 +203,15 @@ component("vr_common") {
"browser_renderer.cc", "browser_renderer.cc",
"browser_renderer.h", "browser_renderer.h",
"browser_renderer_browser_interface.h", "browser_renderer_browser_interface.h",
"controller_delegate.h",
"controller_delegate_for_testing.cc",
"controller_delegate_for_testing.h",
"fps_meter.cc", "fps_meter.cc",
"fps_meter.h", "fps_meter.h",
"frame_type.h",
"gesture_detector.cc", "gesture_detector.cc",
"gesture_detector.h", "gesture_detector.h",
"graphics_delegate.h", "graphics_delegate.h",
"input_delegate.h",
"input_delegate_for_testing.cc",
"input_delegate_for_testing.h",
"platform_controller.h", "platform_controller.h",
"sample_queue.cc", "sample_queue.cc",
"sample_queue.h", "sample_queue.h",
......
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
#include "base/time/time.h" #include "base/time/time.h"
#include "base/trace_event/common/trace_event_common.h" #include "base/trace_event/common/trace_event_common.h"
#include "chrome/browser/vr/browser_renderer_browser_interface.h" #include "chrome/browser/vr/browser_renderer_browser_interface.h"
#include "chrome/browser/vr/controller_delegate_for_testing.h" #include "chrome/browser/vr/input_delegate_for_testing.h"
#include "chrome/browser/vr/input_event.h" #include "chrome/browser/vr/input_event.h"
#include "chrome/browser/vr/model/controller_model.h" #include "chrome/browser/vr/model/controller_model.h"
#include "chrome/browser/vr/model/reticle_model.h" #include "chrome/browser/vr/model/reticle_model.h"
...@@ -26,13 +26,13 @@ BrowserRenderer::BrowserRenderer( ...@@ -26,13 +26,13 @@ BrowserRenderer::BrowserRenderer(
std::unique_ptr<UiInterface> ui, std::unique_ptr<UiInterface> ui,
std::unique_ptr<SchedulerDelegate> scheduler_delegate, std::unique_ptr<SchedulerDelegate> scheduler_delegate,
std::unique_ptr<GraphicsDelegate> graphics_delegate, std::unique_ptr<GraphicsDelegate> graphics_delegate,
std::unique_ptr<ControllerDelegate> controller_delegate, std::unique_ptr<InputDelegate> input_delegate,
BrowserRendererBrowserInterface* browser, BrowserRendererBrowserInterface* browser,
size_t sliding_time_size) size_t sliding_time_size)
: ui_(std::move(ui)), : ui_(std::move(ui)),
scheduler_delegate_(std::move(scheduler_delegate)), scheduler_delegate_(std::move(scheduler_delegate)),
graphics_delegate_(std::move(graphics_delegate)), graphics_delegate_(std::move(graphics_delegate)),
controller_delegate_(std::move(controller_delegate)), input_delegate_(std::move(input_delegate)),
browser_(browser), browser_(browser),
ui_processing_time_(sliding_time_size), ui_processing_time_(sliding_time_size),
ui_controller_update_time_(sliding_time_size), ui_controller_update_time_(sliding_time_size),
...@@ -43,18 +43,20 @@ BrowserRenderer::BrowserRenderer( ...@@ -43,18 +43,20 @@ BrowserRenderer::BrowserRenderer(
BrowserRenderer::~BrowserRenderer() = default; BrowserRenderer::~BrowserRenderer() = default;
void BrowserRenderer::DrawBrowserFrame(base::TimeTicks current_time) { void BrowserRenderer::DrawBrowserFrame(base::TimeTicks current_time) {
Draw(GraphicsDelegate::kUiFrame, current_time); Draw(kUiFrame, current_time, input_delegate_->GetHeadPose());
} }
void BrowserRenderer::DrawWebXrFrame(base::TimeTicks current_time) { void BrowserRenderer::DrawWebXrFrame(base::TimeTicks current_time,
Draw(GraphicsDelegate::kWebXrFrame, current_time); const gfx::Transform& head_pose) {
Draw(kWebXrFrame, current_time, head_pose);
} }
void BrowserRenderer::Draw(GraphicsDelegate::FrameType frame_type, void BrowserRenderer::Draw(FrameType frame_type,
base::TimeTicks current_time) { base::TimeTicks current_time,
const gfx::Transform& head_pose) {
TRACE_EVENT1("gpu", __func__, "frame_type", frame_type); TRACE_EVENT1("gpu", __func__, "frame_type", frame_type);
const auto& render_info = graphics_delegate_->GetRenderInfo( const auto& render_info =
frame_type, scheduler_delegate_->GetHeadPose()); graphics_delegate_->GetRenderInfo(frame_type, head_pose);
UpdateUi(render_info, current_time, frame_type); UpdateUi(render_info, current_time, frame_type);
ui_->OnProjMatrixChanged(render_info.left_eye_model.proj_matrix); ui_->OnProjMatrixChanged(render_info.left_eye_model.proj_matrix);
bool use_quad_layer = ui_->IsContentVisibleAndOpaque() && bool use_quad_layer = ui_->IsContentVisibleAndOpaque() &&
...@@ -62,7 +64,7 @@ void BrowserRenderer::Draw(GraphicsDelegate::FrameType frame_type, ...@@ -62,7 +64,7 @@ void BrowserRenderer::Draw(GraphicsDelegate::FrameType frame_type,
ui_->SetContentUsesQuadLayer(use_quad_layer); ui_->SetContentUsesQuadLayer(use_quad_layer);
graphics_delegate_->InitializeBuffers(); graphics_delegate_->InitializeBuffers();
if (frame_type == GraphicsDelegate::kWebXrFrame) { if (frame_type == kWebXrFrame) {
DCHECK(!use_quad_layer); DCHECK(!use_quad_layer);
DrawWebXr(); DrawWebXr();
if (ui_->HasWebXrOverlayElementsToDraw()) if (ui_->HasWebXrOverlayElementsToDraw())
...@@ -77,6 +79,8 @@ void BrowserRenderer::Draw(GraphicsDelegate::FrameType frame_type, ...@@ -77,6 +79,8 @@ void BrowserRenderer::Draw(GraphicsDelegate::FrameType frame_type,
ui_processing_time_.GetAverage().InMicroseconds(), ui_processing_time_.GetAverage().InMicroseconds(),
"controller", "controller",
ui_controller_update_time_.GetAverage().InMicroseconds()); ui_controller_update_time_.GetAverage().InMicroseconds());
scheduler_delegate_->SubmitDrawnFrame(frame_type, head_pose);
} }
void BrowserRenderer::DrawWebXr() { void BrowserRenderer::DrawWebXr() {
...@@ -128,16 +132,16 @@ void BrowserRenderer::DrawBrowserUi(const RenderInfo& render_info) { ...@@ -128,16 +132,16 @@ void BrowserRenderer::DrawBrowserUi(const RenderInfo& render_info) {
} }
void BrowserRenderer::OnPause() { void BrowserRenderer::OnPause() {
DCHECK(controller_delegate_); DCHECK(input_delegate_);
controller_delegate_->OnPause(); input_delegate_->OnPause();
scheduler_delegate_->OnPause(); scheduler_delegate_->OnPause();
ui_->OnPause(); ui_->OnPause();
} }
void BrowserRenderer::OnResume() { void BrowserRenderer::OnResume() {
DCHECK(controller_delegate_); DCHECK(input_delegate_);
scheduler_delegate_->OnResume(); scheduler_delegate_->OnResume();
controller_delegate_->OnResume(); input_delegate_->OnResume();
} }
void BrowserRenderer::OnExitPresent() { void BrowserRenderer::OnExitPresent() {
...@@ -251,7 +255,7 @@ void BrowserRenderer::AcceptDoffPromptForTesting() { ...@@ -251,7 +255,7 @@ void BrowserRenderer::AcceptDoffPromptForTesting() {
void BrowserRenderer::UpdateUi(const RenderInfo& render_info, void BrowserRenderer::UpdateUi(const RenderInfo& render_info,
base::TimeTicks current_time, base::TimeTicks current_time,
GraphicsDelegate::FrameType frame_type) { FrameType frame_type) {
TRACE_EVENT0("gpu", __func__); TRACE_EVENT0("gpu", __func__);
// Update the render position of all UI elements. // Update the render position of all UI elements.
...@@ -260,7 +264,7 @@ void BrowserRenderer::UpdateUi(const RenderInfo& render_info, ...@@ -260,7 +264,7 @@ void BrowserRenderer::UpdateUi(const RenderInfo& render_info,
// WebXR handles controller input in OnVsync. // WebXR handles controller input in OnVsync.
base::TimeDelta controller_time; base::TimeDelta controller_time;
if (frame_type == GraphicsDelegate::kUiFrame) if (frame_type == kUiFrame)
controller_time = ProcessControllerInput(render_info, current_time); controller_time = ProcessControllerInput(render_info, current_time);
if (ui_->SceneHasDirtyTextures()) { if (ui_->SceneHasDirtyTextures()) {
...@@ -281,19 +285,19 @@ void BrowserRenderer::UpdateUi(const RenderInfo& render_info, ...@@ -281,19 +285,19 @@ void BrowserRenderer::UpdateUi(const RenderInfo& render_info,
void BrowserRenderer::ProcessControllerInputForWebXr( void BrowserRenderer::ProcessControllerInputForWebXr(
base::TimeTicks current_time) { base::TimeTicks current_time) {
TRACE_EVENT0("gpu", __func__); TRACE_EVENT0("gpu", __func__);
DCHECK(controller_delegate_); DCHECK(input_delegate_);
DCHECK(ui_); DCHECK(ui_);
base::TimeTicks timing_start = base::TimeTicks::Now(); base::TimeTicks timing_start = base::TimeTicks::Now();
controller_delegate_->UpdateController(scheduler_delegate_->GetHeadPose(), // No transform required for input handling while in WebXR.
current_time, true); input_delegate_->UpdateController(gfx::Transform(), current_time, true);
auto input_event_list = controller_delegate_->GetGestures(current_time); auto input_event_list = input_delegate_->GetGestures(current_time);
ui_->HandleMenuButtonEvents(&input_event_list); ui_->HandleMenuButtonEvents(&input_event_list);
ui_controller_update_time_.AddSample(base::TimeTicks::Now() - timing_start); ui_controller_update_time_.AddSample(base::TimeTicks::Now() - timing_start);
scheduler_delegate_->AddInputSourceState( scheduler_delegate_->AddInputSourceState(
controller_delegate_->GetInputSourceState()); input_delegate_->GetInputSourceState());
} }
void BrowserRenderer::ConnectPresentingService( void BrowserRenderer::ConnectPresentingService(
...@@ -307,16 +311,15 @@ base::TimeDelta BrowserRenderer::ProcessControllerInput( ...@@ -307,16 +311,15 @@ base::TimeDelta BrowserRenderer::ProcessControllerInput(
const RenderInfo& render_info, const RenderInfo& render_info,
base::TimeTicks current_time) { base::TimeTicks current_time) {
TRACE_EVENT0("gpu", __func__); TRACE_EVENT0("gpu", __func__);
DCHECK(controller_delegate_); DCHECK(input_delegate_);
DCHECK(ui_); DCHECK(ui_);
base::TimeTicks timing_start = base::TimeTicks::Now(); base::TimeTicks timing_start = base::TimeTicks::Now();
controller_delegate_->UpdateController(render_info.head_pose, current_time, input_delegate_->UpdateController(render_info.head_pose, current_time, false);
false); auto input_event_list = input_delegate_->GetGestures(current_time);
auto input_event_list = controller_delegate_->GetGestures(current_time);
ReticleModel reticle_model; ReticleModel reticle_model;
ControllerModel controller_model = ControllerModel controller_model =
controller_delegate_->GetModel(render_info.head_pose); input_delegate_->GetControllerModel(render_info.head_pose);
ui_->HandleInput(current_time, render_info, controller_model, &reticle_model, ui_->HandleInput(current_time, render_info, controller_model, &reticle_model,
&input_event_list); &input_event_list);
ui_->OnControllerUpdated(controller_model, reticle_model); ui_->OnControllerUpdated(controller_model, reticle_model);
...@@ -328,30 +331,29 @@ base::TimeDelta BrowserRenderer::ProcessControllerInput( ...@@ -328,30 +331,29 @@ base::TimeDelta BrowserRenderer::ProcessControllerInput(
void BrowserRenderer::PerformControllerActionForTesting( void BrowserRenderer::PerformControllerActionForTesting(
ControllerTestInput controller_input) { ControllerTestInput controller_input) {
DCHECK(controller_delegate_); DCHECK(input_delegate_);
if (controller_input.action == if (controller_input.action ==
VrControllerTestAction::kRevertToRealController) { VrControllerTestAction::kRevertToRealController) {
if (using_controller_delegate_for_testing_) { if (using_input_delegate_for_testing_) {
DCHECK( DCHECK(static_cast<InputDelegateForTesting*>(input_delegate_.get())
static_cast<ControllerDelegateForTesting*>(controller_delegate_.get())
->IsQueueEmpty()) ->IsQueueEmpty())
<< "Attempted to revert to using real controller with actions still " << "Attempted to revert to using real controller with actions still "
"queued"; "queued";
using_controller_delegate_for_testing_ = false; using_input_delegate_for_testing_ = false;
controller_delegate_for_testing_.swap(controller_delegate_); input_delegate_for_testing_.swap(input_delegate_);
} }
return; return;
} }
if (!using_controller_delegate_for_testing_) { if (!using_input_delegate_for_testing_) {
using_controller_delegate_for_testing_ = true; using_input_delegate_for_testing_ = true;
if (!controller_delegate_for_testing_) if (!input_delegate_for_testing_)
controller_delegate_for_testing_ = input_delegate_for_testing_ =
std::make_unique<ControllerDelegateForTesting>(ui_.get()); std::make_unique<InputDelegateForTesting>(ui_.get());
controller_delegate_for_testing_.swap(controller_delegate_); input_delegate_for_testing_.swap(input_delegate_);
} }
if (controller_input.action != if (controller_input.action !=
VrControllerTestAction::kEnableMockedController) { VrControllerTestAction::kEnableMockedController) {
static_cast<ControllerDelegateForTesting*>(controller_delegate_.get()) static_cast<InputDelegateForTesting*>(input_delegate_.get())
->QueueControllerActionForTesting(controller_input); ->QueueControllerActionForTesting(controller_input);
} }
} }
......
...@@ -26,7 +26,7 @@ namespace vr { ...@@ -26,7 +26,7 @@ namespace vr {
enum class VrUiTestActivityResult; enum class VrUiTestActivityResult;
class BrowserUiInterface; class BrowserUiInterface;
class ControllerDelegate; class InputDelegate;
class PlatformInputHandler; class PlatformInputHandler;
class PlatformUiInputDelegate; class PlatformUiInputDelegate;
class BrowserRendererBrowserInterface; class BrowserRendererBrowserInterface;
...@@ -45,7 +45,7 @@ class VR_EXPORT BrowserRenderer : public SchedulerBrowserRendererInterface { ...@@ -45,7 +45,7 @@ class VR_EXPORT BrowserRenderer : public SchedulerBrowserRendererInterface {
BrowserRenderer(std::unique_ptr<UiInterface> ui, BrowserRenderer(std::unique_ptr<UiInterface> ui,
std::unique_ptr<SchedulerDelegate> scheduler_delegate, std::unique_ptr<SchedulerDelegate> scheduler_delegate,
std::unique_ptr<GraphicsDelegate> graphics_delegate, std::unique_ptr<GraphicsDelegate> graphics_delegate,
std::unique_ptr<ControllerDelegate> controller_delegate, std::unique_ptr<InputDelegate> input_delegate,
BrowserRendererBrowserInterface* browser, BrowserRendererBrowserInterface* browser,
size_t sliding_time_size); size_t sliding_time_size);
~BrowserRenderer() override; ~BrowserRenderer() override;
...@@ -82,20 +82,22 @@ class VR_EXPORT BrowserRenderer : public SchedulerBrowserRendererInterface { ...@@ -82,20 +82,22 @@ class VR_EXPORT BrowserRenderer : public SchedulerBrowserRendererInterface {
device::mojom::VRDisplayInfoPtr display_info, device::mojom::VRDisplayInfoPtr display_info,
device::mojom::XRRuntimeSessionOptionsPtr options); device::mojom::XRRuntimeSessionOptionsPtr options);
private:
// SchedulerBrowserRendererInterface implementation. // SchedulerBrowserRendererInterface implementation.
void DrawBrowserFrame(base::TimeTicks current_time) override; void DrawBrowserFrame(base::TimeTicks current_time) override;
void DrawWebXrFrame(base::TimeTicks current_time) override; void DrawWebXrFrame(base::TimeTicks current_time,
const gfx::Transform& head_pose) override;
void ProcessControllerInputForWebXr(base::TimeTicks current_time) override; void ProcessControllerInputForWebXr(base::TimeTicks current_time) override;
private: void Draw(FrameType frame_type,
void Draw(GraphicsDelegate::FrameType frame_type, base::TimeTicks current_time,
base::TimeTicks current_time); const gfx::Transform& head_pose);
// Position, hide and/or show UI elements, process input and update textures. // Position, hide and/or show UI elements, process input and update textures.
// Returns true if the scene changed. // Returns true if the scene changed.
void UpdateUi(const RenderInfo& render_info, void UpdateUi(const RenderInfo& render_info,
base::TimeTicks currrent_time, base::TimeTicks currrent_time,
GraphicsDelegate::FrameType frame_type); FrameType frame_type);
void DrawWebXr(); void DrawWebXr();
void DrawWebXrOverlay(const RenderInfo& render_info); void DrawWebXrOverlay(const RenderInfo& render_info);
void DrawContentQuad(); void DrawContentQuad();
...@@ -110,9 +112,9 @@ class VR_EXPORT BrowserRenderer : public SchedulerBrowserRendererInterface { ...@@ -110,9 +112,9 @@ class VR_EXPORT BrowserRenderer : public SchedulerBrowserRendererInterface {
std::unique_ptr<UiInterface> ui_; std::unique_ptr<UiInterface> ui_;
std::unique_ptr<SchedulerDelegate> scheduler_delegate_; std::unique_ptr<SchedulerDelegate> scheduler_delegate_;
std::unique_ptr<GraphicsDelegate> graphics_delegate_; std::unique_ptr<GraphicsDelegate> graphics_delegate_;
std::unique_ptr<ControllerDelegate> controller_delegate_; std::unique_ptr<InputDelegate> input_delegate_;
std::unique_ptr<ControllerDelegate> controller_delegate_for_testing_; std::unique_ptr<InputDelegate> input_delegate_for_testing_;
bool using_controller_delegate_for_testing_ = false; bool using_input_delegate_for_testing_ = false;
std::unique_ptr<PlatformUiInputDelegate> vr_dialog_input_delegate_; std::unique_ptr<PlatformUiInputDelegate> vr_dialog_input_delegate_;
......
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_VR_FRAME_TYPE_H_
#define CHROME_BROWSER_VR_FRAME_TYPE_H_
namespace vr {
enum FrameType { kUiFrame, kWebXrFrame };
} // namespace vr
#endif // CHROME_BROWSER_VR_FRAME_TYPE_H_
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
#include "base/callback.h" #include "base/callback.h"
#include "chrome/browser/vr/fov_rectangle.h" #include "chrome/browser/vr/fov_rectangle.h"
#include "chrome/browser/vr/frame_type.h"
#include "chrome/browser/vr/gl_texture_location.h" #include "chrome/browser/vr/gl_texture_location.h"
#include "chrome/browser/vr/vr_export.h" #include "chrome/browser/vr/vr_export.h"
...@@ -29,7 +30,6 @@ struct RenderInfo; ...@@ -29,7 +30,6 @@ struct RenderInfo;
class VR_EXPORT GraphicsDelegate { class VR_EXPORT GraphicsDelegate {
public: public:
using Transform = float[16]; using Transform = float[16];
enum FrameType { kUiFrame, kWebXrFrame };
using SkiaContextCallback = base::OnceCallback<void()>; using SkiaContextCallback = base::OnceCallback<void()>;
using TexturesInitializedCallback = base::OnceCallback< using TexturesInitializedCallback = base::OnceCallback<
void(GlTextureLocation, unsigned int, unsigned int, unsigned int)>; void(GlTextureLocation, unsigned int, unsigned int, unsigned int)>;
......
...@@ -2,8 +2,8 @@ ...@@ -2,8 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
#ifndef CHROME_BROWSER_VR_CONTROLLER_DELEGATE_H_ #ifndef CHROME_BROWSER_VR_INPUT_DELEGATE_H_
#define CHROME_BROWSER_VR_CONTROLLER_DELEGATE_H_ #define CHROME_BROWSER_VR_INPUT_DELEGATE_H_
#include <memory> #include <memory>
#include <vector> #include <vector>
...@@ -22,16 +22,17 @@ struct ControllerModel; ...@@ -22,16 +22,17 @@ struct ControllerModel;
using InputEventList = std::vector<std::unique_ptr<InputEvent>>; using InputEventList = std::vector<std::unique_ptr<InputEvent>>;
// Communicates with the PlatformController to update it and obtain input and // Obtains input from the controller and head poses from the headset.
// movement information. class InputDelegate {
class ControllerDelegate {
public: public:
virtual ~ControllerDelegate() {} virtual ~InputDelegate() {}
virtual gfx::Transform GetHeadPose() = 0;
virtual void UpdateController(const gfx::Transform& head_pose, virtual void UpdateController(const gfx::Transform& head_pose,
base::TimeTicks current_time, base::TimeTicks current_time,
bool is_webxr_frame) = 0; bool is_webxr_frame) = 0;
virtual ControllerModel GetModel(const gfx::Transform& head_pose) = 0; virtual ControllerModel GetControllerModel(
const gfx::Transform& head_pose) = 0;
virtual InputEventList GetGestures(base::TimeTicks current_time) = 0; virtual InputEventList GetGestures(base::TimeTicks current_time) = 0;
virtual device::mojom::XRInputSourceStatePtr GetInputSourceState() = 0; virtual device::mojom::XRInputSourceStatePtr GetInputSourceState() = 0;
virtual void OnResume() = 0; virtual void OnResume() = 0;
...@@ -40,4 +41,4 @@ class ControllerDelegate { ...@@ -40,4 +41,4 @@ class ControllerDelegate {
} // namespace vr } // namespace vr
#endif // CHROME_BROWSER_VR_CONTROLLER_DELEGATE_H_ #endif // CHROME_BROWSER_VR_INPUT_DELEGATE_H_
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
#include "chrome/browser/vr/controller_delegate_for_testing.h" #include "chrome/browser/vr/input_delegate_for_testing.h"
#include "chrome/browser/vr/input_event.h" #include "chrome/browser/vr/input_event.h"
#include "chrome/browser/vr/ui_interface.h" #include "chrome/browser/vr/ui_interface.h"
...@@ -34,15 +34,18 @@ void SetOriginAndTransform(vr::ControllerModel* model) { ...@@ -34,15 +34,18 @@ void SetOriginAndTransform(vr::ControllerModel* model) {
namespace vr { namespace vr {
ControllerDelegateForTesting::ControllerDelegateForTesting(UiInterface* ui) InputDelegateForTesting::InputDelegateForTesting(UiInterface* ui) : ui_(ui) {
: ui_(ui) {
cached_controller_model_.laser_direction = kForwardVector; cached_controller_model_.laser_direction = kForwardVector;
SetOriginAndTransform(&cached_controller_model_); SetOriginAndTransform(&cached_controller_model_);
} }
ControllerDelegateForTesting::~ControllerDelegateForTesting() = default; InputDelegateForTesting::~InputDelegateForTesting() = default;
void ControllerDelegateForTesting::QueueControllerActionForTesting( gfx::Transform InputDelegateForTesting::GetHeadPose() {
return gfx::Transform();
}
void InputDelegateForTesting::QueueControllerActionForTesting(
ControllerTestInput controller_input) { ControllerTestInput controller_input) {
DCHECK_NE(controller_input.action, DCHECK_NE(controller_input.action,
VrControllerTestAction::kRevertToRealController); VrControllerTestAction::kRevertToRealController);
...@@ -92,12 +95,11 @@ void ControllerDelegateForTesting::QueueControllerActionForTesting( ...@@ -92,12 +95,11 @@ void ControllerDelegateForTesting::QueueControllerActionForTesting(
} }
} }
bool ControllerDelegateForTesting::IsQueueEmpty() const { bool InputDelegateForTesting::IsQueueEmpty() const {
return controller_model_queue_.empty(); return controller_model_queue_.empty();
} }
void ControllerDelegateForTesting::UpdateController( void InputDelegateForTesting::UpdateController(const gfx::Transform& head_pose,
const gfx::Transform& head_pose,
base::TimeTicks current_time, base::TimeTicks current_time,
bool is_webxr_frame) { bool is_webxr_frame) {
if (!controller_model_queue_.empty()) { if (!controller_model_queue_.empty()) {
...@@ -108,18 +110,18 @@ void ControllerDelegateForTesting::UpdateController( ...@@ -108,18 +110,18 @@ void ControllerDelegateForTesting::UpdateController(
cached_controller_model_.last_button_timestamp = current_time; cached_controller_model_.last_button_timestamp = current_time;
} }
ControllerModel ControllerDelegateForTesting::GetModel( ControllerModel InputDelegateForTesting::GetControllerModel(
const gfx::Transform& head_pose) { const gfx::Transform& head_pose) {
return cached_controller_model_; return cached_controller_model_;
} }
InputEventList ControllerDelegateForTesting::GetGestures( InputEventList InputDelegateForTesting::GetGestures(
base::TimeTicks current_time) { base::TimeTicks current_time) {
return InputEventList(); return InputEventList();
} }
device::mojom::XRInputSourceStatePtr device::mojom::XRInputSourceStatePtr
ControllerDelegateForTesting::GetInputSourceState() { InputDelegateForTesting::GetInputSourceState() {
auto state = device::mojom::XRInputSourceState::New(); auto state = device::mojom::XRInputSourceState::New();
state->description = device::mojom::XRInputSourceDescription::New(); state->description = device::mojom::XRInputSourceDescription::New();
state->source_id = 1; state->source_id = 1;
...@@ -130,8 +132,8 @@ ControllerDelegateForTesting::GetInputSourceState() { ...@@ -130,8 +132,8 @@ ControllerDelegateForTesting::GetInputSourceState() {
return state; return state;
} }
void ControllerDelegateForTesting::OnResume() {} void InputDelegateForTesting::OnResume() {}
void ControllerDelegateForTesting::OnPause() {} void InputDelegateForTesting::OnPause() {}
} // namespace vr } // namespace vr
...@@ -2,13 +2,13 @@ ...@@ -2,13 +2,13 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
#ifndef CHROME_BROWSER_VR_CONTROLLER_DELEGATE_FOR_TESTING_H_ #ifndef CHROME_BROWSER_VR_INPUT_DELEGATE_FOR_TESTING_H_
#define CHROME_BROWSER_VR_CONTROLLER_DELEGATE_FOR_TESTING_H_ #define CHROME_BROWSER_VR_INPUT_DELEGATE_FOR_TESTING_H_
#include <queue> #include <queue>
#include "base/macros.h" #include "base/macros.h"
#include "chrome/browser/vr/controller_delegate.h" #include "chrome/browser/vr/input_delegate.h"
#include "chrome/browser/vr/model/controller_model.h" #include "chrome/browser/vr/model/controller_model.h"
namespace vr { namespace vr {
...@@ -16,19 +16,20 @@ namespace vr { ...@@ -16,19 +16,20 @@ namespace vr {
class UiInterface; class UiInterface;
struct ControllerTestInput; struct ControllerTestInput;
class ControllerDelegateForTesting : public ControllerDelegate { class InputDelegateForTesting : public InputDelegate {
public: public:
explicit ControllerDelegateForTesting(UiInterface* ui); explicit InputDelegateForTesting(UiInterface* ui);
~ControllerDelegateForTesting() override; ~InputDelegateForTesting() override;
void QueueControllerActionForTesting(ControllerTestInput controller_input); void QueueControllerActionForTesting(ControllerTestInput controller_input);
bool IsQueueEmpty() const; bool IsQueueEmpty() const;
// ControllerDelegate implementation. // InputDelegate implementation.
gfx::Transform GetHeadPose() override;
void UpdateController(const gfx::Transform& head_pose, void UpdateController(const gfx::Transform& head_pose,
base::TimeTicks current_time, base::TimeTicks current_time,
bool is_webxr_frame) override; bool is_webxr_frame) override;
ControllerModel GetModel(const gfx::Transform& head_pose) override; ControllerModel GetControllerModel(const gfx::Transform& head_pose) override;
InputEventList GetGestures(base::TimeTicks current_time) override; InputEventList GetGestures(base::TimeTicks current_time) override;
device::mojom::XRInputSourceStatePtr GetInputSourceState() override; device::mojom::XRInputSourceStatePtr GetInputSourceState() override;
void OnResume() override; void OnResume() override;
...@@ -39,9 +40,9 @@ class ControllerDelegateForTesting : public ControllerDelegate { ...@@ -39,9 +40,9 @@ class ControllerDelegateForTesting : public ControllerDelegate {
std::queue<ControllerModel> controller_model_queue_; std::queue<ControllerModel> controller_model_queue_;
ControllerModel cached_controller_model_; ControllerModel cached_controller_model_;
DISALLOW_COPY_AND_ASSIGN(ControllerDelegateForTesting); DISALLOW_COPY_AND_ASSIGN(InputDelegateForTesting);
}; };
} // namespace vr } // namespace vr
#endif // CHROME_BROWSER_VR_CONTROLLER_DELEGATE_FOR_TESTING_H_ #endif // CHROME_BROWSER_VR_INPUT_DELEGATE_FOR_TESTING_H_
...@@ -9,13 +9,19 @@ namespace base { ...@@ -9,13 +9,19 @@ namespace base {
class TimeTicks; class TimeTicks;
} }
namespace gfx {
class Transform;
}
namespace vr { namespace vr {
class SchedulerBrowserRendererInterface { class SchedulerBrowserRendererInterface {
public: public:
virtual ~SchedulerBrowserRendererInterface() {} virtual ~SchedulerBrowserRendererInterface() {}
virtual void DrawBrowserFrame(base::TimeTicks current_time) = 0; virtual void DrawBrowserFrame(base::TimeTicks current_time) = 0;
virtual void DrawWebXrFrame(base::TimeTicks current_time) = 0; // Pass the same head_pose used to render the submitted WebXR frame.
virtual void DrawWebXrFrame(base::TimeTicks current_time,
const gfx::Transform& head_pose) = 0;
virtual void ProcessControllerInputForWebXr(base::TimeTicks current_time) = 0; virtual void ProcessControllerInputForWebXr(base::TimeTicks current_time) = 0;
}; };
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
#include "base/callback.h" #include "base/callback.h"
#include "base/time/time.h" #include "base/time/time.h"
#include "chrome/browser/vr/frame_type.h"
#include "chrome/browser/vr/vr_export.h" #include "chrome/browser/vr/vr_export.h"
#include "device/vr/public/mojom/isolated_xr_service.mojom.h" #include "device/vr/public/mojom/isolated_xr_service.mojom.h"
#include "device/vr/public/mojom/vr_service.mojom.h" #include "device/vr/public/mojom/vr_service.mojom.h"
...@@ -21,9 +22,7 @@ class SchedulerBrowserRendererInterface; ...@@ -21,9 +22,7 @@ class SchedulerBrowserRendererInterface;
// The SchedulerDelegate is responsible for starting the draw calls of the // The SchedulerDelegate is responsible for starting the draw calls of the
// BrowserRenderer, given different signals, such as WebXR frames submitted or // BrowserRenderer, given different signals, such as WebXR frames submitted or
// VSync events. It also provides head poses, obtained from the underlaying // VSync events.
// platform.
// TODO(acondor): Move head pose logic to the ControllerDelegate.
class VR_EXPORT SchedulerDelegate { class VR_EXPORT SchedulerDelegate {
public: public:
virtual ~SchedulerDelegate() {} virtual ~SchedulerDelegate() {}
...@@ -31,13 +30,14 @@ class VR_EXPORT SchedulerDelegate { ...@@ -31,13 +30,14 @@ class VR_EXPORT SchedulerDelegate {
virtual void OnPause() = 0; virtual void OnPause() = 0;
virtual void OnResume() = 0; virtual void OnResume() = 0;
virtual gfx::Transform GetHeadPose() = 0;
virtual void OnExitPresent() = 0; virtual void OnExitPresent() = 0;
virtual void OnTriggerEvent(bool pressed) = 0; virtual void OnTriggerEvent(bool pressed) = 0;
virtual void SetWebXrMode(bool enabled) = 0; virtual void SetWebXrMode(bool enabled) = 0;
virtual void SetShowingVrDialog(bool showing) = 0; virtual void SetShowingVrDialog(bool showing) = 0;
virtual void SetBrowserRenderer( virtual void SetBrowserRenderer(
SchedulerBrowserRendererInterface* browser_renderer) = 0; SchedulerBrowserRendererInterface* browser_renderer) = 0;
virtual void SubmitDrawnFrame(FrameType frame_type,
const gfx::Transform& transform) = 0;
virtual void AddInputSourceState( virtual void AddInputSourceState(
device::mojom::XRInputSourceStatePtr state) = 0; device::mojom::XRInputSourceStatePtr state) = 0;
virtual void ConnectPresentingService( virtual void ConnectPresentingService(
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment