| Index: cc/surfaces/surface_aggregator.cc
|
| diff --git a/cc/surfaces/surface_aggregator.cc b/cc/surfaces/surface_aggregator.cc
|
| index 05d1070a10305178aa58a100090efb99daa35b8d..cf175ffff64419ca412b214445e6fcb57d680a6e 100644
|
| --- a/cc/surfaces/surface_aggregator.cc
|
| +++ b/cc/surfaces/surface_aggregator.cc
|
| @@ -17,6 +17,7 @@
|
| #include "base/trace_event/trace_event.h"
|
| #include "cc/base/math_util.h"
|
| #include "cc/output/compositor_frame.h"
|
| +#include "cc/output/delegated_frame_data.h"
|
| #include "cc/quads/draw_quad.h"
|
| #include "cc/quads/render_pass_draw_quad.h"
|
| #include "cc/quads/shared_quad_state.h"
|
| @@ -187,14 +188,15 @@ void SurfaceAggregator::HandleSurfaceQuad(
|
| Surface* surface = manager_->GetSurfaceForId(surface_id);
|
| if (!surface)
|
| return;
|
| - if (!surface->HasFrame())
|
| - return;
|
| const CompositorFrame& frame = surface->GetEligibleFrame();
|
| + const DelegatedFrameData* frame_data = frame.delegated_frame_data.get();
|
| + if (!frame_data)
|
| + return;
|
|
|
| std::multimap<RenderPassId, std::unique_ptr<CopyOutputRequest>> copy_requests;
|
| surface->TakeCopyOutputRequests(©_requests);
|
|
|
| - const RenderPassList& render_pass_list = frame.render_pass_list;
|
| + const RenderPassList& render_pass_list = frame_data->render_pass_list;
|
| if (!valid_surfaces_.count(surface->surface_id())) {
|
| for (auto& request : copy_requests)
|
| request.second->SendEmptyResult();
|
| @@ -460,14 +462,14 @@ void SurfaceAggregator::CopyQuadsToPass(
|
| }
|
| }
|
|
|
| -void SurfaceAggregator::CopyPasses(const CompositorFrame& frame,
|
| +void SurfaceAggregator::CopyPasses(const DelegatedFrameData* frame_data,
|
| Surface* surface) {
|
| // The root surface is allowed to have copy output requests, so grab them
|
| // off its render passes.
|
| std::multimap<RenderPassId, std::unique_ptr<CopyOutputRequest>> copy_requests;
|
| surface->TakeCopyOutputRequests(©_requests);
|
|
|
| - const RenderPassList& source_pass_list = frame.render_pass_list;
|
| + const RenderPassList& source_pass_list = frame_data->render_pass_list;
|
| DCHECK(valid_surfaces_.count(surface->surface_id()));
|
| if (!valid_surfaces_.count(surface->surface_id()))
|
| return;
|
| @@ -553,21 +555,23 @@ gfx::Rect SurfaceAggregator::PrewalkTree(const SurfaceId& surface_id,
|
| return gfx::Rect();
|
| }
|
| contained_surfaces_[surface_id] = surface->frame_index();
|
| - if (!surface->HasFrame())
|
| + const CompositorFrame& surface_frame = surface->GetEligibleFrame();
|
| + const DelegatedFrameData* frame_data =
|
| + surface_frame.delegated_frame_data.get();
|
| + if (!frame_data)
|
| return gfx::Rect();
|
| - const CompositorFrame& frame = surface->GetEligibleFrame();
|
| int child_id = 0;
|
| // TODO(jbauman): hack for unit tests that don't set up rp
|
| if (provider_) {
|
| child_id = ChildIdForSurface(surface);
|
| if (surface->factory())
|
| - surface->factory()->RefResources(frame.resource_list);
|
| - provider_->ReceiveFromChild(child_id, frame.resource_list);
|
| + surface->factory()->RefResources(frame_data->resource_list);
|
| + provider_->ReceiveFromChild(child_id, frame_data->resource_list);
|
| }
|
| CHECK(debug_weak_this.get());
|
|
|
| ResourceProvider::ResourceIdSet referenced_resources;
|
| - size_t reserve_size = frame.resource_list.size();
|
| + size_t reserve_size = frame_data->resource_list.size();
|
| referenced_resources.reserve(reserve_size);
|
|
|
| bool invalid_frame = false;
|
| @@ -576,9 +580,9 @@ gfx::Rect SurfaceAggregator::PrewalkTree(const SurfaceId& surface_id,
|
| provider_ ? provider_->GetChildToParentMap(child_id) : empty_map;
|
|
|
| CHECK(debug_weak_this.get());
|
| - if (!frame.render_pass_list.empty()) {
|
| + if (!frame_data->render_pass_list.empty()) {
|
| RenderPassId remapped_pass_id =
|
| - RemapPassId(frame.render_pass_list.back()->id, surface_id);
|
| + RemapPassId(frame_data->render_pass_list.back()->id, surface_id);
|
| if (in_moved_pixel_pass)
|
| moved_pixel_passes_.insert(remapped_pass_id);
|
| if (parent_pass.IsValid())
|
| @@ -593,7 +597,7 @@ gfx::Rect SurfaceAggregator::PrewalkTree(const SurfaceId& surface_id,
|
| };
|
| std::vector<SurfaceInfo> child_surfaces;
|
|
|
| - for (const auto& render_pass : base::Reversed(frame.render_pass_list)) {
|
| + for (const auto& render_pass : base::Reversed(frame_data->render_pass_list)) {
|
| RenderPassId remapped_pass_id = RemapPassId(render_pass->id, surface_id);
|
| bool in_moved_pixel_pass = !!moved_pixel_passes_.count(remapped_pass_id);
|
| for (auto* quad : render_pass->quad_list) {
|
| @@ -644,8 +648,8 @@ gfx::Rect SurfaceAggregator::PrewalkTree(const SurfaceId& surface_id,
|
|
|
| gfx::Rect damage_rect;
|
| gfx::Rect full_damage;
|
| - if (!frame.render_pass_list.empty()) {
|
| - RenderPass* last_pass = frame.render_pass_list.back().get();
|
| + if (!frame_data->render_pass_list.empty()) {
|
| + RenderPass* last_pass = frame_data->render_pass_list.back().get();
|
| full_damage = last_pass->output_rect;
|
| damage_rect =
|
| DamageRectForSurface(surface, *last_pass, last_pass->output_rect);
|
| @@ -673,7 +677,7 @@ gfx::Rect SurfaceAggregator::PrewalkTree(const SurfaceId& surface_id,
|
| }
|
|
|
| CHECK(debug_weak_this.get());
|
| - for (const auto& surface_id : frame.metadata.referenced_surfaces) {
|
| + for (const auto& surface_id : surface_frame.metadata.referenced_surfaces) {
|
| if (!contained_surfaces_.count(surface_id)) {
|
| result->undrawn_surfaces.insert(surface_id);
|
| PrewalkTree(surface_id, false, RenderPassId(), result);
|
| @@ -687,7 +691,7 @@ gfx::Rect SurfaceAggregator::PrewalkTree(const SurfaceId& surface_id,
|
| }
|
|
|
| CHECK(debug_weak_this.get());
|
| - for (const auto& render_pass : frame.render_pass_list) {
|
| + for (const auto& render_pass : frame_data->render_pass_list) {
|
| if (!render_pass->copy_requests.empty()) {
|
| RenderPassId remapped_pass_id = RemapPassId(render_pass->id, surface_id);
|
| copy_request_passes_.insert(remapped_pass_id);
|
| @@ -695,7 +699,7 @@ gfx::Rect SurfaceAggregator::PrewalkTree(const SurfaceId& surface_id,
|
| }
|
|
|
| referenced_surfaces_.erase(it);
|
| - if (!damage_rect.IsEmpty() && frame.metadata.may_contain_video)
|
| + if (!damage_rect.IsEmpty() && surface_frame.metadata.may_contain_video)
|
| result->may_contain_video = true;
|
| return damage_rect;
|
| }
|
| @@ -714,18 +718,19 @@ void SurfaceAggregator::CopyUndrawnSurfaces(PrewalkResult* prewalk_result) {
|
| Surface* surface = manager_->GetSurfaceForId(surface_id);
|
| if (!surface)
|
| continue;
|
| - if (!surface->HasFrame())
|
| + const CompositorFrame& surface_frame = surface->GetEligibleFrame();
|
| + if (!surface_frame.delegated_frame_data)
|
| continue;
|
| - const CompositorFrame& frame = surface->GetEligibleFrame();
|
| bool surface_has_copy_requests = false;
|
| - for (const auto& render_pass : frame.render_pass_list) {
|
| + for (const auto& render_pass :
|
| + surface_frame.delegated_frame_data->render_pass_list) {
|
| surface_has_copy_requests |= !render_pass->copy_requests.empty();
|
| }
|
| if (!surface_has_copy_requests) {
|
| // Children are not necessarily included in undrawn_surfaces (because
|
| // they weren't referenced directly from a drawn surface), but may have
|
| // copy requests, so make sure to check them as well.
|
| - for (const auto& child_id : frame.metadata.referenced_surfaces) {
|
| + for (const auto& child_id : surface_frame.metadata.referenced_surfaces) {
|
| // Don't iterate over the child Surface if it was already listed as a
|
| // child of a different Surface, or in the case where there's infinite
|
| // recursion.
|
| @@ -736,7 +741,7 @@ void SurfaceAggregator::CopyUndrawnSurfaces(PrewalkResult* prewalk_result) {
|
| }
|
| } else {
|
| SurfaceSet::iterator it = referenced_surfaces_.insert(surface_id).first;
|
| - CopyPasses(frame, surface);
|
| + CopyPasses(surface_frame.delegated_frame_data.get(), surface);
|
| referenced_surfaces_.erase(it);
|
| }
|
| }
|
| @@ -763,17 +768,16 @@ CompositorFrame SurfaceAggregator::Aggregate(const SurfaceId& surface_id) {
|
| Surface* surface = manager_->GetSurfaceForId(surface_id);
|
| DCHECK(surface);
|
| contained_surfaces_[surface_id] = surface->frame_index();
|
| -
|
| - if (!surface->HasFrame())
|
| - return CompositorFrame();
|
| -
|
| const CompositorFrame& root_surface_frame = surface->GetEligibleFrame();
|
| + if (!root_surface_frame.delegated_frame_data)
|
| + return CompositorFrame();
|
| TRACE_EVENT0("cc", "SurfaceAggregator::Aggregate");
|
|
|
| CompositorFrame frame;
|
| + frame.delegated_frame_data = base::WrapUnique(new DelegatedFrameData);
|
|
|
| - dest_resource_list_ = &frame.resource_list;
|
| - dest_pass_list_ = &frame.render_pass_list;
|
| + dest_resource_list_ = &frame.delegated_frame_data->resource_list;
|
| + dest_pass_list_ = &frame.delegated_frame_data->render_pass_list;
|
|
|
| valid_surfaces_.clear();
|
| PrewalkResult prewalk_result;
|
| @@ -785,7 +789,7 @@ CompositorFrame SurfaceAggregator::Aggregate(const SurfaceId& surface_id) {
|
|
|
| CopyUndrawnSurfaces(&prewalk_result);
|
| SurfaceSet::iterator it = referenced_surfaces_.insert(surface_id).first;
|
| - CopyPasses(root_surface_frame, surface);
|
| + CopyPasses(root_surface_frame.delegated_frame_data.get(), surface);
|
| referenced_surfaces_.erase(it);
|
|
|
| moved_pixel_passes_.clear();
|
|
|