15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// found in the LICENSE file. 45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "cc/surfaces/surface.h" 65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "cc/output/compositor_frame.h" 81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "cc/output/copy_output_request.h" 9116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "cc/surfaces/surface_factory.h" 105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace cc { 125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// The frame index starts at 2 so that empty frames will be treated as 141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// completely damaged the first time they're drawn from. 151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic const int kFrameIndexStart = 2; 161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 17116680a4aac90f2aa7413d9095a592090648e557Ben MurdochSurface::Surface(SurfaceId id, const gfx::Size& size, SurfaceFactory* factory) 181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci : surface_id_(id), 191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci size_(size), 201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci factory_(factory), 211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci frame_index_(kFrameIndexStart) { 225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)Surface::~Surface() { 251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (ScopedPtrVector<CopyOutputRequest>::iterator it = copy_requests_.begin(); 261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci it != copy_requests_.end(); 271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ++it) { 281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci (*it)->SendEmptyResult(); 291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci copy_requests_.clear(); 31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (current_frame_) { 32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ReturnedResourceArray current_resources; 33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch TransferableResource::ReturnResources( 34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch current_frame_->delegated_frame_data->resource_list, 35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ¤t_resources); 36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch factory_->UnrefResources(current_resources); 37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid Surface::QueueFrame(scoped_ptr<CompositorFrame> frame, 411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const base::Closure& callback) { 421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (ScopedPtrVector<CopyOutputRequest>::iterator it = copy_requests_.begin(); 431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci it != copy_requests_.end(); 441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ++it) { 451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci (*it)->SendEmptyResult(); 461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci copy_requests_.clear(); 481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TakeLatencyInfo(&frame->metadata.latency_info); 50f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) scoped_ptr<CompositorFrame> previous_frame = current_frame_.Pass(); 515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) current_frame_ = frame.Pass(); 52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch factory_->ReceiveFromChild( 53f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) current_frame_->delegated_frame_data->resource_list); 541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ++frame_index_; 55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 56f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (previous_frame) { 57f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ReturnedResourceArray previous_resources; 58f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) TransferableResource::ReturnResources( 59f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) previous_frame->delegated_frame_data->resource_list, 60f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) &previous_resources); 61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch factory_->UnrefResources(previous_resources); 62f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!draw_callback_.is_null()) 641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci draw_callback_.Run(); 651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci draw_callback_ = callback; 661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid Surface::RequestCopyOfOutput(scoped_ptr<CopyOutputRequest> copy_request) { 691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci copy_requests_.push_back(copy_request.Pass()); 701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid Surface::TakeCopyOutputRequests( 731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ScopedPtrVector<CopyOutputRequest>* copy_requests) { 741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(copy_requests->empty()); 751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci copy_requests->swap(copy_requests_); 765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)const CompositorFrame* Surface::GetEligibleFrame() { 795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return current_frame_.get(); 805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid Surface::TakeLatencyInfo(std::vector<ui::LatencyInfo>* latency_info) { 831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!current_frame_) 841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return; 851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (latency_info->empty()) { 861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci current_frame_->metadata.latency_info.swap(*latency_info); 871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return; 881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::copy(current_frame_->metadata.latency_info.begin(), 901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci current_frame_->metadata.latency_info.end(), 911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::back_inserter(*latency_info)); 921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci current_frame_->metadata.latency_info.clear(); 931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid Surface::RunDrawCallbacks() { 961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!draw_callback_.is_null()) { 971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::Closure callback = draw_callback_; 981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci draw_callback_ = base::Closure(); 991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci callback.Run(); 1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace cc 104