Commit 08681fad authored by Bo Liu's avatar Bo Liu Committed by Commit Bot

android: Remove readback_layer

Layer serves no purpose except keeping track of whether there are any
pending readback requests. It used to be used for actual readback
requests, but requests have been moved to surfaces when they were
introduced.

Remove it and replace it with a counter instead.

Change-Id: I37eafbe462672703805440001346de485a03c30e
Reviewed-on: https://chromium-review.googlesource.com/1001612Reviewed-by: default avatarTed Choc <tedchoc@chromium.org>
Commit-Queue: Bo <boliu@chromium.org>
Cr-Commit-Position: refs/heads/master@{#549222}
parent 5c36a27a
......@@ -35,7 +35,11 @@ namespace {
class MockCompositor : public WindowAndroidCompositor {
public:
~MockCompositor() override {}
void AttachLayerForReadback(scoped_refptr<cc::Layer>) override {}
base::WeakPtr<ui::WindowAndroidCompositor> GetWeakPtr() override {
return nullptr;
}
void IncrementReadbackRequestCount() override {}
void DecrementReadbackRequestCount() override {}
void RequestCopyOfOutputOnRootLayer(
std::unique_ptr<viz::CopyOutputRequest>) override {}
void SetNeedsAnimate() override {}
......
......@@ -545,11 +545,6 @@ void CompositorImpl::SetRootWindow(gfx::NativeWindow root_window) {
root_window_ = root_window;
root_window_->SetLayer(root_layer ? root_layer : cc::Layer::Create());
root_window_->GetLayer()->SetBounds(size_);
if (!readback_layer_tree_) {
readback_layer_tree_ = cc::Layer::Create();
readback_layer_tree_->SetHideLayerAndSubtree(true);
}
root_window->GetLayer()->AddChild(readback_layer_tree_);
root_window->AttachCompositor(this);
if (!host_) {
CreateLayerTreeHost();
......@@ -929,8 +924,17 @@ void CompositorImpl::DidCommit() {
root_window_->OnCompositingDidCommit();
}
void CompositorImpl::AttachLayerForReadback(scoped_refptr<cc::Layer> layer) {
readback_layer_tree_->AddChild(layer);
base::WeakPtr<ui::WindowAndroidCompositor> CompositorImpl::GetWeakPtr() {
return weak_factory_.GetWeakPtr();
}
void CompositorImpl::IncrementReadbackRequestCount() {
pending_readback_request_count_++;
}
void CompositorImpl::DecrementReadbackRequestCount() {
DCHECK_GT(pending_readback_request_count_, 0u);
pending_readback_request_count_--;
}
void CompositorImpl::RequestCopyOfOutputOnRootLayer(
......@@ -992,7 +996,7 @@ void CompositorImpl::OnDisplayMetricsChanged(const display::Display& display,
}
bool CompositorImpl::HavePendingReadbacks() {
return !readback_layer_tree_->children().empty();
return pending_readback_request_count_ > 0u;
}
std::unique_ptr<ui::CompositorLock> CompositorImpl::GetCompositorLock(
......
......@@ -122,7 +122,9 @@ class CONTENT_EXPORT CompositorImpl
void DidLoseLayerTreeFrameSink() override;
// WindowAndroidCompositor implementation.
void AttachLayerForReadback(scoped_refptr<cc::Layer> layer) override;
base::WeakPtr<ui::WindowAndroidCompositor> GetWeakPtr() override;
void IncrementReadbackRequestCount() override;
void DecrementReadbackRequestCount() override;
void RequestCopyOfOutputOnRootLayer(
std::unique_ptr<viz::CopyOutputRequest> request) override;
void SetNeedsAnimate() override;
......@@ -175,9 +177,6 @@ class CONTENT_EXPORT CompositorImpl
// is the one attached by the compositor client.
scoped_refptr<cc::Layer> subroot_layer_;
// Subtree for hidden layers with CopyOutputRequests on them.
scoped_refptr<cc::Layer> readback_layer_tree_;
// Destruction order matters here:
std::unique_ptr<cc::AnimationHost> animation_host_;
std::unique_ptr<cc::LayerTreeHost> host_;
......@@ -216,6 +215,8 @@ class CONTENT_EXPORT CompositorImpl
ui::CompositorLockManager lock_manager_;
bool has_submitted_frame_since_became_visible_ = false;
unsigned int pending_readback_request_count_ = 0u;
// A task which runs cleanup tasks on low-end Android after a delay. Enqueued
// when we hide, canceled when we're shown.
base::CancelableOnceClosure low_end_background_cleanup_task_;
......
......@@ -119,22 +119,21 @@ void DelegatedFrameHostAndroid::CopyFromCompositingSurface(
return;
}
scoped_refptr<cc::Layer> readback_layer =
CreateSurfaceLayer(surface_info_, !has_transparent_background_);
readback_layer->SetHideLayerAndSubtree(true);
view_->GetWindowAndroid()->GetCompositor()->AttachLayerForReadback(
readback_layer);
WindowAndroidCompositor* compositor =
view_->GetWindowAndroid()->GetCompositor();
compositor->IncrementReadbackRequestCount();
std::unique_ptr<viz::CopyOutputRequest> request =
std::make_unique<viz::CopyOutputRequest>(
viz::CopyOutputRequest::ResultFormat::RGBA_BITMAP,
base::BindOnce(
[](base::OnceCallback<void(const SkBitmap&)> callback,
scoped_refptr<cc::Layer> readback_layer,
base::WeakPtr<WindowAndroidCompositor> compositor_weak_ptr,
std::unique_ptr<viz::CopyOutputResult> result) {
readback_layer->RemoveFromParent();
if (compositor_weak_ptr)
compositor_weak_ptr->DecrementReadbackRequestCount();
std::move(callback).Run(result->AsSkBitmap());
},
std::move(callback), std::move(readback_layer)));
std::move(callback), compositor->GetWeakPtr()));
if (src_subrect.IsEmpty()) {
request->set_area(gfx::Rect(surface_info_.size_in_pixels()));
......
......@@ -37,7 +37,9 @@ class MockDelegatedFrameHostAndroidClient
class MockWindowAndroidCompositor : public WindowAndroidCompositor {
public:
MOCK_METHOD1(AttachLayerForReadback, void(scoped_refptr<cc::Layer>));
MOCK_METHOD0(GetWeakPtr, base::WeakPtr<ui::WindowAndroidCompositor>());
MOCK_METHOD0(IncrementReadbackRequestCount, void());
MOCK_METHOD0(DecrementReadbackRequestCount, void());
MOCK_METHOD1(DoRequestCopyOfOutputOnRootLayer, void(viz::CopyOutputRequest*));
MOCK_METHOD0(SetNeedsAnimate, void());
MOCK_METHOD0(GetResourceManager, ResourceManager&());
......
......@@ -7,15 +7,12 @@
#include <memory>
#include "base/memory/weak_ptr.h"
#include "components/viz/common/frame_sinks/copy_output_request.h"
#include "components/viz/common/surfaces/frame_sink_id.h"
#include "ui/android/ui_android_export.h"
#include "ui/compositor/compositor_lock.h"
namespace cc {
class Layer;
}
namespace ui {
class ResourceManager;
......@@ -25,7 +22,9 @@ class UI_ANDROID_EXPORT WindowAndroidCompositor {
public:
virtual ~WindowAndroidCompositor() {}
virtual void AttachLayerForReadback(scoped_refptr<cc::Layer> layer) = 0;
virtual base::WeakPtr<WindowAndroidCompositor> GetWeakPtr() = 0;
virtual void IncrementReadbackRequestCount() = 0;
virtual void DecrementReadbackRequestCount() = 0;
virtual void RequestCopyOfOutputOnRootLayer(
std::unique_ptr<viz::CopyOutputRequest> request) = 0;
virtual void SetNeedsAnimate() = 0;
......
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