Index: cc/output/overlay_processor.cc |
diff --git a/cc/output/overlay_processor.cc b/cc/output/overlay_processor.cc |
index 43a064fb6e8fd5bb9c2ed11e6fa08e6caaa5de1c..40d6da6c25f3064e4a1d5b5c229ea7ad9060a690 100644 |
--- a/cc/output/overlay_processor.cc |
+++ b/cc/output/overlay_processor.cc |
@@ -26,11 +26,18 @@ void OverlayProcessor::Initialize() { |
OverlayProcessor::~OverlayProcessor() {} |
+gfx::Rect OverlayProcessor::GetAndResetOverlayDamage() { |
+ gfx::Rect result = overlay_damage_rect_; |
+ overlay_damage_rect_ = gfx::Rect(); |
+ return result; |
+} |
+ |
bool OverlayProcessor::ProcessForCALayers( |
ResourceProvider* resource_provider, |
RenderPassList* render_passes, |
+ OverlayCandidateList* overlay_candidates, |
CALayerOverlayList* ca_layer_overlays, |
- OverlayCandidateList* overlay_candidates) { |
+ gfx::Rect* damage_rect) { |
RenderPass* root_render_pass = render_passes->back().get(); |
OverlayCandidateValidator* overlay_validator = |
@@ -48,18 +55,43 @@ bool OverlayProcessor::ProcessForCALayers( |
// list. |
overlay_candidates->clear(); |
render_passes->back()->quad_list.clear(); |
+ overlay_damage_rect_ = root_render_pass->output_rect; |
+ *damage_rect = gfx::Rect(); |
return true; |
} |
void OverlayProcessor::ProcessForOverlays(ResourceProvider* resource_provider, |
RenderPassList* render_passes, |
OverlayCandidateList* candidates, |
+ CALayerOverlayList* ca_layer_overlays, |
gfx::Rect* damage_rect) { |
+ // First attempt to process for CALayers. |
+ if (ProcessForCALayers(resource_provider, render_passes, candidates, |
+ ca_layer_overlays, damage_rect)) { |
+ return; |
+ } |
+ |
+ // Only if that fails, attempt hardware overlay strategies. |
for (const auto& strategy : strategies_) { |
- if (strategy->Attempt(resource_provider, render_passes, candidates, |
- damage_rect)) { |
- return; |
+ if (!strategy->Attempt(resource_provider, render_passes, candidates)) |
+ continue; |
+ |
+ // Subtract on-top overlays from the damage rect, unless the overlays use |
+ // the backbuffer as their content (in which case, add their combined rect |
+ // back to the damage at the end). |
+ gfx::Rect output_surface_overlay_damage_rect; |
+ for (const OverlayCandidate& overlay : *candidates) { |
+ if (overlay.plane_z_order > 0) { |
+ const gfx::Rect overlay_display_rect = |
+ ToEnclosedRect(overlay.display_rect); |
+ overlay_damage_rect_.Union(overlay_display_rect); |
+ damage_rect->Subtract(overlay_display_rect); |
+ if (overlay.use_output_surface_for_resource) |
+ output_surface_overlay_damage_rect.Union(overlay_display_rect); |
+ } |
} |
+ damage_rect->Union(output_surface_overlay_damage_rect); |
+ return; |
} |
} |