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

Unified Diff: cc/surfaces/surface_aggregator.cc

Issue 2873593002: Force use of and cache render surface. (Closed)
Patch Set: Fix for comments in patch 4. Created 3 years, 6 months 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 side-by-side diff with in-line comments
Download patch
Index: cc/surfaces/surface_aggregator.cc
diff --git a/cc/surfaces/surface_aggregator.cc b/cc/surfaces/surface_aggregator.cc
index e19a997541719faaeefea65b62c24b2873e2e78f..9af2e920ddd198a76c2bcca362e7a3f5e614b584 100644
--- a/cc/surfaces/surface_aggregator.cc
+++ b/cc/surfaces/surface_aggregator.cc
@@ -267,7 +267,9 @@ 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.cache_render_surface,
+ source.has_damage_from_contributing_content);
MoveMatchingRequests(source.id, &copy_requests, &copy_pass->copy_requests);
@@ -285,6 +287,7 @@ void SurfaceAggregator::HandleSurfaceQuad(
copy_pass.get(), surface_id);
if (!copy_request_passes_.count(remapped_pass_id) &&
+ !cache_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)) {
@@ -295,6 +298,7 @@ void SurfaceAggregator::HandleSurfaceQuad(
}
}
+ passes_id_map.insert(std::make_pair(copy_pass->id, copy_pass.get()));
dest_pass_list_->push_back(std::move(copy_pass));
}
@@ -303,6 +307,13 @@ void SurfaceAggregator::HandleSurfaceQuad(
surface_transform.ConcatTransform(target_transform);
const RenderPass& last_pass = *render_pass_list.back();
+ // Check if the surface_quad has damage.
+ if (dest_pass->cache_render_surface) {
+ dest_pass->has_damage_from_contributing_content |=
+ !DamageRectForSurface(surface, last_pass, last_pass.output_rect)
+ .IsEmpty();
+ }
+
if (merge_pass) {
// TODO(jamesr): Clean up last pass special casing.
const QuadList& quads = last_pass.quad_list;
@@ -412,11 +423,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 cache 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_cache_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.
@@ -457,7 +469,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_cache_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_,
@@ -477,7 +490,13 @@ void SurfaceAggregator::CopyQuadsToPass(
RenderPassDrawQuad::MaterialCast(quad);
int original_pass_id = pass_quad->render_pass_id;
int remapped_pass_id = RemapPassId(original_pass_id, surface_id);
-
+ if (dest_pass->cache_render_surface) {
+ auto iter = passes_id_map.find(remapped_pass_id);
+ if (iter != passes_id_map.end()) {
+ dest_pass->has_damage_from_contributing_content |=
+ iter->second->has_damage_from_contributing_content;
+ }
+ }
dest_quad = dest_pass->CopyFromAndAppendRenderPassDrawQuad(
pass_quad, dest_shared_quad_state, remapped_pass_id);
} else if (quad->material == DrawQuad::TEXTURE_CONTENT) {
@@ -548,12 +567,15 @@ 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.cache_render_surface,
+ source.has_damage_from_contributing_content);
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) &&
+ !cache_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)) {
@@ -564,6 +586,7 @@ void SurfaceAggregator::CopyPasses(const CompositorFrame& frame,
}
}
+ passes_id_map.insert(std::make_pair(copy_pass->id, copy_pass.get()));
dest_pass_list_->push_back(std::move(copy_pass));
}
}
@@ -767,10 +790,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()) {
- RenderPassId remapped_pass_id = RemapPassId(render_pass->id, surface_id);
+ RenderPassId 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->cache_render_surface)
+ cache_render_surface_passes_.insert(remapped_pass_id);
}
referenced_surfaces_.erase(referenced_surfaces_.find(surface->surface_id()));
@@ -823,18 +847,17 @@ void SurfaceAggregator::CopyUndrawnSurfaces(PrewalkResult* prewalk_result) {
}
}
-void SurfaceAggregator::PropagateCopyRequestPasses() {
- std::vector<RenderPassId> copy_requests_to_iterate(
- copy_request_passes_.begin(), copy_request_passes_.end());
- while (!copy_requests_to_iterate.empty()) {
- int first = copy_requests_to_iterate.back();
- copy_requests_to_iterate.pop_back();
+void SurfaceAggregator::PropagatePasses(base::flat_set<RenderPassId>* passes) {
+ std::vector<RenderPassId> passes_to_iterate(passes->begin(), passes->end());
+ while (!passes_to_iterate.empty()) {
+ RenderPassId first = passes_to_iterate.back();
+ passes_to_iterate.pop_back();
auto it = render_pass_dependencies_.find(first);
if (it == render_pass_dependencies_.end())
continue;
for (auto pass : it->second) {
- if (copy_request_passes_.insert(pass).second) {
- copy_requests_to_iterate.push_back(pass);
+ if (passes->insert(pass).second) {
+ passes_to_iterate.push_back(pass);
}
}
}
@@ -860,8 +883,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(&copy_request_passes_);
+ PropagatePasses(&cache_render_surface_passes_);
has_copy_requests_ = !copy_request_passes_.empty();
+ has_cache_render_surfaces_ = !cache_render_surface_passes_.empty();
frame.metadata.may_contain_video = prewalk_result.may_contain_video;
CopyUndrawnSurfaces(&prewalk_result);
@@ -873,6 +898,7 @@ CompositorFrame SurfaceAggregator::Aggregate(const SurfaceId& surface_id) {
moved_pixel_passes_.clear();
copy_request_passes_.clear();
+ cache_render_surface_passes_.clear();
render_pass_dependencies_.clear();
// Remove all render pass mappings that weren't used in the current frame.
@@ -892,6 +918,7 @@ CompositorFrame SurfaceAggregator::Aggregate(const SurfaceId& surface_id) {
return CompositorFrame();
dest_pass_list_ = NULL;
+ passes_id_map.clear();
ProcessAddedAndRemovedSurfaces();
contained_surfaces_.swap(previous_contained_surfaces_);
contained_surfaces_.clear();

Powered by Google App Engine
This is Rietveld 408576698