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(
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) {
support_->SetNeedsBeginFrame(needs_begin_frame);
}
......
......@@ -7,6 +7,7 @@
#include <memory>
#include "build/build_config.h"
#include "components/viz/common/surfaces/frame_sink_id.h"
#include "components/viz/common/surfaces/local_surface_id.h"
#include "components/viz/service/display/display_client.h"
......@@ -49,6 +50,9 @@ class RootCompositorFrameSinkImpl : public mojom::CompositorFrameSink,
void SetAuthoritativeVSyncInterval(base::TimeDelta interval) override;
void SetDisplayVSyncParameters(base::TimeTicks timebase,
base::TimeDelta interval) override;
#if defined(OS_ANDROID)
void SetVSyncPaused(bool paused) override;
#endif
// mojom::CompositorFrameSink:
void SetNeedsBeginFrame(bool needs_begin_frame) override;
......
......@@ -48,6 +48,7 @@ class MockCompositor : public WindowAndroidCompositor {
return nullptr;
}
bool IsDrawingFirstVisibleFrame() const override { return false; }
void SetVSyncPaused(bool paused) override {}
};
class MockGlowClient : public OverscrollGlowClient {
......
......@@ -1231,6 +1231,19 @@ bool CompositorImpl::IsDrawingFirstVisibleFrame() const {
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) {
if (host_)
host_->SetDeferCommits(locked);
......@@ -1325,6 +1338,7 @@ void CompositorImpl::InitializeVizLayerTreeFrameSink(
host_->SetLayerTreeFrameSink(std::move(layer_tree_frame_sink));
display_private_->SetDisplayVisible(true);
display_private_->Resize(size_);
display_private_->SetVSyncPaused(vsync_paused_);
}
viz::LocalSurfaceId CompositorImpl::GenerateLocalSurfaceId() const {
......
......@@ -148,6 +148,7 @@ class CONTENT_EXPORT CompositorImpl
ui::CompositorLockClient* client,
base::TimeDelta timeout) override;
bool IsDrawingFirstVisibleFrame() const override;
void SetVSyncPaused(bool paused) override;
// viz::HostFrameSinkClient implementation.
void OnFirstSurfaceActivation(const viz::SurfaceInfo& surface_info) override {
......@@ -253,6 +254,7 @@ class CONTENT_EXPORT CompositorImpl
// Viz-specific members for communicating with the display.
viz::mojom::DisplayPrivateAssociatedPtr display_private_;
std::unique_ptr<viz::HostDisplayClient> display_client_;
bool vsync_paused_ = false;
// Test-only. Called when we are notified of a swap.
base::RepeatingCallback<void(const gfx::Size&)>
......
......@@ -43,6 +43,10 @@ interface DisplayPrivate {
SetDisplayVSyncParameters(
mojo_base.mojom.TimeTicks timebase,
mojo_base.mojom.TimeDelta interval);
// Notifies the display to pause VSync signals. Used for VR.
[EnableIf=is_android]
SetVSyncPaused(bool paused);
};
interface DisplayClient {
......
......@@ -54,6 +54,7 @@ class MockWindowAndroidCompositor : public WindowAndroidCompositor {
MOCK_METHOD2(DoGetCompositorLock,
CompositorLock*(CompositorLockClient*, base::TimeDelta));
MOCK_CONST_METHOD0(IsDrawingFirstVisibleFrame, bool());
MOCK_METHOD1(SetVSyncPaused, void(bool));
// Helpers for move-only types:
void RequestCopyOfOutputOnRootLayer(
......
......@@ -191,6 +191,8 @@ void WindowAndroid::AttachCompositor(WindowAndroidCompositor* compositor) {
compositor_ = compositor;
for (WindowAndroidObserver& observer : observer_list_)
observer.OnAttachCompositor();
compositor_->SetVSyncPaused(vsync_paused_);
}
void WindowAndroid::DetachCompositor() {
......@@ -271,6 +273,11 @@ void WindowAndroid::OnActivityStarted(JNIEnv* env,
void WindowAndroid::SetVSyncPaused(JNIEnv* env,
const JavaParamRef<jobject>& obj,
bool paused) {
vsync_paused_ = paused;
if (compositor_)
compositor_->SetVSyncPaused(paused);
begin_frame_source_->OnPauseChanged(paused);
}
......
......@@ -119,6 +119,7 @@ class UI_ANDROID_EXPORT WindowAndroid : public ViewAndroid {
bool needs_begin_frames_;
std::list<base::Closure> vsync_complete_callbacks_;
float mouse_wheel_scroll_factor_;
bool vsync_paused_ = false;
DISALLOW_COPY_AND_ASSIGN(WindowAndroid);
};
......
......@@ -37,6 +37,7 @@ class UI_ANDROID_EXPORT WindowAndroidCompositor {
CompositorLockClient* client,
base::TimeDelta timeout) = 0;
virtual bool IsDrawingFirstVisibleFrame() const = 0;
virtual void SetVSyncPaused(bool paused) = 0;
};
} // 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