| Index: cc/surfaces/surface.cc
|
| diff --git a/cc/surfaces/surface.cc b/cc/surfaces/surface.cc
|
| index 706b6738fe8b7caa04b06d035f3ea8c5470590c3..ed99a1b018b0d061746f520227ad76db349a534e 100644
|
| --- a/cc/surfaces/surface.cc
|
| +++ b/cc/surfaces/surface.cc
|
| @@ -31,8 +31,8 @@
|
|
|
| Surface::~Surface() {
|
| ClearCopyRequests();
|
| - if (current_frame_.delegated_frame_data && factory_) {
|
| - UnrefFrameResources(current_frame_.delegated_frame_data.get());
|
| + if (current_frame_ && factory_) {
|
| + UnrefFrameResources(current_frame_->delegated_frame_data.get());
|
| }
|
| if (!draw_callback_.is_null())
|
| draw_callback_.Run(SurfaceDrawStatus::DRAW_SKIPPED);
|
| @@ -51,37 +51,39 @@
|
| gpu_memory_buffer_client_id_ = gpu_memory_buffer_client_id;
|
| }
|
|
|
| -void Surface::QueueFrame(CompositorFrame frame, const DrawCallback& callback) {
|
| +void Surface::QueueFrame(std::unique_ptr<CompositorFrame> frame,
|
| + const DrawCallback& callback) {
|
| DCHECK(factory_);
|
| ClearCopyRequests();
|
|
|
| - if (frame.delegated_frame_data) {
|
| - TakeLatencyInfo(&frame.metadata.latency_info);
|
| - }
|
| -
|
| - CompositorFrame previous_frame = std::move(current_frame_);
|
| + if (frame) {
|
| + TakeLatencyInfo(&frame->metadata.latency_info);
|
| + }
|
| +
|
| + std::unique_ptr<CompositorFrame> previous_frame = std::move(current_frame_);
|
| current_frame_ = std::move(frame);
|
|
|
| - if (current_frame_.delegated_frame_data) {
|
| + if (current_frame_) {
|
| factory_->ReceiveFromChild(
|
| - current_frame_.delegated_frame_data->resource_list);
|
| + current_frame_->delegated_frame_data->resource_list);
|
| }
|
|
|
| // Empty frames shouldn't be drawn and shouldn't contribute damage, so don't
|
| // increment frame index for them.
|
| - if (current_frame_.delegated_frame_data &&
|
| - !current_frame_.delegated_frame_data->render_pass_list.empty()) {
|
| + if (current_frame_ &&
|
| + !current_frame_->delegated_frame_data->render_pass_list.empty())
|
| ++frame_index_;
|
| - }
|
|
|
| previous_frame_surface_id_ = surface_id();
|
|
|
| std::vector<SurfaceId> new_referenced_surfaces;
|
| - new_referenced_surfaces = current_frame_.metadata.referenced_surfaces;
|
| -
|
| - if (previous_frame.delegated_frame_data)
|
| - UnrefFrameResources(previous_frame.delegated_frame_data.get());
|
| -
|
| + if (current_frame_) {
|
| + new_referenced_surfaces = current_frame_->metadata.referenced_surfaces;
|
| + }
|
| +
|
| + if (previous_frame) {
|
| + UnrefFrameResources(previous_frame->delegated_frame_data.get());
|
| + }
|
| if (!draw_callback_.is_null())
|
| draw_callback_.Run(SurfaceDrawStatus::DRAW_SKIPPED);
|
| draw_callback_ = callback;
|
| @@ -89,9 +91,9 @@
|
| bool referenced_surfaces_changed =
|
| (referenced_surfaces_ != new_referenced_surfaces);
|
| referenced_surfaces_ = new_referenced_surfaces;
|
| - std::vector<uint32_t> satisfies_sequences =
|
| - std::move(current_frame_.metadata.satisfies_sequences);
|
| -
|
| + std::vector<uint32_t> satisfies_sequences;
|
| + if (current_frame_)
|
| + current_frame_->metadata.satisfies_sequences.swap(satisfies_sequences);
|
| if (referenced_surfaces_changed || !satisfies_sequences.empty()) {
|
| // Notify the manager that sequences were satisfied either if some new
|
| // sequences were satisfied, or if the set of referenced surfaces changed
|
| @@ -103,10 +105,10 @@
|
|
|
| void Surface::RequestCopyOfOutput(
|
| std::unique_ptr<CopyOutputRequest> copy_request) {
|
| - if (current_frame_.delegated_frame_data &&
|
| - !current_frame_.delegated_frame_data->render_pass_list.empty()) {
|
| + if (current_frame_ &&
|
| + !current_frame_->delegated_frame_data->render_pass_list.empty()) {
|
| std::vector<std::unique_ptr<CopyOutputRequest>>& copy_requests =
|
| - current_frame_.delegated_frame_data->render_pass_list.back()
|
| + current_frame_->delegated_frame_data->render_pass_list.back()
|
| ->copy_requests;
|
|
|
| if (void* source = copy_request->source()) {
|
| @@ -129,9 +131,9 @@
|
| std::multimap<RenderPassId, std::unique_ptr<CopyOutputRequest>>*
|
| copy_requests) {
|
| DCHECK(copy_requests->empty());
|
| - if (current_frame_.delegated_frame_data) {
|
| + if (current_frame_) {
|
| for (const auto& render_pass :
|
| - current_frame_.delegated_frame_data->render_pass_list) {
|
| + current_frame_->delegated_frame_data->render_pass_list) {
|
| for (auto& request : render_pass->copy_requests) {
|
| copy_requests->insert(
|
| std::make_pair(render_pass->id, std::move(request)));
|
| @@ -141,21 +143,21 @@
|
| }
|
| }
|
|
|
| -const CompositorFrame& Surface::GetEligibleFrame() {
|
| - return current_frame_;
|
| +const CompositorFrame* Surface::GetEligibleFrame() {
|
| + return current_frame_.get();
|
| }
|
|
|
| void Surface::TakeLatencyInfo(std::vector<ui::LatencyInfo>* latency_info) {
|
| - if (!current_frame_.delegated_frame_data)
|
| + if (!current_frame_)
|
| return;
|
| if (latency_info->empty()) {
|
| - current_frame_.metadata.latency_info.swap(*latency_info);
|
| + current_frame_->metadata.latency_info.swap(*latency_info);
|
| return;
|
| }
|
| - std::copy(current_frame_.metadata.latency_info.begin(),
|
| - current_frame_.metadata.latency_info.end(),
|
| + std::copy(current_frame_->metadata.latency_info.begin(),
|
| + current_frame_->metadata.latency_info.end(),
|
| std::back_inserter(*latency_info));
|
| - current_frame_.metadata.latency_info.clear();
|
| + current_frame_->metadata.latency_info.clear();
|
| }
|
|
|
| void Surface::RunDrawCallbacks(SurfaceDrawStatus drawn) {
|
| @@ -193,9 +195,9 @@
|
| }
|
|
|
| void Surface::ClearCopyRequests() {
|
| - if (current_frame_.delegated_frame_data) {
|
| + if (current_frame_) {
|
| for (const auto& render_pass :
|
| - current_frame_.delegated_frame_data->render_pass_list) {
|
| + current_frame_->delegated_frame_data->render_pass_list) {
|
| for (const auto& copy_request : render_pass->copy_requests)
|
| copy_request->SendEmptyResult();
|
| }
|
|
|