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

Side by Side Diff: cc/output/overlay_processor.cc

Issue 2573603005: Compute damage rect for Cast video compositing (Closed)
Patch Set: Created 4 years 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 unified diff | Download patch
« no previous file with comments | « cc/output/overlay_processor.h ('k') | cc/output/overlay_strategy_cast_underlay.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 21 matching lines...) Expand all
32 cc::OverlayCandidateList* candidates_; 32 cc::OverlayCandidateList* candidates_;
33 33
34 DISALLOW_COPY_AND_ASSIGN(SendPromotionHintsBeforeReturning); 34 DISALLOW_COPY_AND_ASSIGN(SendPromotionHintsBeforeReturning);
35 }; 35 };
36 #endif 36 #endif
37 37
38 } // namespace 38 } // namespace
39 39
40 namespace cc { 40 namespace cc {
41 41
42 bool OverlayProcessor::Strategy::GetSwapWithDamageRect(gfx::Rect* rect) {
43 return false;
44 }
45
42 OverlayProcessor::OverlayProcessor(OutputSurface* surface) : surface_(surface) { 46 OverlayProcessor::OverlayProcessor(OutputSurface* surface) : surface_(surface) {
43 } 47 }
44 48
45 void OverlayProcessor::Initialize() { 49 void OverlayProcessor::Initialize() {
46 DCHECK(surface_); 50 DCHECK(surface_);
47 OverlayCandidateValidator* validator = 51 OverlayCandidateValidator* validator =
48 surface_->GetOverlayCandidateValidator(); 52 surface_->GetOverlayCandidateValidator();
49 if (validator) 53 if (validator)
50 validator->GetStrategies(&strategies_); 54 validator->GetStrategies(&strategies_);
51 } 55 }
(...skipping 29 matching lines...) Expand all
81 overlay_damage_rect_ = render_pass->output_rect; 85 overlay_damage_rect_ = render_pass->output_rect;
82 *damage_rect = gfx::Rect(); 86 *damage_rect = gfx::Rect();
83 return true; 87 return true;
84 } 88 }
85 89
86 void OverlayProcessor::ProcessForOverlays(ResourceProvider* resource_provider, 90 void OverlayProcessor::ProcessForOverlays(ResourceProvider* resource_provider,
87 RenderPass* render_pass, 91 RenderPass* render_pass,
88 OverlayCandidateList* candidates, 92 OverlayCandidateList* candidates,
89 CALayerOverlayList* ca_layer_overlays, 93 CALayerOverlayList* ca_layer_overlays,
90 gfx::Rect* damage_rect) { 94 gfx::Rect* damage_rect) {
95 have_swap_with_damage_rect_ = false;
91 #if defined(OS_ANDROID) 96 #if defined(OS_ANDROID)
92 // Be sure to send out notifications, regardless of whether we get to 97 // Be sure to send out notifications, regardless of whether we get to
93 // processing for overlays or not. If we don't, then we should notify that 98 // processing for overlays or not. If we don't, then we should notify that
94 // they are not promotable. 99 // they are not promotable.
95 SendPromotionHintsBeforeReturning notifier(resource_provider, candidates); 100 SendPromotionHintsBeforeReturning notifier(resource_provider, candidates);
96 #endif 101 #endif
97 102
98 // If we have any copy requests, we can't remove any quads for overlays or 103 // If we have any copy requests, we can't remove any quads for overlays or
99 // CALayers because the framebuffer would be missing the removed quads' 104 // CALayers because the framebuffer would be missing the removed quads'
100 // contents. 105 // contents.
101 if (!render_pass->copy_requests.empty()) { 106 if (!render_pass->copy_requests.empty()) {
102 // If overlay processing was skipped for a frame there's no way to be sure 107 // If overlay processing was skipped for a frame there's no way to be sure
103 // of the state of the previous frame, so reset. 108 // of the state of the previous frame, so reset.
104 previous_frame_underlay_rect_ = gfx::Rect(); 109 previous_frame_underlay_rect_ = gfx::Rect();
105 return; 110 return;
106 } 111 }
107 112
108 // First attempt to process for CALayers. 113 // First attempt to process for CALayers.
109 if (ProcessForCALayers(resource_provider, render_pass, candidates, 114 if (ProcessForCALayers(resource_provider, render_pass, candidates,
110 ca_layer_overlays, damage_rect)) { 115 ca_layer_overlays, damage_rect)) {
111 return; 116 return;
112 } 117 }
113 118
114 // Only if that fails, attempt hardware overlay strategies. 119 // Only if that fails, attempt hardware overlay strategies.
115 for (const auto& strategy : strategies_) { 120 for (const auto& strategy : strategies_) {
116 if (!strategy->Attempt(resource_provider, render_pass, candidates)) 121 if (!strategy->Attempt(resource_provider, render_pass, candidates))
117 continue; 122 continue;
118 123
124 have_swap_with_damage_rect_ =
125 strategy->GetSwapWithDamageRect(&swap_with_damage_rect_);
126
119 UpdateDamageRect(candidates, damage_rect); 127 UpdateDamageRect(candidates, damage_rect);
120 return; 128 return;
121 } 129 }
122 } 130 }
123 131
132 bool OverlayProcessor::GetSwapWithDamageRect(gfx::Rect* damage_rect) {
133 DCHECK(damage_rect);
134 *damage_rect = swap_with_damage_rect_;
135 return have_swap_with_damage_rect_;
136 }
137
124 // Subtract on-top overlays from the damage rect, unless the overlays use 138 // Subtract on-top overlays from the damage rect, unless the overlays use
125 // the backbuffer as their content (in which case, add their combined rect 139 // the backbuffer as their content (in which case, add their combined rect
126 // back to the damage at the end). 140 // back to the damage at the end).
127 // Also subtract unoccluded underlays from the damage rect if we know that the 141 // Also subtract unoccluded underlays from the damage rect if we know that the
128 // same underlay was scheduled on the previous frame. If the renderer decides 142 // same underlay was scheduled on the previous frame. If the renderer decides
129 // not to swap the framebuffer there will still be a transparent hole in the 143 // not to swap the framebuffer there will still be a transparent hole in the
130 // previous frame. This only handles the common case of a single underlay quad 144 // previous frame. This only handles the common case of a single underlay quad
131 // for fullscreen video. 145 // for fullscreen video.
132 void OverlayProcessor::UpdateDamageRect(OverlayCandidateList* candidates, 146 void OverlayProcessor::UpdateDamageRect(OverlayCandidateList* candidates,
133 gfx::Rect* damage_rect) { 147 gfx::Rect* damage_rect) {
(...skipping 14 matching lines...) Expand all
148 } 162 }
149 163
150 if (this_frame_underlay_rect == previous_frame_underlay_rect_) 164 if (this_frame_underlay_rect == previous_frame_underlay_rect_)
151 damage_rect->Subtract(this_frame_underlay_rect); 165 damage_rect->Subtract(this_frame_underlay_rect);
152 previous_frame_underlay_rect_ = this_frame_underlay_rect; 166 previous_frame_underlay_rect_ = this_frame_underlay_rect;
153 167
154 damage_rect->Union(output_surface_overlay_damage_rect); 168 damage_rect->Union(output_surface_overlay_damage_rect);
155 } 169 }
156 170
157 } // namespace cc 171 } // namespace cc
OLDNEW
« no previous file with comments | « cc/output/overlay_processor.h ('k') | cc/output/overlay_strategy_cast_underlay.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698