Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(694)

Unified Diff: cc/layers/surface_layer.cc

Issue 2582823002: WIP: Surface Synchronization System
Patch Set: Only create ClientSurfaceEmbedder if window is visible. Trash it otherwise. Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: cc/layers/surface_layer.cc
diff --git a/cc/layers/surface_layer.cc b/cc/layers/surface_layer.cc
index 818b8f444f6addc5963584043b1f899850bb5bc8..0e0d202c75f20adcd7fb7a8aec07250cadb961fe 100644
--- a/cc/layers/surface_layer.cc
+++ b/cc/layers/surface_layer.cc
@@ -63,11 +63,38 @@ SurfaceLayer::~SurfaceLayer() {
}
void SurfaceLayer::SetSurfaceInfo(const SurfaceInfo& surface_info) {
- RemoveCurrentReference();
- surface_info_ = surface_info;
+ RemoveReference(std::move(primary_reference_returner_));
+ primary_surface_info_ = surface_info;
if (layer_tree_host()) {
- reference_returner_ =
- ref_factory_->CreateReference(layer_tree_host(), surface_info_.id());
+ primary_reference_returner_ = ref_factory_->CreateReference(
+ layer_tree_host(), primary_surface_info_.id());
+ }
+ UpdateDrawsContent(HasDrawableContent());
+ SetNeedsPushProperties();
+}
+
+void SurfaceLayer::SwapSurfaceInfo(const SurfaceInfo& surface_info) {
+ if (surface_info.id() == primary_surface_info_.id()) {
+ // Remove the existing fallback reference.
+ primary_surface_info_ = surface_info;
+ RemoveReference(std::move(fallback_reference_returner_));
+ fallback_surface_info_ = SurfaceInfo();
+ UpdateDrawsContent(HasDrawableContent());
+ SetNeedsPushProperties();
+ return;
+ }
+ // Remove the existing fallback reference.
+ RemoveReference(std::move(fallback_reference_returner_));
+
+ // The primary SurfaceInfo becomes the fallback.
+ fallback_surface_info_ = primary_surface_info_;
+ fallback_reference_returner_ = std::move(primary_reference_returner_);
+
+ // The new |surface_info| becomes the primary SurfaceInfo.
+ primary_surface_info_ = surface_info;
+ if (layer_tree_host()) {
+ primary_reference_returner_ = ref_factory_->CreateReference(
+ layer_tree_host(), primary_surface_info_.id());
}
UpdateDrawsContent(HasDrawableContent());
SetNeedsPushProperties();
@@ -85,7 +112,7 @@ std::unique_ptr<LayerImpl> SurfaceLayer::CreateLayerImpl(
}
bool SurfaceLayer::HasDrawableContent() const {
- return surface_info_.id().is_valid() && Layer::HasDrawableContent();
+ return primary_surface_info_.id().is_valid() && Layer::HasDrawableContent();
}
void SurfaceLayer::SetLayerTreeHost(LayerTreeHost* host) {
@@ -93,11 +120,18 @@ void SurfaceLayer::SetLayerTreeHost(LayerTreeHost* host) {
Layer::SetLayerTreeHost(host);
return;
}
- RemoveCurrentReference();
+ RemoveReference(std::move(primary_reference_returner_));
+ RemoveReference(std::move(fallback_reference_returner_));
Layer::SetLayerTreeHost(host);
if (layer_tree_host()) {
- reference_returner_ =
- ref_factory_->CreateReference(layer_tree_host(), surface_info_.id());
+ if (primary_surface_info_.id().is_valid()) {
+ primary_reference_returner_ = ref_factory_->CreateReference(
+ layer_tree_host(), primary_surface_info_.id());
+ }
+ if (fallback_surface_info_.id().is_valid()) {
+ fallback_reference_returner_ = ref_factory_->CreateReference(
+ layer_tree_host(), fallback_surface_info_.id());
+ }
}
}
@@ -105,15 +139,16 @@ void SurfaceLayer::PushPropertiesTo(LayerImpl* layer) {
Layer::PushPropertiesTo(layer);
TRACE_EVENT0("cc", "SurfaceLayer::PushPropertiesTo");
SurfaceLayerImpl* layer_impl = static_cast<SurfaceLayerImpl*>(layer);
- layer_impl->SetSurfaceInfo(surface_info_);
+ layer_impl->SetPrimarySurfaceInfo(primary_surface_info_);
+ layer_impl->SetFallbackSurfaceInfo(fallback_surface_info_);
layer_impl->SetStretchContentToFillBounds(stretch_content_to_fill_bounds_);
}
-void SurfaceLayer::RemoveCurrentReference() {
- if (!reference_returner_)
+void SurfaceLayer::RemoveReference(base::Closure reference_returner) {
+ if (!reference_returner)
return;
auto swap_promise = base::MakeUnique<SatisfySwapPromise>(
- std::move(reference_returner_),
+ std::move(reference_returner),
layer_tree_host()->GetTaskRunnerProvider()->MainThreadTaskRunner());
layer_tree_host()->GetSwapPromiseManager()->QueueSwapPromise(
std::move(swap_promise));

Powered by Google App Engine
This is Rietveld 408576698