Chromium Code Reviews| 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, |
|
kalyank
2015/11/18 21:18:33
What happens on platforms which don't use CALayers
ccameron
2015/11/18 21:22:12
The overlay_validator->AllowCALayerOverlays() call
|
| + 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; |
| } |
| } |