OLD | NEW |
---|---|
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "cc/layers/surface_layer.h" | 5 #include "cc/layers/surface_layer.h" |
6 | 6 |
7 #include <stdint.h> | 7 #include <stdint.h> |
8 | 8 |
9 #include "base/macros.h" | 9 #include "base/macros.h" |
10 #include "base/memory/ptr_util.h" | 10 #include "base/memory/ptr_util.h" |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
56 return make_scoped_refptr(new SurfaceLayer(std::move(ref_factory))); | 56 return make_scoped_refptr(new SurfaceLayer(std::move(ref_factory))); |
57 } | 57 } |
58 | 58 |
59 SurfaceLayer::SurfaceLayer(scoped_refptr<SurfaceReferenceFactory> ref_factory) | 59 SurfaceLayer::SurfaceLayer(scoped_refptr<SurfaceReferenceFactory> ref_factory) |
60 : ref_factory_(std::move(ref_factory)) {} | 60 : ref_factory_(std::move(ref_factory)) {} |
61 | 61 |
62 SurfaceLayer::~SurfaceLayer() { | 62 SurfaceLayer::~SurfaceLayer() { |
63 DCHECK(!layer_tree_host()); | 63 DCHECK(!layer_tree_host()); |
64 } | 64 } |
65 | 65 |
66 static inline const SurfaceId* GetReferencedSurfaceId( | |
67 const SurfaceInfo& surface_info) { | |
68 return surface_info.is_valid() ? &surface_info.id() : nullptr; | |
69 } | |
70 | |
66 void SurfaceLayer::SetPrimarySurfaceInfo(const SurfaceInfo& surface_info) { | 71 void SurfaceLayer::SetPrimarySurfaceInfo(const SurfaceInfo& surface_info) { |
72 const SurfaceId* old_surface_id = | |
73 GetReferencedSurfaceId(primary_surface_info_); | |
67 RemoveReference(std::move(primary_reference_returner_)); | 74 RemoveReference(std::move(primary_reference_returner_)); |
68 primary_surface_info_ = surface_info; | 75 primary_surface_info_ = surface_info; |
69 if (layer_tree_host()) { | 76 if (layer_tree_host()) { |
70 primary_reference_returner_ = ref_factory_->CreateReference( | 77 primary_reference_returner_ = ref_factory_->CreateReference( |
71 layer_tree_host(), primary_surface_info_.id()); | 78 layer_tree_host(), primary_surface_info_.id()); |
79 const SurfaceId* new_surface_id = | |
80 GetReferencedSurfaceId(primary_surface_info_); | |
81 if (old_surface_id != new_surface_id) { | |
enne (OOO)
2017/05/24 21:57:42
Hmm. This check is comparing pointers? Can you ha
jaydasika
2017/05/24 22:12:56
Done.
| |
82 if (old_surface_id) | |
83 layer_tree_host()->RemoveSurfaceLayerId(*old_surface_id); | |
84 if (new_surface_id) | |
85 layer_tree_host()->AddSurfaceLayerId(*new_surface_id); | |
86 } | |
72 } | 87 } |
73 UpdateDrawsContent(HasDrawableContent()); | 88 UpdateDrawsContent(HasDrawableContent()); |
74 SetNeedsCommit(); | 89 SetNeedsCommit(); |
75 } | 90 } |
76 | 91 |
77 void SurfaceLayer::SetFallbackSurfaceInfo(const SurfaceInfo& surface_info) { | 92 void SurfaceLayer::SetFallbackSurfaceInfo(const SurfaceInfo& surface_info) { |
93 const SurfaceId* old_surface_id = | |
94 GetReferencedSurfaceId(fallback_surface_info_); | |
78 RemoveReference(std::move(fallback_reference_returner_)); | 95 RemoveReference(std::move(fallback_reference_returner_)); |
79 fallback_surface_info_ = surface_info; | 96 fallback_surface_info_ = surface_info; |
80 if (layer_tree_host()) { | 97 if (layer_tree_host()) { |
81 fallback_reference_returner_ = ref_factory_->CreateReference( | 98 fallback_reference_returner_ = ref_factory_->CreateReference( |
82 layer_tree_host(), fallback_surface_info_.id()); | 99 layer_tree_host(), fallback_surface_info_.id()); |
100 const SurfaceId* new_surface_id = | |
101 GetReferencedSurfaceId(fallback_surface_info_); | |
102 if (old_surface_id != new_surface_id) { | |
103 if (old_surface_id) | |
104 layer_tree_host()->RemoveSurfaceLayerId(*old_surface_id); | |
105 if (new_surface_id) | |
106 layer_tree_host()->AddSurfaceLayerId(*new_surface_id); | |
107 } | |
83 } | 108 } |
84 SetNeedsCommit(); | 109 SetNeedsCommit(); |
85 } | 110 } |
86 | 111 |
87 void SurfaceLayer::SetStretchContentToFillBounds( | 112 void SurfaceLayer::SetStretchContentToFillBounds( |
88 bool stretch_content_to_fill_bounds) { | 113 bool stretch_content_to_fill_bounds) { |
89 stretch_content_to_fill_bounds_ = stretch_content_to_fill_bounds; | 114 stretch_content_to_fill_bounds_ = stretch_content_to_fill_bounds; |
90 SetNeedsPushProperties(); | 115 SetNeedsPushProperties(); |
91 } | 116 } |
92 | 117 |
93 std::unique_ptr<LayerImpl> SurfaceLayer::CreateLayerImpl( | 118 std::unique_ptr<LayerImpl> SurfaceLayer::CreateLayerImpl( |
94 LayerTreeImpl* tree_impl) { | 119 LayerTreeImpl* tree_impl) { |
95 return SurfaceLayerImpl::Create(tree_impl, id()); | 120 return SurfaceLayerImpl::Create(tree_impl, id()); |
96 } | 121 } |
97 | 122 |
98 bool SurfaceLayer::HasDrawableContent() const { | 123 bool SurfaceLayer::HasDrawableContent() const { |
99 return primary_surface_info_.is_valid() && Layer::HasDrawableContent(); | 124 return primary_surface_info_.is_valid() && Layer::HasDrawableContent(); |
100 } | 125 } |
101 | 126 |
102 void SurfaceLayer::SetLayerTreeHost(LayerTreeHost* host) { | 127 void SurfaceLayer::SetLayerTreeHost(LayerTreeHost* host) { |
103 if (layer_tree_host() == host) { | 128 if (layer_tree_host() == host) { |
104 Layer::SetLayerTreeHost(host); | 129 Layer::SetLayerTreeHost(host); |
105 return; | 130 return; |
106 } | 131 } |
132 const SurfaceId* primary_surface_id = | |
133 GetReferencedSurfaceId(primary_surface_info_); | |
134 const SurfaceId* fallback_surface_id = | |
135 GetReferencedSurfaceId(fallback_surface_info_); | |
136 | |
137 if (layer_tree_host()) { | |
138 if (primary_surface_id) | |
139 layer_tree_host()->RemoveSurfaceLayerId(*primary_surface_id); | |
140 if (fallback_surface_id) | |
141 layer_tree_host()->RemoveSurfaceLayerId(*fallback_surface_id); | |
142 } | |
107 RemoveReference(std::move(primary_reference_returner_)); | 143 RemoveReference(std::move(primary_reference_returner_)); |
108 RemoveReference(std::move(fallback_reference_returner_)); | 144 RemoveReference(std::move(fallback_reference_returner_)); |
109 Layer::SetLayerTreeHost(host); | 145 Layer::SetLayerTreeHost(host); |
110 if (layer_tree_host()) { | 146 if (layer_tree_host()) { |
111 if (primary_surface_info_.is_valid()) { | 147 if (primary_surface_info_.is_valid()) { |
112 primary_reference_returner_ = ref_factory_->CreateReference( | 148 primary_reference_returner_ = ref_factory_->CreateReference( |
113 layer_tree_host(), primary_surface_info_.id()); | 149 layer_tree_host(), primary_surface_info_.id()); |
114 } | 150 } |
115 if (fallback_surface_info_.is_valid()) { | 151 if (fallback_surface_info_.is_valid()) { |
116 fallback_reference_returner_ = ref_factory_->CreateReference( | 152 fallback_reference_returner_ = ref_factory_->CreateReference( |
117 layer_tree_host(), fallback_surface_info_.id()); | 153 layer_tree_host(), fallback_surface_info_.id()); |
118 } | 154 } |
155 if (primary_surface_id) | |
156 layer_tree_host()->AddSurfaceLayerId(*primary_surface_id); | |
157 if (fallback_surface_id) | |
158 layer_tree_host()->RemoveSurfaceLayerId(*fallback_surface_id); | |
enne (OOO)
2017/05/24 21:57:42
add?
jaydasika
2017/05/24 22:12:56
Done.
| |
119 } | 159 } |
120 } | 160 } |
121 | 161 |
122 void SurfaceLayer::PushPropertiesTo(LayerImpl* layer) { | 162 void SurfaceLayer::PushPropertiesTo(LayerImpl* layer) { |
123 Layer::PushPropertiesTo(layer); | 163 Layer::PushPropertiesTo(layer); |
124 TRACE_EVENT0("cc", "SurfaceLayer::PushPropertiesTo"); | 164 TRACE_EVENT0("cc", "SurfaceLayer::PushPropertiesTo"); |
125 SurfaceLayerImpl* layer_impl = static_cast<SurfaceLayerImpl*>(layer); | 165 SurfaceLayerImpl* layer_impl = static_cast<SurfaceLayerImpl*>(layer); |
126 layer_impl->SetPrimarySurfaceInfo(primary_surface_info_); | 166 layer_impl->SetPrimarySurfaceInfo(primary_surface_info_); |
127 layer_impl->SetFallbackSurfaceInfo(fallback_surface_info_); | 167 layer_impl->SetFallbackSurfaceInfo(fallback_surface_info_); |
128 layer_impl->SetStretchContentToFillBounds(stretch_content_to_fill_bounds_); | 168 layer_impl->SetStretchContentToFillBounds(stretch_content_to_fill_bounds_); |
129 } | 169 } |
130 | 170 |
131 void SurfaceLayer::RemoveReference(base::Closure reference_returner) { | 171 void SurfaceLayer::RemoveReference(base::Closure reference_returner) { |
132 if (!reference_returner) | 172 if (!reference_returner) |
133 return; | 173 return; |
134 auto swap_promise = base::MakeUnique<SatisfySwapPromise>( | 174 auto swap_promise = base::MakeUnique<SatisfySwapPromise>( |
135 std::move(reference_returner), | 175 std::move(reference_returner), |
136 layer_tree_host()->GetTaskRunnerProvider()->MainThreadTaskRunner()); | 176 layer_tree_host()->GetTaskRunnerProvider()->MainThreadTaskRunner()); |
137 layer_tree_host()->GetSwapPromiseManager()->QueueSwapPromise( | 177 layer_tree_host()->GetSwapPromiseManager()->QueueSwapPromise( |
138 std::move(swap_promise)); | 178 std::move(swap_promise)); |
139 } | 179 } |
140 | 180 |
141 } // namespace cc | 181 } // namespace cc |
OLD | NEW |