Commit 4ce5757e authored by Eric Karl's avatar Eric Karl Committed by Commit Bot

Android OOP-D: Forward VSync pause requests to Viz proc

Currently VR pauses/unpuases VSync during certain transitions. These
calls work when the Browser's AndroidWindow is the VSync provider, but
not when using a remote GPU proc VSync provider. Forward these signals
to the GPU process.

TBR=yfriedman for really uninteresting test-code update.

Bug: 871774
Cq-Include-Trybots: luci.chromium.try:android_optional_gpu_tests_rel
Change-Id: Ic47cb14fdf702e294db90b5ad69b8cdfb5c67403
Reviewed-on: https://chromium-review.googlesource.com/1175198Reviewed-by: default avatarEric Karl <ericrk@chromium.org>
Reviewed-by: default avatarTom Sepez <tsepez@chromium.org>
Reviewed-by: default avatarKhushal <khushalsagar@chromium.org>
Commit-Queue: Eric Karl <ericrk@chromium.org>
Cr-Commit-Position: refs/heads/master@{#583505}
parent 957a6e90
...@@ -140,6 +140,13 @@ void RootCompositorFrameSinkImpl::SetDisplayVSyncParameters( ...@@ -140,6 +140,13 @@ void RootCompositorFrameSinkImpl::SetDisplayVSyncParameters(
synthetic_begin_frame_source_->OnUpdateVSyncParameters(timebase, interval); synthetic_begin_frame_source_->OnUpdateVSyncParameters(timebase, interval);
} }
#if defined(OS_ANDROID)
void RootCompositorFrameSinkImpl::SetVSyncPaused(bool paused) {
if (external_begin_frame_source_)
external_begin_frame_source_->OnSetBeginFrameSourcePaused(paused);
}
#endif // defined(OS_ANDROID)
void RootCompositorFrameSinkImpl::SetNeedsBeginFrame(bool needs_begin_frame) { void RootCompositorFrameSinkImpl::SetNeedsBeginFrame(bool needs_begin_frame) {
support_->SetNeedsBeginFrame(needs_begin_frame); support_->SetNeedsBeginFrame(needs_begin_frame);
} }
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
#include <memory> #include <memory>
#include "build/build_config.h"
#include "components/viz/common/surfaces/frame_sink_id.h" #include "components/viz/common/surfaces/frame_sink_id.h"
#include "components/viz/common/surfaces/local_surface_id.h" #include "components/viz/common/surfaces/local_surface_id.h"
#include "components/viz/service/display/display_client.h" #include "components/viz/service/display/display_client.h"
...@@ -49,6 +50,9 @@ class RootCompositorFrameSinkImpl : public mojom::CompositorFrameSink, ...@@ -49,6 +50,9 @@ class RootCompositorFrameSinkImpl : public mojom::CompositorFrameSink,
void SetAuthoritativeVSyncInterval(base::TimeDelta interval) override; void SetAuthoritativeVSyncInterval(base::TimeDelta interval) override;
void SetDisplayVSyncParameters(base::TimeTicks timebase, void SetDisplayVSyncParameters(base::TimeTicks timebase,
base::TimeDelta interval) override; base::TimeDelta interval) override;
#if defined(OS_ANDROID)
void SetVSyncPaused(bool paused) override;
#endif
// mojom::CompositorFrameSink: // mojom::CompositorFrameSink:
void SetNeedsBeginFrame(bool needs_begin_frame) override; void SetNeedsBeginFrame(bool needs_begin_frame) override;
......
...@@ -48,6 +48,7 @@ class MockCompositor : public WindowAndroidCompositor { ...@@ -48,6 +48,7 @@ class MockCompositor : public WindowAndroidCompositor {
return nullptr; return nullptr;
} }
bool IsDrawingFirstVisibleFrame() const override { return false; } bool IsDrawingFirstVisibleFrame() const override { return false; }
void SetVSyncPaused(bool paused) override {}
}; };
class MockGlowClient : public OverscrollGlowClient { class MockGlowClient : public OverscrollGlowClient {
......
...@@ -1231,6 +1231,19 @@ bool CompositorImpl::IsDrawingFirstVisibleFrame() const { ...@@ -1231,6 +1231,19 @@ bool CompositorImpl::IsDrawingFirstVisibleFrame() const {
return !has_submitted_frame_since_became_visible_; return !has_submitted_frame_since_became_visible_;
} }
void CompositorImpl::SetVSyncPaused(bool paused) {
// No action needed in non-Viz mode, as VSync is handled in WindowAndroid.
if (!enable_viz_)
return;
if (vsync_paused_ == paused)
return;
vsync_paused_ = paused;
if (display_private_)
display_private_->SetVSyncPaused(paused);
}
void CompositorImpl::OnCompositorLockStateChanged(bool locked) { void CompositorImpl::OnCompositorLockStateChanged(bool locked) {
if (host_) if (host_)
host_->SetDeferCommits(locked); host_->SetDeferCommits(locked);
...@@ -1325,6 +1338,7 @@ void CompositorImpl::InitializeVizLayerTreeFrameSink( ...@@ -1325,6 +1338,7 @@ void CompositorImpl::InitializeVizLayerTreeFrameSink(
host_->SetLayerTreeFrameSink(std::move(layer_tree_frame_sink)); host_->SetLayerTreeFrameSink(std::move(layer_tree_frame_sink));
display_private_->SetDisplayVisible(true); display_private_->SetDisplayVisible(true);
display_private_->Resize(size_); display_private_->Resize(size_);
display_private_->SetVSyncPaused(vsync_paused_);
} }
viz::LocalSurfaceId CompositorImpl::GenerateLocalSurfaceId() const { viz::LocalSurfaceId CompositorImpl::GenerateLocalSurfaceId() const {
......
...@@ -148,6 +148,7 @@ class CONTENT_EXPORT CompositorImpl ...@@ -148,6 +148,7 @@ class CONTENT_EXPORT CompositorImpl
ui::CompositorLockClient* client, ui::CompositorLockClient* client,
base::TimeDelta timeout) override; base::TimeDelta timeout) override;
bool IsDrawingFirstVisibleFrame() const override; bool IsDrawingFirstVisibleFrame() const override;
void SetVSyncPaused(bool paused) override;
// viz::HostFrameSinkClient implementation. // viz::HostFrameSinkClient implementation.
void OnFirstSurfaceActivation(const viz::SurfaceInfo& surface_info) override { void OnFirstSurfaceActivation(const viz::SurfaceInfo& surface_info) override {
...@@ -253,6 +254,7 @@ class CONTENT_EXPORT CompositorImpl ...@@ -253,6 +254,7 @@ class CONTENT_EXPORT CompositorImpl
// Viz-specific members for communicating with the display. // Viz-specific members for communicating with the display.
viz::mojom::DisplayPrivateAssociatedPtr display_private_; viz::mojom::DisplayPrivateAssociatedPtr display_private_;
std::unique_ptr<viz::HostDisplayClient> display_client_; std::unique_ptr<viz::HostDisplayClient> display_client_;
bool vsync_paused_ = false;
// Test-only. Called when we are notified of a swap. // Test-only. Called when we are notified of a swap.
base::RepeatingCallback<void(const gfx::Size&)> base::RepeatingCallback<void(const gfx::Size&)>
......
...@@ -43,6 +43,10 @@ interface DisplayPrivate { ...@@ -43,6 +43,10 @@ interface DisplayPrivate {
SetDisplayVSyncParameters( SetDisplayVSyncParameters(
mojo_base.mojom.TimeTicks timebase, mojo_base.mojom.TimeTicks timebase,
mojo_base.mojom.TimeDelta interval); mojo_base.mojom.TimeDelta interval);
// Notifies the display to pause VSync signals. Used for VR.
[EnableIf=is_android]
SetVSyncPaused(bool paused);
}; };
interface DisplayClient { interface DisplayClient {
......
...@@ -54,6 +54,7 @@ class MockWindowAndroidCompositor : public WindowAndroidCompositor { ...@@ -54,6 +54,7 @@ class MockWindowAndroidCompositor : public WindowAndroidCompositor {
MOCK_METHOD2(DoGetCompositorLock, MOCK_METHOD2(DoGetCompositorLock,
CompositorLock*(CompositorLockClient*, base::TimeDelta)); CompositorLock*(CompositorLockClient*, base::TimeDelta));
MOCK_CONST_METHOD0(IsDrawingFirstVisibleFrame, bool()); MOCK_CONST_METHOD0(IsDrawingFirstVisibleFrame, bool());
MOCK_METHOD1(SetVSyncPaused, void(bool));
// Helpers for move-only types: // Helpers for move-only types:
void RequestCopyOfOutputOnRootLayer( void RequestCopyOfOutputOnRootLayer(
......
...@@ -191,6 +191,8 @@ void WindowAndroid::AttachCompositor(WindowAndroidCompositor* compositor) { ...@@ -191,6 +191,8 @@ void WindowAndroid::AttachCompositor(WindowAndroidCompositor* compositor) {
compositor_ = compositor; compositor_ = compositor;
for (WindowAndroidObserver& observer : observer_list_) for (WindowAndroidObserver& observer : observer_list_)
observer.OnAttachCompositor(); observer.OnAttachCompositor();
compositor_->SetVSyncPaused(vsync_paused_);
} }
void WindowAndroid::DetachCompositor() { void WindowAndroid::DetachCompositor() {
...@@ -271,6 +273,11 @@ void WindowAndroid::OnActivityStarted(JNIEnv* env, ...@@ -271,6 +273,11 @@ void WindowAndroid::OnActivityStarted(JNIEnv* env,
void WindowAndroid::SetVSyncPaused(JNIEnv* env, void WindowAndroid::SetVSyncPaused(JNIEnv* env,
const JavaParamRef<jobject>& obj, const JavaParamRef<jobject>& obj,
bool paused) { bool paused) {
vsync_paused_ = paused;
if (compositor_)
compositor_->SetVSyncPaused(paused);
begin_frame_source_->OnPauseChanged(paused); begin_frame_source_->OnPauseChanged(paused);
} }
......
...@@ -119,6 +119,7 @@ class UI_ANDROID_EXPORT WindowAndroid : public ViewAndroid { ...@@ -119,6 +119,7 @@ class UI_ANDROID_EXPORT WindowAndroid : public ViewAndroid {
bool needs_begin_frames_; bool needs_begin_frames_;
std::list<base::Closure> vsync_complete_callbacks_; std::list<base::Closure> vsync_complete_callbacks_;
float mouse_wheel_scroll_factor_; float mouse_wheel_scroll_factor_;
bool vsync_paused_ = false;
DISALLOW_COPY_AND_ASSIGN(WindowAndroid); DISALLOW_COPY_AND_ASSIGN(WindowAndroid);
}; };
......
...@@ -37,6 +37,7 @@ class UI_ANDROID_EXPORT WindowAndroidCompositor { ...@@ -37,6 +37,7 @@ class UI_ANDROID_EXPORT WindowAndroidCompositor {
CompositorLockClient* client, CompositorLockClient* client,
base::TimeDelta timeout) = 0; base::TimeDelta timeout) = 0;
virtual bool IsDrawingFirstVisibleFrame() const = 0; virtual bool IsDrawingFirstVisibleFrame() const = 0;
virtual void SetVSyncPaused(bool paused) = 0;
}; };
} // namespace ui } // namespace ui
......
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