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

Unified Diff: cc/layers/surface_layer_impl.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_impl.cc
diff --git a/cc/layers/surface_layer_impl.cc b/cc/layers/surface_layer_impl.cc
index e23e789c4096276c97274f64399be9e3d91d9b13..f24ff175c2d149da1adb06ee66c53271ab72054d 100644
--- a/cc/layers/surface_layer_impl.cc
+++ b/cc/layers/surface_layer_impl.cc
@@ -29,11 +29,19 @@ std::unique_ptr<LayerImpl> SurfaceLayerImpl::CreateLayerImpl(
return SurfaceLayerImpl::Create(tree_impl, id());
}
-void SurfaceLayerImpl::SetSurfaceInfo(const SurfaceInfo& surface_info) {
- if (surface_info_ == surface_info)
+void SurfaceLayerImpl::SetPrimarySurfaceInfo(const SurfaceInfo& surface_info) {
+ if (primary_surface_info_ == surface_info)
return;
- surface_info_ = surface_info;
+ primary_surface_info_ = surface_info;
+ NoteLayerPropertyChanged();
+}
+
+void SurfaceLayerImpl::SetFallbackSurfaceInfo(const SurfaceInfo& surface_info) {
+ if (fallback_surface_info_ == surface_info)
+ return;
+
+ fallback_surface_info_ = surface_info;
NoteLayerPropertyChanged();
}
@@ -48,12 +56,38 @@ void SurfaceLayerImpl::SetStretchContentToFillBounds(bool stretch_content) {
void SurfaceLayerImpl::PushPropertiesTo(LayerImpl* layer) {
LayerImpl::PushPropertiesTo(layer);
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 SurfaceLayerImpl::AppendQuads(RenderPass* render_pass,
AppendQuadsData* append_quads_data) {
+ SurfaceDrawQuad* primary_draw_quad =
+ render_pass->CreateAndAppendDrawQuad<SurfaceDrawQuad>();
+ SurfaceDrawQuad* fallback_draw_quad = nullptr;
+ if (fallback_surface_info_.id().is_valid()) {
+ fallback_draw_quad =
+ render_pass->CreateAndAppendDrawQuad<SurfaceDrawQuad>();
+ }
+ PopulateSurfaceDrawQuad(render_pass, primary_draw_quad, fallback_draw_quad,
+ SurfaceDrawQuadType::PRIMARY, primary_surface_info_);
+ if (fallback_draw_quad) {
+ PopulateSurfaceDrawQuad(render_pass, fallback_draw_quad, nullptr,
+ SurfaceDrawQuadType::FALLBACK,
+ fallback_surface_info_);
+ }
+}
+
+void SurfaceLayerImpl::PopulateSurfaceDrawQuad(
+ RenderPass* render_pass,
+ SurfaceDrawQuad* surface_draw_quad,
+ SurfaceDrawQuad* fallback_surface_draw_quad,
+ SurfaceDrawQuadType surface_draw_quad_type,
+ const SurfaceInfo& surface_info) {
+ if (!surface_info.id().is_valid())
+ return;
+
AppendRainbowDebugBorder(render_pass);
SharedQuadState* shared_quad_state =
@@ -62,32 +96,28 @@ void SurfaceLayerImpl::AppendQuads(RenderPass* render_pass,
if (stretch_content_to_fill_bounds_) {
// Stretches the surface contents to exactly fill the layer bounds,
// regardless of scale or aspect ratio differences.
- float scale_x = static_cast<float>(surface_info_.size_in_pixels().width()) /
+ float scale_x = static_cast<float>(surface_info.size_in_pixels().width()) /
bounds().width();
- float scale_y =
- static_cast<float>(surface_info_.size_in_pixels().height()) /
- bounds().height();
+ float scale_y = static_cast<float>(surface_info.size_in_pixels().height()) /
+ bounds().height();
PopulateScaledSharedQuadState(shared_quad_state, scale_x, scale_y);
} else {
PopulateScaledSharedQuadState(shared_quad_state,
- surface_info_.device_scale_factor(),
- surface_info_.device_scale_factor());
+ surface_info.device_scale_factor(),
+ surface_info.device_scale_factor());
}
- if (!surface_info_.id().is_valid())
- return;
-
- gfx::Rect quad_rect(surface_info_.size_in_pixels());
+ gfx::Rect quad_rect(surface_info.size_in_pixels());
gfx::Rect visible_quad_rect =
draw_properties().occlusion_in_content_space.GetUnoccludedContentRect(
quad_rect);
if (visible_quad_rect.IsEmpty())
return;
- SurfaceDrawQuad* quad =
- render_pass->CreateAndAppendDrawQuad<SurfaceDrawQuad>();
- quad->SetNew(shared_quad_state, quad_rect, visible_quad_rect,
- surface_info_.id());
+
+ surface_draw_quad->SetNew(shared_quad_state, quad_rect, visible_quad_rect,
+ surface_info.id(), surface_draw_quad_type,
+ fallback_surface_draw_quad);
}
void SurfaceLayerImpl::GetDebugBorderProperties(SkColor* color,
@@ -185,7 +215,7 @@ void SurfaceLayerImpl::AppendRainbowDebugBorder(RenderPass* render_pass) {
void SurfaceLayerImpl::AsValueInto(base::trace_event::TracedValue* dict) const {
LayerImpl::AsValueInto(dict);
- dict->SetString("surface_id", surface_info_.id().ToString());
+ dict->SetString("surface_id", primary_surface_info_.id().ToString());
}
const char* SurfaceLayerImpl::LayerTypeAsString() const {

Powered by Google App Engine
This is Rietveld 408576698