Index: cc/surfaces/surface_aggregator.cc |
diff --git a/cc/surfaces/surface_aggregator.cc b/cc/surfaces/surface_aggregator.cc |
index f0e73f8a06a835fdb22d2368cad0415218225dd2..a1a35d366e71de797c0d9ca8fd75370f43d8d032 100644 |
--- a/cc/surfaces/surface_aggregator.cc |
+++ b/cc/surfaces/surface_aggregator.cc |
@@ -266,7 +266,8 @@ void SurfaceAggregator::HandleSurfaceQuad( |
copy_pass->SetAll(remapped_pass_id, source.output_rect, source.output_rect, |
source.transform_to_root_target, source.filters, |
source.background_filters, blending_color_space_, |
- source.has_transparent_background); |
+ source.has_transparent_background, |
+ source.force_render_surface); |
MoveMatchingRequests(source.id, ©_requests, ©_pass->copy_requests); |
@@ -284,6 +285,7 @@ void SurfaceAggregator::HandleSurfaceQuad( |
copy_pass.get(), surface_id); |
if (!copy_request_passes_.count(remapped_pass_id) && |
+ !force_render_surface_passes_.count(remapped_pass_id) && |
!moved_pixel_passes_.count(remapped_pass_id)) { |
gfx::Transform inverse_transform(gfx::Transform::kSkipInitialization); |
if (copy_pass->transform_to_root_target.GetInverse(&inverse_transform)) { |
@@ -411,11 +413,12 @@ void SurfaceAggregator::CopyQuadsToPass( |
const SurfaceId& surface_id) { |
const SharedQuadState* last_copied_source_shared_quad_state = nullptr; |
const SharedQuadState* dest_shared_quad_state = nullptr; |
- // If the current frame has copy requests then aggregate the entire |
- // thing, as otherwise parts of the copy requests may be ignored. |
- const bool ignore_undamaged = aggregate_only_damaged_ && |
- !has_copy_requests_ && |
- !moved_pixel_passes_.count(dest_pass->id); |
+ // If the current frame has copy requests or force use of render surface, then |
+ // aggregate the entire thing, as otherwise parts of the copy requests or |
+ // render surface may be ignored. |
+ const bool ignore_undamaged = |
+ aggregate_only_damaged_ && !has_copy_requests_ && |
+ !has_force_render_surfaces_ && !moved_pixel_passes_.count(dest_pass->id); |
// Damage rect in the quad space of the current shared quad state. |
// TODO(jbauman): This rect may contain unnecessary area if |
// transform isn't axis-aligned. |
@@ -456,7 +459,8 @@ void SurfaceAggregator::CopyQuadsToPass( |
dest_shared_quad_state = CopySharedQuadState( |
quad->shared_quad_state, target_transform, clip_rect, dest_pass); |
last_copied_source_shared_quad_state = quad->shared_quad_state; |
- if (aggregate_only_damaged_ && !has_copy_requests_) { |
+ if (aggregate_only_damaged_ && !has_copy_requests_ && |
+ !has_force_render_surfaces_) { |
damage_rect_in_quad_space_valid = CalculateQuadSpaceDamageRect( |
dest_shared_quad_state->quad_to_target_transform, |
dest_pass->transform_to_root_target, root_damage_rect_, |
@@ -546,12 +550,14 @@ void SurfaceAggregator::CopyPasses(const CompositorFrame& frame, |
copy_pass->SetAll(remapped_pass_id, source.output_rect, source.output_rect, |
source.transform_to_root_target, source.filters, |
source.background_filters, blending_color_space_, |
- source.has_transparent_background); |
+ source.has_transparent_background, |
+ source.force_render_surface); |
CopyQuadsToPass(source.quad_list, source.shared_quad_state_list, |
child_to_parent_map, gfx::Transform(), ClipData(), |
copy_pass.get(), surface->surface_id()); |
if (!copy_request_passes_.count(remapped_pass_id) && |
+ !force_render_surface_passes_.count(remapped_pass_id) && |
!moved_pixel_passes_.count(remapped_pass_id)) { |
gfx::Transform inverse_transform(gfx::Transform::kSkipInitialization); |
if (copy_pass->transform_to_root_target.GetInverse(&inverse_transform)) { |
@@ -765,10 +771,11 @@ gfx::Rect SurfaceAggregator::PrewalkTree(const SurfaceId& surface_id, |
CHECK(debug_weak_this.get()); |
for (const auto& render_pass : frame.render_pass_list) { |
- if (!render_pass->copy_requests.empty()) { |
- int remapped_pass_id = RemapPassId(render_pass->id, surface_id); |
+ int remapped_pass_id = RemapPassId(render_pass->id, surface_id); |
+ if (!render_pass->copy_requests.empty()) |
copy_request_passes_.insert(remapped_pass_id); |
- } |
+ if (render_pass->force_render_surface) |
+ force_render_surface_passes_.insert(remapped_pass_id); |
} |
referenced_surfaces_.erase(referenced_surfaces_.find(surface->surface_id())); |
@@ -819,9 +826,8 @@ void SurfaceAggregator::CopyUndrawnSurfaces(PrewalkResult* prewalk_result) { |
} |
} |
-void SurfaceAggregator::PropagateCopyRequestPasses() { |
- std::vector<int> copy_requests_to_iterate(copy_request_passes_.begin(), |
- copy_request_passes_.end()); |
+void SurfaceAggregator::PropagatePasses(base::flat_set<int>* passes) { |
+ std::vector<int> copy_requests_to_iterate(passes->begin(), passes->end()); |
while (!copy_requests_to_iterate.empty()) { |
int first = copy_requests_to_iterate.back(); |
copy_requests_to_iterate.pop_back(); |
@@ -829,7 +835,7 @@ void SurfaceAggregator::PropagateCopyRequestPasses() { |
if (it == render_pass_dependencies_.end()) |
continue; |
for (auto pass : it->second) { |
- if (copy_request_passes_.insert(pass).second) { |
+ if (passes->insert(pass).second) { |
copy_requests_to_iterate.push_back(pass); |
} |
} |
@@ -856,8 +862,10 @@ CompositorFrame SurfaceAggregator::Aggregate(const SurfaceId& surface_id) { |
valid_surfaces_.clear(); |
PrewalkResult prewalk_result; |
root_damage_rect_ = PrewalkTree(surface_id, false, 0, &prewalk_result); |
- PropagateCopyRequestPasses(); |
+ PropagatePasses(©_request_passes_); |
+ PropagatePasses(&force_render_surface_passes_); |
has_copy_requests_ = !copy_request_passes_.empty(); |
+ has_force_render_surfaces_ = !force_render_surface_passes_.empty(); |
frame.metadata.may_contain_video = prewalk_result.may_contain_video; |
CopyUndrawnSurfaces(&prewalk_result); |
@@ -869,6 +877,7 @@ CompositorFrame SurfaceAggregator::Aggregate(const SurfaceId& surface_id) { |
moved_pixel_passes_.clear(); |
copy_request_passes_.clear(); |
+ force_render_surface_passes_.clear(); |
render_pass_dependencies_.clear(); |
// Remove all render pass mappings that weren't used in the current frame. |