OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "cc/output/overlay_processor.h" | 5 #include "cc/output/overlay_processor.h" |
6 | 6 |
7 #include "cc/output/output_surface.h" | 7 #include "cc/output/output_surface.h" |
8 #include "cc/output/overlay_strategy_single_on_top.h" | 8 #include "cc/output/overlay_strategy_single_on_top.h" |
9 #include "cc/output/overlay_strategy_underlay.h" | 9 #include "cc/output/overlay_strategy_underlay.h" |
10 #include "cc/quads/draw_quad.h" | 10 #include "cc/quads/draw_quad.h" |
(...skipping 17 matching lines...) Expand all Loading... |
28 | 28 |
29 gfx::Rect OverlayProcessor::GetAndResetOverlayDamage() { | 29 gfx::Rect OverlayProcessor::GetAndResetOverlayDamage() { |
30 gfx::Rect result = overlay_damage_rect_; | 30 gfx::Rect result = overlay_damage_rect_; |
31 overlay_damage_rect_ = gfx::Rect(); | 31 overlay_damage_rect_ = gfx::Rect(); |
32 return result; | 32 return result; |
33 } | 33 } |
34 | 34 |
35 bool OverlayProcessor::ProcessForCALayers( | 35 bool OverlayProcessor::ProcessForCALayers( |
36 ResourceProvider* resource_provider, | 36 ResourceProvider* resource_provider, |
37 RenderPass* render_pass, | 37 RenderPass* render_pass, |
| 38 const RenderPassFilterList& render_pass_filters, |
| 39 const RenderPassFilterList& render_pass_background_filters, |
38 OverlayCandidateList* overlay_candidates, | 40 OverlayCandidateList* overlay_candidates, |
39 CALayerOverlayList* ca_layer_overlays, | 41 CALayerOverlayList* ca_layer_overlays, |
40 gfx::Rect* damage_rect) { | 42 gfx::Rect* damage_rect) { |
41 OverlayCandidateValidator* overlay_validator = | 43 OverlayCandidateValidator* overlay_validator = |
42 surface_->GetOverlayCandidateValidator(); | 44 surface_->GetOverlayCandidateValidator(); |
43 if (!overlay_validator || !overlay_validator->AllowCALayerOverlays()) | 45 if (!overlay_validator || !overlay_validator->AllowCALayerOverlays()) |
44 return false; | 46 return false; |
45 | 47 |
46 if (!ProcessForCALayerOverlays(resource_provider, | 48 if (!ProcessForCALayerOverlays( |
47 gfx::RectF(render_pass->output_rect), | 49 resource_provider, gfx::RectF(render_pass->output_rect), |
48 render_pass->quad_list, ca_layer_overlays)) | 50 render_pass->quad_list, render_pass_filters, |
| 51 render_pass_background_filters, ca_layer_overlays)) |
49 return false; | 52 return false; |
50 | 53 |
51 // CALayer overlays are all-or-nothing. If all quads were replaced with | 54 // CALayer overlays are all-or-nothing. If all quads were replaced with |
52 // layers then clear the list and remove the backbuffer from the overcandidate | 55 // layers then clear the list and remove the backbuffer from the overcandidate |
53 // list. | 56 // list. |
54 overlay_candidates->clear(); | 57 overlay_candidates->clear(); |
55 overlay_damage_rect_ = render_pass->output_rect; | 58 overlay_damage_rect_ = render_pass->output_rect; |
56 *damage_rect = gfx::Rect(); | 59 *damage_rect = gfx::Rect(); |
57 return true; | 60 return true; |
58 } | 61 } |
59 | 62 |
60 void OverlayProcessor::ProcessForOverlays(ResourceProvider* resource_provider, | 63 void OverlayProcessor::ProcessForOverlays( |
61 RenderPass* render_pass, | 64 ResourceProvider* resource_provider, |
62 OverlayCandidateList* candidates, | 65 RenderPass* render_pass, |
63 CALayerOverlayList* ca_layer_overlays, | 66 const RenderPassFilterList& render_pass_filters, |
64 gfx::Rect* damage_rect) { | 67 const RenderPassFilterList& render_pass_background_filters, |
| 68 OverlayCandidateList* candidates, |
| 69 CALayerOverlayList* ca_layer_overlays, |
| 70 gfx::Rect* damage_rect) { |
65 // If we have any copy requests, we can't remove any quads for overlays or | 71 // If we have any copy requests, we can't remove any quads for overlays or |
66 // CALayers because the framebuffer would be missing the removed quads' | 72 // CALayers because the framebuffer would be missing the removed quads' |
67 // contents. | 73 // contents. |
68 if (!render_pass->copy_requests.empty()) { | 74 if (!render_pass->copy_requests.empty()) { |
69 // If overlay processing was skipped for a frame there's no way to be sure | 75 // If overlay processing was skipped for a frame there's no way to be sure |
70 // of the state of the previous frame, so reset. | 76 // of the state of the previous frame, so reset. |
71 previous_frame_underlay_rect_ = gfx::Rect(); | 77 previous_frame_underlay_rect_ = gfx::Rect(); |
72 return; | 78 return; |
73 } | 79 } |
74 | 80 |
75 // First attempt to process for CALayers. | 81 // First attempt to process for CALayers. |
76 if (ProcessForCALayers(resource_provider, render_pass, candidates, | 82 if (ProcessForCALayers(resource_provider, render_pass, render_pass_filters, |
| 83 render_pass_background_filters, candidates, |
77 ca_layer_overlays, damage_rect)) { | 84 ca_layer_overlays, damage_rect)) { |
78 return; | 85 return; |
79 } | 86 } |
80 | 87 |
81 // Only if that fails, attempt hardware overlay strategies. | 88 // Only if that fails, attempt hardware overlay strategies. |
82 for (const auto& strategy : strategies_) { | 89 for (const auto& strategy : strategies_) { |
83 if (!strategy->Attempt(resource_provider, render_pass, candidates)) | 90 if (!strategy->Attempt(resource_provider, render_pass, candidates)) |
84 continue; | 91 continue; |
85 | 92 |
86 UpdateDamageRect(candidates, damage_rect); | 93 UpdateDamageRect(candidates, damage_rect); |
(...skipping 28 matching lines...) Expand all Loading... |
115 } | 122 } |
116 | 123 |
117 if (this_frame_underlay_rect == previous_frame_underlay_rect_) | 124 if (this_frame_underlay_rect == previous_frame_underlay_rect_) |
118 damage_rect->Subtract(this_frame_underlay_rect); | 125 damage_rect->Subtract(this_frame_underlay_rect); |
119 previous_frame_underlay_rect_ = this_frame_underlay_rect; | 126 previous_frame_underlay_rect_ = this_frame_underlay_rect; |
120 | 127 |
121 damage_rect->Union(output_surface_overlay_damage_rect); | 128 damage_rect->Union(output_surface_overlay_damage_rect); |
122 } | 129 } |
123 | 130 |
124 } // namespace cc | 131 } // namespace cc |
OLD | NEW |