blob: 768141cf091d4cb96845be7820d7511e14e86ae9 [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"
danakj7a3089f2016-01-16 01:20:1311#include "base/trace_event/trace_event.h"
[email protected]c1ae82942014-01-17 23:17:0412#include "cc/layers/surface_layer_impl.h"
jamesrf313a212015-03-16 21:27:3713#include "cc/output/swap_promise.h"
fsamuel34396562016-10-06 15:01:2114#include "cc/surfaces/surface_sequence_generator.h"
jbaumandbccae1ab2014-11-06 23:26:4415#include "cc/trees/layer_tree_host.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"
[email protected]c1ae82942014-01-17 23:17:0418
19namespace cc {
20
jbaumandbccae1ab2014-11-06 23:26:4421class SatisfySwapPromise : public SwapPromise {
22 public:
ksakamoto73809d9ee2016-12-16 08:02:5823 SatisfySwapPromise(
samans6c267ca2017-01-11 19:44:2024 base::Closure reference_returner,
ksakamoto73809d9ee2016-12-16 08:02:5825 scoped_refptr<base::SingleThreadTaskRunner> main_task_runner)
samans6c267ca2017-01-11 19:44:2026 : reference_returner_(reference_returner),
ksakamoto73809d9ee2016-12-16 08:02:5827 main_task_runner_(std::move(main_task_runner)) {}
jbaumandbccae1ab2014-11-06 23:26:4428
29 ~SatisfySwapPromise() override {}
30
31 private:
tobiasjs93d464842015-05-15 17:52:4432 void DidActivate() override {}
samans72b2a282016-12-17 02:44:1533
ksakamoto73809d9ee2016-12-16 08:02:5834 void WillSwap(CompositorFrameMetadata* metadata) override {}
samans72b2a282016-12-17 02:44:1535
ksakamoto73809d9ee2016-12-16 08:02:5836 void DidSwap() override {
samans6c267ca2017-01-11 19:44:2037 main_task_runner_->PostTask(FROM_HERE, reference_returner_);
jbaumandbccae1ab2014-11-06 23:26:4438 }
39
svartmetal751af1f92016-08-13 11:47:3340 DidNotSwapAction DidNotSwap(DidNotSwapReason reason) override {
samans6c267ca2017-01-11 19:44:2041 main_task_runner_->PostTask(FROM_HERE, reference_returner_);
svartmetal751af1f92016-08-13 11:47:3342 return DidNotSwapAction::BREAK_PROMISE;
jbaumandbccae1ab2014-11-06 23:26:4443 }
samans72b2a282016-12-17 02:44:1544
avi02a4d172015-12-21 06:14:3645 int64_t TraceId() const override { return 0; }
jbaumandbccae1ab2014-11-06 23:26:4446
samans6c267ca2017-01-11 19:44:2047 base::Closure reference_returner_;
ksakamoto73809d9ee2016-12-16 08:02:5848 scoped_refptr<base::SingleThreadTaskRunner> main_task_runner_;
jbaumandbccae1ab2014-11-06 23:26:4449
50 DISALLOW_COPY_AND_ASSIGN(SatisfySwapPromise);
51};
52
53scoped_refptr<SurfaceLayer> SurfaceLayer::Create(
samans72b2a282016-12-17 02:44:1554 scoped_refptr<SurfaceReferenceFactory> ref_factory) {
55 return make_scoped_refptr(new SurfaceLayer(std::move(ref_factory)));
[email protected]c1ae82942014-01-17 23:17:0456}
57
samans72b2a282016-12-17 02:44:1558SurfaceLayer::SurfaceLayer(scoped_refptr<SurfaceReferenceFactory> ref_factory)
59 : ref_factory_(std::move(ref_factory)) {}
[email protected]c1ae82942014-01-17 23:17:0460
jbaumandbccae1ab2014-11-06 23:26:4461SurfaceLayer::~SurfaceLayer() {
62 DCHECK(!layer_tree_host());
jbaumandbccae1ab2014-11-06 23:26:4463}
[email protected]c1ae82942014-01-17 23:17:0464
fsamuel1d3252c2017-02-15 20:56:3765void SurfaceLayer::SetPrimarySurfaceInfo(const SurfaceInfo& surface_info) {
66 RemoveReference(std::move(primary_reference_returner_));
67 primary_surface_info_ = surface_info;
samans72b2a282016-12-17 02:44:1568 if (layer_tree_host()) {
fsamuel1d3252c2017-02-15 20:56:3769 primary_reference_returner_ = ref_factory_->CreateReference(
70 layer_tree_host(), primary_surface_info_.id());
samans72b2a282016-12-17 02:44:1571 }
[email protected]ad63b2f2014-08-11 17:39:5472 UpdateDrawsContent(HasDrawableContent());
[email protected]c1ae82942014-01-17 23:17:0473 SetNeedsPushProperties();
74}
75
fsamuel1d3252c2017-02-15 20:56:3776void SurfaceLayer::SetFallbackSurfaceInfo(const SurfaceInfo& surface_info) {
77 RemoveReference(std::move(fallback_reference_returner_));
78 fallback_surface_info_ = surface_info;
79 if (layer_tree_host()) {
80 fallback_reference_returner_ = ref_factory_->CreateReference(
81 layer_tree_host(), fallback_surface_info_.id());
82 }
83 SetNeedsPushProperties();
84}
85
samanse8fd2e592017-01-10 00:23:1386void SurfaceLayer::SetStretchContentToFillBounds(
87 bool stretch_content_to_fill_bounds) {
88 stretch_content_to_fill_bounds_ = stretch_content_to_fill_bounds;
89 SetNeedsPushProperties();
90}
91
danakj60bc3bc2016-04-09 00:24:4892std::unique_ptr<LayerImpl> SurfaceLayer::CreateLayerImpl(
93 LayerTreeImpl* tree_impl) {
danakjf446a072014-09-27 21:55:4894 return SurfaceLayerImpl::Create(tree_impl, id());
[email protected]c1ae82942014-01-17 23:17:0495}
96
[email protected]ad63b2f2014-08-11 17:39:5497bool SurfaceLayer::HasDrawableContent() const {
fsamuel1d3252c2017-02-15 20:56:3798 return primary_surface_info_.id().is_valid() && Layer::HasDrawableContent();
[email protected]c1ae82942014-01-17 23:17:0499}
100
jbaumandbccae1ab2014-11-06 23:26:44101void SurfaceLayer::SetLayerTreeHost(LayerTreeHost* host) {
102 if (layer_tree_host() == host) {
103 Layer::SetLayerTreeHost(host);
104 return;
105 }
fsamuel1d3252c2017-02-15 20:56:37106 RemoveReference(std::move(primary_reference_returner_));
107 RemoveReference(std::move(fallback_reference_returner_));
jbaumandbccae1ab2014-11-06 23:26:44108 Layer::SetLayerTreeHost(host);
samans72b2a282016-12-17 02:44:15109 if (layer_tree_host()) {
fsamuel1d3252c2017-02-15 20:56:37110 if (primary_surface_info_.id().is_valid()) {
111 primary_reference_returner_ = ref_factory_->CreateReference(
112 layer_tree_host(), primary_surface_info_.id());
113 }
114 if (fallback_surface_info_.id().is_valid()) {
115 fallback_reference_returner_ = ref_factory_->CreateReference(
116 layer_tree_host(), fallback_surface_info_.id());
117 }
samans72b2a282016-12-17 02:44:15118 }
jbaumandbccae1ab2014-11-06 23:26:44119}
120
[email protected]c1ae82942014-01-17 23:17:04121void SurfaceLayer::PushPropertiesTo(LayerImpl* layer) {
122 Layer::PushPropertiesTo(layer);
danakj7a3089f2016-01-16 01:20:13123 TRACE_EVENT0("cc", "SurfaceLayer::PushPropertiesTo");
[email protected]c1ae82942014-01-17 23:17:04124 SurfaceLayerImpl* layer_impl = static_cast<SurfaceLayerImpl*>(layer);
fsamuel1d3252c2017-02-15 20:56:37125 layer_impl->SetPrimarySurfaceInfo(primary_surface_info_);
126 layer_impl->SetFallbackSurfaceInfo(fallback_surface_info_);
xlai5e87e712016-12-16 02:10:25127 layer_impl->SetStretchContentToFillBounds(stretch_content_to_fill_bounds_);
jbauman5a8f0ab2014-11-07 01:41:16128}
129
fsamuel1d3252c2017-02-15 20:56:37130void SurfaceLayer::RemoveReference(base::Closure reference_returner) {
131 if (!reference_returner)
jbaumandbccae1ab2014-11-06 23:26:44132 return;
samans72b2a282016-12-17 02:44:15133 auto swap_promise = base::MakeUnique<SatisfySwapPromise>(
fsamuel1d3252c2017-02-15 20:56:37134 std::move(reference_returner),
samans6c267ca2017-01-11 19:44:20135 layer_tree_host()->GetTaskRunnerProvider()->MainThreadTaskRunner());
khushalsagar8297ae992016-09-14 20:51:23136 layer_tree_host()->GetSwapPromiseManager()->QueueSwapPromise(
samans72b2a282016-12-17 02:44:15137 std::move(swap_promise));
jbaumandbccae1ab2014-11-06 23:26:44138}
139
[email protected]c1ae82942014-01-17 23:17:04140} // namespace cc