blob: e79369004c766a03ca279465805ffb1f7ac8204a [file] [log] [blame]
[email protected]c1ae82942014-01-17 23:17:041// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "cc/layers/surface_layer.h"
6
avi02a4d172015-12-21 06:14:367#include <stdint.h>
8
9#include "base/macros.h"
fdorayba121422016-12-23 19:51:4810#include "base/memory/ptr_util.h"
Gabriel Charette5ff87ce2017-05-16 18:03:4511#include "base/single_thread_task_runner.h"
danakj7a3089f2016-01-16 01:20:1312#include "base/trace_event/trace_event.h"
[email protected]c1ae82942014-01-17 23:17:0413#include "cc/layers/surface_layer_impl.h"
jbaumandbccae1ab2014-11-06 23:26:4414#include "cc/trees/layer_tree_host.h"
danakjba65a0912017-09-21 16:38:4215#include "cc/trees/swap_promise.h"
khushalsagar8297ae992016-09-14 20:51:2316#include "cc/trees/swap_promise_manager.h"
samans6c267ca2017-01-11 19:44:2017#include "cc/trees/task_runner_provider.h"
Fady Samueldbd4b022017-07-14 02:06:4818#include "components/viz/common/surfaces/surface_sequence_generator.h"
[email protected]c1ae82942014-01-17 23:17:0419
20namespace cc {
21
jbaumandbccae1ab2014-11-06 23:26:4422class SatisfySwapPromise : public SwapPromise {
23 public:
ksakamoto73809d9ee2016-12-16 08:02:5824 SatisfySwapPromise(
samans6c267ca2017-01-11 19:44:2025 base::Closure reference_returner,
ksakamoto73809d9ee2016-12-16 08:02:5826 scoped_refptr<base::SingleThreadTaskRunner> main_task_runner)
samans6c267ca2017-01-11 19:44:2027 : reference_returner_(reference_returner),
ksakamoto73809d9ee2016-12-16 08:02:5828 main_task_runner_(std::move(main_task_runner)) {}
jbaumandbccae1ab2014-11-06 23:26:4429
30 ~SatisfySwapPromise() override {}
31
32 private:
tobiasjs93d464842015-05-15 17:52:4433 void DidActivate() override {}
samans72b2a282016-12-17 02:44:1534
danakj5e0a12b2017-09-25 17:26:4935 void WillSwap(viz::CompositorFrameMetadata* metadata) override {}
samans72b2a282016-12-17 02:44:1536
ksakamoto73809d9ee2016-12-16 08:02:5837 void DidSwap() override {
samans6c267ca2017-01-11 19:44:2038 main_task_runner_->PostTask(FROM_HERE, reference_returner_);
jbaumandbccae1ab2014-11-06 23:26:4439 }
40
svartmetal751af1f92016-08-13 11:47:3341 DidNotSwapAction DidNotSwap(DidNotSwapReason reason) override {
samans6c267ca2017-01-11 19:44:2042 main_task_runner_->PostTask(FROM_HERE, reference_returner_);
svartmetal751af1f92016-08-13 11:47:3343 return DidNotSwapAction::BREAK_PROMISE;
jbaumandbccae1ab2014-11-06 23:26:4444 }
samans72b2a282016-12-17 02:44:1545
avi02a4d172015-12-21 06:14:3646 int64_t TraceId() const override { return 0; }
jbaumandbccae1ab2014-11-06 23:26:4447
samans6c267ca2017-01-11 19:44:2048 base::Closure reference_returner_;
ksakamoto73809d9ee2016-12-16 08:02:5849 scoped_refptr<base::SingleThreadTaskRunner> main_task_runner_;
jbaumandbccae1ab2014-11-06 23:26:4450
51 DISALLOW_COPY_AND_ASSIGN(SatisfySwapPromise);
52};
53
54scoped_refptr<SurfaceLayer> SurfaceLayer::Create(
Fady Samueldbd4b022017-07-14 02:06:4855 scoped_refptr<viz::SurfaceReferenceFactory> ref_factory) {
kylechar973a0412017-09-26 18:40:2956 return base::WrapRefCounted(new SurfaceLayer(std::move(ref_factory)));
[email protected]c1ae82942014-01-17 23:17:0457}
58
Fady Samueldbd4b022017-07-14 02:06:4859SurfaceLayer::SurfaceLayer(
60 scoped_refptr<viz::SurfaceReferenceFactory> ref_factory)
samans72b2a282016-12-17 02:44:1561 : ref_factory_(std::move(ref_factory)) {}
[email protected]c1ae82942014-01-17 23:17:0462
jbaumandbccae1ab2014-11-06 23:26:4463SurfaceLayer::~SurfaceLayer() {
64 DCHECK(!layer_tree_host());
jbaumandbccae1ab2014-11-06 23:26:4465}
[email protected]c1ae82942014-01-17 23:17:0466
Fady Samuel1a21156e2017-07-13 04:57:2967void SurfaceLayer::SetPrimarySurfaceInfo(const viz::SurfaceInfo& surface_info) {
fsamuel1d3252c2017-02-15 20:56:3768 primary_surface_info_ = surface_info;
[email protected]ad63b2f2014-08-11 17:39:5469 UpdateDrawsContent(HasDrawableContent());
weiliangc1c0802c32017-03-21 19:53:1770 SetNeedsCommit();
[email protected]c1ae82942014-01-17 23:17:0471}
72
Fady Samuelb47442d2017-10-13 04:17:3473void SurfaceLayer::SetFallbackSurfaceId(const viz::SurfaceId& surface_id) {
fsamuel1d3252c2017-02-15 20:56:3774 RemoveReference(std::move(fallback_reference_returner_));
jaydasika10be2112017-05-26 04:35:5075 if (layer_tree_host())
Fady Samuelb47442d2017-10-13 04:17:3476 layer_tree_host()->RemoveSurfaceLayerId(fallback_surface_id_);
fsamuelcc854aa52017-06-06 03:03:4777
Fady Samuelb47442d2017-10-13 04:17:3478 fallback_surface_id_ = surface_id;
fsamuelcc854aa52017-06-06 03:03:4779
Fady Samuelb47442d2017-10-13 04:17:3480 if (layer_tree_host() && fallback_surface_id_.is_valid()) {
81 fallback_reference_returner_ =
82 ref_factory_->CreateReference(layer_tree_host(), fallback_surface_id_);
83 layer_tree_host()->AddSurfaceLayerId(fallback_surface_id_);
fsamuel1d3252c2017-02-15 20:56:3784 }
weiliangc1c0802c32017-03-21 19:53:1785 SetNeedsCommit();
fsamuel1d3252c2017-02-15 20:56:3786}
87
Fady Samuel926ed772017-09-19 00:51:5588void SurfaceLayer::SetDefaultBackgroundColor(SkColor background_color) {
89 default_background_color_ = background_color;
90 SetNeedsPushProperties();
91}
92
samanse8fd2e592017-01-10 00:23:1393void SurfaceLayer::SetStretchContentToFillBounds(
94 bool stretch_content_to_fill_bounds) {
95 stretch_content_to_fill_bounds_ = stretch_content_to_fill_bounds;
96 SetNeedsPushProperties();
97}
98
danakj60bc3bc2016-04-09 00:24:4899std::unique_ptr<LayerImpl> SurfaceLayer::CreateLayerImpl(
100 LayerTreeImpl* tree_impl) {
danakjf446a072014-09-27 21:55:48101 return SurfaceLayerImpl::Create(tree_impl, id());
[email protected]c1ae82942014-01-17 23:17:04102}
103
[email protected]ad63b2f2014-08-11 17:39:54104bool SurfaceLayer::HasDrawableContent() const {
staraz9afc576b2017-03-01 19:39:25105 return primary_surface_info_.is_valid() && Layer::HasDrawableContent();
[email protected]c1ae82942014-01-17 23:17:04106}
107
jbaumandbccae1ab2014-11-06 23:26:44108void SurfaceLayer::SetLayerTreeHost(LayerTreeHost* host) {
109 if (layer_tree_host() == host) {
jbaumandbccae1ab2014-11-06 23:26:44110 return;
111 }
jaydasika10be2112017-05-26 04:35:50112
Fady Samuelb47442d2017-10-13 04:17:34113 if (layer_tree_host() && fallback_surface_id_.is_valid())
114 layer_tree_host()->RemoveSurfaceLayerId(fallback_surface_id_);
jaydasika10be2112017-05-26 04:35:50115
fsamuel1d3252c2017-02-15 20:56:37116 RemoveReference(std::move(fallback_reference_returner_));
jbaumandbccae1ab2014-11-06 23:26:44117 Layer::SetLayerTreeHost(host);
jaydasika10be2112017-05-26 04:35:50118
Fady Samuelb47442d2017-10-13 04:17:34119 if (layer_tree_host() && fallback_surface_id_.is_valid()) {
120 fallback_reference_returner_ =
121 ref_factory_->CreateReference(layer_tree_host(), fallback_surface_id_);
122 layer_tree_host()->AddSurfaceLayerId(fallback_surface_id_);
samans72b2a282016-12-17 02:44:15123 }
jbaumandbccae1ab2014-11-06 23:26:44124}
125
[email protected]c1ae82942014-01-17 23:17:04126void SurfaceLayer::PushPropertiesTo(LayerImpl* layer) {
127 Layer::PushPropertiesTo(layer);
danakj7a3089f2016-01-16 01:20:13128 TRACE_EVENT0("cc", "SurfaceLayer::PushPropertiesTo");
[email protected]c1ae82942014-01-17 23:17:04129 SurfaceLayerImpl* layer_impl = static_cast<SurfaceLayerImpl*>(layer);
fsamuel1d3252c2017-02-15 20:56:37130 layer_impl->SetPrimarySurfaceInfo(primary_surface_info_);
Fady Samuelb47442d2017-10-13 04:17:34131 layer_impl->SetFallbackSurfaceId(fallback_surface_id_);
xlai5e87e712016-12-16 02:10:25132 layer_impl->SetStretchContentToFillBounds(stretch_content_to_fill_bounds_);
Fady Samuel926ed772017-09-19 00:51:55133 layer_impl->SetDefaultBackgroundColor(default_background_color_);
jbauman5a8f0ab2014-11-07 01:41:16134}
135
fsamuel1d3252c2017-02-15 20:56:37136void SurfaceLayer::RemoveReference(base::Closure reference_returner) {
137 if (!reference_returner)
jbaumandbccae1ab2014-11-06 23:26:44138 return;
Jeremy Roman909d927b2017-08-27 18:34:09139 auto swap_promise = std::make_unique<SatisfySwapPromise>(
fsamuel1d3252c2017-02-15 20:56:37140 std::move(reference_returner),
samans6c267ca2017-01-11 19:44:20141 layer_tree_host()->GetTaskRunnerProvider()->MainThreadTaskRunner());
khushalsagar8297ae992016-09-14 20:51:23142 layer_tree_host()->GetSwapPromiseManager()->QueueSwapPromise(
samans72b2a282016-12-17 02:44:15143 std::move(swap_promise));
jbaumandbccae1ab2014-11-06 23:26:44144}
145
[email protected]c1ae82942014-01-17 23:17:04146} // namespace cc