| Index: cc/surfaces/surface_aggregator.cc
|
| diff --git a/cc/surfaces/surface_aggregator.cc b/cc/surfaces/surface_aggregator.cc
|
| index b9a679fdac16948605c7980a29930eadbd153359..106ecf85d5c4efd915518785eb28542e87b37d6c 100644
|
| --- a/cc/surfaces/surface_aggregator.cc
|
| +++ b/cc/surfaces/surface_aggregator.cc
|
| @@ -263,7 +263,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);
|
|
|
| @@ -281,6 +282,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)) {
|
| @@ -408,11 +410,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 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.
|
| @@ -453,7 +456,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_,
|
| @@ -543,12 +547,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)) {
|
| @@ -761,10 +767,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()));
|
| @@ -815,9 +822,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();
|
| @@ -825,7 +831,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);
|
| }
|
| }
|
| @@ -853,8 +859,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);
|
| @@ -866,6 +874,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.
|
|
|