blob: deeaf470cc5893d8ad7c6970af4d050a3cf68068 [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"
jamesrf313a212015-03-16 21:27:3714#include "cc/output/swap_promise.h"
fsamuel34396562016-10-06 15:01:2115#include "cc/surfaces/surface_sequence_generator.h"
jbaumandbccae1ab2014-11-06 23:26:4416#include "cc/trees/layer_tree_host.h"
khushalsagar8297ae992016-09-14 20:51:2317#include "cc/trees/swap_promise_manager.h"
samans6c267ca2017-01-11 19:44:2018#include "cc/trees/task_runner_provider.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
ksakamoto73809d9ee2016-12-16 08:02:5835 void WillSwap(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(
samans72b2a282016-12-17 02:44:1555 scoped_refptr<SurfaceReferenceFactory> ref_factory) {
56 return make_scoped_refptr(new SurfaceLayer(std::move(ref_factory)));
[email protected]c1ae82942014-01-17 23:17:0457}
58
samans72b2a282016-12-17 02:44:1559SurfaceLayer::SurfaceLayer(scoped_refptr<SurfaceReferenceFactory> ref_factory)
60 : ref_factory_(std::move(ref_factory)) {}
[email protected]c1ae82942014-01-17 23:17:0461
jbaumandbccae1ab2014-11-06 23:26:4462SurfaceLayer::~SurfaceLayer() {
63 DCHECK(!layer_tree_host());
jbaumandbccae1ab2014-11-06 23:26:4464}
[email protected]c1ae82942014-01-17 23:17:0465
fsamuel1d3252c2017-02-15 20:56:3766void SurfaceLayer::SetPrimarySurfaceInfo(const SurfaceInfo& surface_info) {
fsamuel1d3252c2017-02-15 20:56:3767 primary_surface_info_ = surface_info;
[email protected]ad63b2f2014-08-11 17:39:5468 UpdateDrawsContent(HasDrawableContent());
weiliangc1c0802c32017-03-21 19:53:1769 SetNeedsCommit();
[email protected]c1ae82942014-01-17 23:17:0470}
71
fsamuel1d3252c2017-02-15 20:56:3772void SurfaceLayer::SetFallbackSurfaceInfo(const SurfaceInfo& surface_info) {
73 RemoveReference(std::move(fallback_reference_returner_));
jaydasika10be2112017-05-26 04:35:5074 if (layer_tree_host())
fsamuelcc854aa52017-06-06 03:03:4775 layer_tree_host()->RemoveSurfaceLayerId(fallback_surface_info_.id());
76
fsamuel1d3252c2017-02-15 20:56:3777 fallback_surface_info_ = surface_info;
fsamuelcc854aa52017-06-06 03:03:4778
79 if (layer_tree_host() && fallback_surface_info_.is_valid()) {
fsamuel1d3252c2017-02-15 20:56:3780 fallback_reference_returner_ = ref_factory_->CreateReference(
81 layer_tree_host(), fallback_surface_info_.id());
fsamuelcc854aa52017-06-06 03:03:4782 layer_tree_host()->AddSurfaceLayerId(fallback_surface_info_.id());
fsamuel1d3252c2017-02-15 20:56:3783 }
weiliangc1c0802c32017-03-21 19:53:1784 SetNeedsCommit();
fsamuel1d3252c2017-02-15 20:56:3785}
86
samanse8fd2e592017-01-10 00:23:1387void SurfaceLayer::SetStretchContentToFillBounds(
88 bool stretch_content_to_fill_bounds) {
89 stretch_content_to_fill_bounds_ = stretch_content_to_fill_bounds;
90 SetNeedsPushProperties();
91}
92
danakj60bc3bc2016-04-09 00:24:4893std::unique_ptr<LayerImpl> SurfaceLayer::CreateLayerImpl(
94 LayerTreeImpl* tree_impl) {
danakjf446a072014-09-27 21:55:4895 return SurfaceLayerImpl::Create(tree_impl, id());
[email protected]c1ae82942014-01-17 23:17:0496}
97
[email protected]ad63b2f2014-08-11 17:39:5498bool SurfaceLayer::HasDrawableContent() const {
staraz9afc576b2017-03-01 19:39:2599 return primary_surface_info_.is_valid() && Layer::HasDrawableContent();
[email protected]c1ae82942014-01-17 23:17:04100}
101
jbaumandbccae1ab2014-11-06 23:26:44102void SurfaceLayer::SetLayerTreeHost(LayerTreeHost* host) {
103 if (layer_tree_host() == host) {
jbaumandbccae1ab2014-11-06 23:26:44104 return;
105 }
jaydasika10be2112017-05-26 04:35:50106
fsamuelcc854aa52017-06-06 03:03:47107 if (layer_tree_host() && fallback_surface_info_.is_valid())
108 layer_tree_host()->RemoveSurfaceLayerId(fallback_surface_info_.id());
jaydasika10be2112017-05-26 04:35:50109
fsamuel1d3252c2017-02-15 20:56:37110 RemoveReference(std::move(fallback_reference_returner_));
jbaumandbccae1ab2014-11-06 23:26:44111 Layer::SetLayerTreeHost(host);
jaydasika10be2112017-05-26 04:35:50112
fsamuelcc854aa52017-06-06 03:03:47113 if (layer_tree_host() && fallback_surface_info_.is_valid()) {
114 fallback_reference_returner_ = ref_factory_->CreateReference(
115 layer_tree_host(), fallback_surface_info_.id());
116 layer_tree_host()->AddSurfaceLayerId(fallback_surface_info_.id());
samans72b2a282016-12-17 02:44:15117 }
jbaumandbccae1ab2014-11-06 23:26:44118}
119
[email protected]c1ae82942014-01-17 23:17:04120void SurfaceLayer::PushPropertiesTo(LayerImpl* layer) {
121 Layer::PushPropertiesTo(layer);
danakj7a3089f2016-01-16 01:20:13122 TRACE_EVENT0("cc", "SurfaceLayer::PushPropertiesTo");
[email protected]c1ae82942014-01-17 23:17:04123 SurfaceLayerImpl* layer_impl = static_cast<SurfaceLayerImpl*>(layer);
fsamuel1d3252c2017-02-15 20:56:37124 layer_impl->SetPrimarySurfaceInfo(primary_surface_info_);
125 layer_impl->SetFallbackSurfaceInfo(fallback_surface_info_);
xlai5e87e712016-12-16 02:10:25126 layer_impl->SetStretchContentToFillBounds(stretch_content_to_fill_bounds_);
jbauman5a8f0ab2014-11-07 01:41:16127}
128
fsamuel1d3252c2017-02-15 20:56:37129void SurfaceLayer::RemoveReference(base::Closure reference_returner) {
130 if (!reference_returner)
jbaumandbccae1ab2014-11-06 23:26:44131 return;
samans72b2a282016-12-17 02:44:15132 auto swap_promise = base::MakeUnique<SatisfySwapPromise>(
fsamuel1d3252c2017-02-15 20:56:37133 std::move(reference_returner),
samans6c267ca2017-01-11 19:44:20134 layer_tree_host()->GetTaskRunnerProvider()->MainThreadTaskRunner());
khushalsagar8297ae992016-09-14 20:51:23135 layer_tree_host()->GetSwapPromiseManager()->QueueSwapPromise(
samans72b2a282016-12-17 02:44:15136 std::move(swap_promise));
jbaumandbccae1ab2014-11-06 23:26:44137}
138
[email protected]c1ae82942014-01-17 23:17:04139} // namespace cc