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

Unified Diff: cc/surfaces/surface_aggregator.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/surfaces/surface_aggregator.cc
diff --git a/cc/surfaces/surface_aggregator.cc b/cc/surfaces/surface_aggregator.cc
index 421fbc58cfd4ae41edb581811db6997ca54c382c..05c2a986173e3e5b7f908e46d4e6fd9b561794cb 100644
--- a/cc/surfaces/surface_aggregator.cc
+++ b/cc/surfaces/surface_aggregator.cc
@@ -44,6 +44,24 @@ void MoveMatchingRequests(
copy_requests->erase(request_range.first, request_range.second);
}
+// Returns true if the damage rect is valid.
+bool CalculateQuadSpaceDamageRect(
+ const gfx::Transform& quad_to_target_transform,
+ const gfx::Transform& target_to_root_transform,
+ const gfx::Rect& root_damage_rect,
+ gfx::Rect* quad_space_damage_rect) {
+ gfx::Transform quad_to_root_transform(target_to_root_transform,
+ quad_to_target_transform);
+ gfx::Transform inverse_transform(gfx::Transform::kSkipInitialization);
+ bool inverse_valid = quad_to_root_transform.GetInverse(&inverse_transform);
+ if (!inverse_valid)
+ return false;
+
+ *quad_space_damage_rect = MathUtil::ProjectEnclosingClippedRect(
+ inverse_transform, root_damage_rect);
+ return true;
+}
+
} // namespace
SurfaceAggregator::SurfaceAggregator(SurfaceManager* manager,
@@ -159,17 +177,39 @@ void SurfaceAggregator::HandleSurfaceQuad(
const SurfaceDrawQuad* surface_quad,
const gfx::Transform& target_transform,
const ClipData& clip_rect,
- RenderPass* dest_pass) {
+ RenderPass* dest_pass,
+ bool ignore_undamaged,
+ gfx::Rect* damage_rect_in_quad_space,
+ bool* damage_rect_in_quad_space_valid) {
SurfaceId surface_id = surface_quad->surface_id;
// If this surface's id is already in our referenced set then it creates
// a cycle in the graph and should be dropped.
if (referenced_surfaces_.count(surface_id))
return;
Surface* surface = manager_->GetSurfaceForId(surface_id);
- if (!surface)
- return;
- if (!surface->HasFrame())
+ if (!surface || !surface->HasFrame()) {
+ if (surface_quad->fallback_quad) {
+ HandleSurfaceQuad(surface_quad->fallback_quad, target_transform,
+ clip_rect, dest_pass, ignore_undamaged,
+ damage_rect_in_quad_space,
+ damage_rect_in_quad_space_valid);
+ }
return;
+ }
+
+ if (ignore_undamaged) {
+ gfx::Transform quad_to_target_transform(
+ target_transform,
+ surface_quad->shared_quad_state->quad_to_target_transform);
+ *damage_rect_in_quad_space_valid = CalculateQuadSpaceDamageRect(
+ quad_to_target_transform, dest_pass->transform_to_root_target,
+ root_damage_rect_, damage_rect_in_quad_space);
+ if (*damage_rect_in_quad_space_valid &&
+ !damage_rect_in_quad_space->Intersects(surface_quad->visible_rect)) {
+ return;
+ }
+ }
+
const CompositorFrame& frame = surface->GetEligibleFrame();
// A map keyed by RenderPass id.
@@ -309,24 +349,6 @@ SharedQuadState* SurfaceAggregator::CopySharedQuadState(
return copy_shared_quad_state;
}
-// Returns true if the damage rect is valid.
-static bool CalculateQuadSpaceDamageRect(
- const gfx::Transform& quad_to_target_transform,
- const gfx::Transform& target_to_root_transform,
- const gfx::Rect& root_damage_rect,
- gfx::Rect* quad_space_damage_rect) {
- gfx::Transform quad_to_root_transform(target_to_root_transform,
- quad_to_target_transform);
- gfx::Transform inverse_transform(gfx::Transform::kSkipInitialization);
- bool inverse_valid = quad_to_root_transform.GetInverse(&inverse_transform);
- if (!inverse_valid)
- return false;
-
- *quad_space_damage_rect = MathUtil::ProjectEnclosingClippedRect(
- inverse_transform, root_damage_rect);
- return true;
-}
-
void SurfaceAggregator::CopyQuadsToPass(
const QuadList& source_quad_list,
const SharedQuadStateList& source_shared_quad_state_list,
@@ -369,18 +391,14 @@ void SurfaceAggregator::CopyQuadsToPass(
// current data.
last_copied_source_shared_quad_state = nullptr;
- if (ignore_undamaged) {
- gfx::Transform quad_to_target_transform(
- target_transform,
- quad->shared_quad_state->quad_to_target_transform);
- damage_rect_in_quad_space_valid = CalculateQuadSpaceDamageRect(
- quad_to_target_transform, dest_pass->transform_to_root_target,
- root_damage_rect_, &damage_rect_in_quad_space);
- if (damage_rect_in_quad_space_valid &&
- !damage_rect_in_quad_space.Intersects(quad->visible_rect))
- continue;
- }
- HandleSurfaceQuad(surface_quad, target_transform, clip_rect, dest_pass);
+ // The primary SurfaceDrawQuad should have already dealt with the fallback
+ // DrawQuad.
+ if (surface_quad->surface_draw_quad_type == SurfaceDrawQuadType::FALLBACK)
+ continue;
+
+ HandleSurfaceQuad(surface_quad, target_transform, clip_rect, dest_pass,
+ ignore_undamaged, &damage_rect_in_quad_space,
+ &damage_rect_in_quad_space_valid);
} else {
if (quad->shared_quad_state != last_copied_source_shared_quad_state) {
dest_shared_quad_state = CopySharedQuadState(

Powered by Google App Engine
This is Rietveld 408576698