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

Unified Diff: cc/output/overlay_strategy_sandwich.cc

Issue 1304053016: Mac Overlays: Allow multiple overlays with sandwich strategy (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@snapshot
Patch Set: Created 5 years, 3 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/output/overlay_strategy_sandwich.cc
diff --git a/cc/output/overlay_strategy_sandwich.cc b/cc/output/overlay_strategy_sandwich.cc
index bdcaf29d05039147320e23682f2694046aeb3061..8258cc9148b76ecb08d3ba7f099cc83a5b383c3f 100644
--- a/cc/output/overlay_strategy_sandwich.cc
+++ b/cc/output/overlay_strategy_sandwich.cc
@@ -31,7 +31,7 @@ namespace cc {
OverlayStrategySandwich::~OverlayStrategySandwich() {}
-bool OverlayStrategySandwich::TryOverlay(
+QuadList::Iterator OverlayStrategySandwich::TryOverlay(
OverlayCandidateValidator* capability_checker,
RenderPassList* render_passes_in_draw_order,
OverlayCandidateList* output_candidate_list,
@@ -47,21 +47,21 @@ bool OverlayStrategySandwich::TryOverlay(
candidate_quad->shared_quad_state->quad_to_target_transform;
gfx::Transform candidate_inverse_transform;
if (!candidate_transform.GetInverse(&candidate_inverse_transform))
- return false;
+ return ++candidate_iter_in_quad_list;
// Compute the candidate's rect in display space (pixels on the screen). The
// rect needs to be DIP-aligned, or we cannot use it.
gfx::RectF candidate_pixel_rect_float = candidate_quad->rect;
candidate_transform.TransformRect(&candidate_pixel_rect_float);
- gfx::Rect candidate_pixel_rect;
- candidate_pixel_rect = gfx::ToEnclosingRect(candidate_pixel_rect_float);
- if (candidate_pixel_rect != candidate_pixel_rect_float)
- return false;
- if (!IsPixelRectAlignedToDIP(device_scale_factor, candidate_pixel_rect))
- return false;
-
- // Iterate through the quads in front of |potential_candidate|, and compute
- // the region of |potential_candidate| that is covered.
+ const gfx::Rect candidate_pixel_rect =
+ gfx::ToEnclosingRect(candidate_pixel_rect_float);
+ if (candidate_pixel_rect != candidate_pixel_rect_float ||
+ !IsPixelRectAlignedToDIP(device_scale_factor, candidate_pixel_rect)) {
+ return ++candidate_iter_in_quad_list;
+ }
+
+ // Iterate through the quads in front of |candidate|, and compute the region
+ // of |candidate| that is covered.
Region pixel_covered_region;
for (auto overlap_iter = quad_list.cbegin();
overlap_iter != candidate_iter_in_quad_list; ++overlap_iter) {
@@ -81,14 +81,9 @@ bool OverlayStrategySandwich::TryOverlay(
pixel_covered_region.Union(pixel_covered_rect);
ccameron 2015/09/02 21:41:55 We should only promote to an overlay layer here if
Andre 2015/09/02 21:54:51 Got it.
}
- // Add our primary surface.
- OverlayCandidateList new_candidate_list;
- OverlayCandidate main_image;
- main_image.display_rect = pixel_bounds;
- new_candidate_list.push_back(main_image);
-
// Add the candidate's overlay.
DCHECK(candidate.resource_id);
+ OverlayCandidateList new_candidate_list;
new_candidate_list.push_back(candidate);
new_candidate_list.back().plane_z_order = 1;
@@ -114,14 +109,15 @@ bool OverlayStrategySandwich::TryOverlay(
// Check for support.
capability_checker->CheckOverlaySupport(&new_candidate_list);
for (const OverlayCandidate& candidate : new_candidate_list) {
- if (candidate.plane_z_order > 0 && !candidate.overlay_handled)
- return false;
+ if (!candidate.overlay_handled)
+ return ++candidate_iter_in_quad_list;
}
// Remove the quad for the overlay quad. Replace it with a transparent quad
// if we're putting a new overlay on top.
if (pixel_covered_rects.empty()) {
- quad_list.EraseAndInvalidateAllPointers(candidate_iter_in_quad_list);
+ candidate_iter_in_quad_list =
+ quad_list.EraseAndInvalidateAllPointers(candidate_iter_in_quad_list);
} else {
// Cache the information from the candidate quad that we'll need to
// construct the solid color quads.
@@ -154,8 +150,17 @@ bool OverlayStrategySandwich::TryOverlay(
}
}
- output_candidate_list->swap(new_candidate_list);
- return true;
+ if (output_candidate_list->empty()) {
+ // Add our primary surface.
+ OverlayCandidate main_image;
+ main_image.display_rect = pixel_bounds;
+ output_candidate_list->push_back(main_image);
+ }
+
+ output_candidate_list->insert(output_candidate_list->end(),
+ new_candidate_list.begin(),
+ new_candidate_list.end());
+ return candidate_iter_in_quad_list;
}
} // namespace cc

Powered by Google App Engine
This is Rietveld 408576698