1// Copyright 2014 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "cc/surfaces/surface_factory.h" 6 7#include "cc/output/compositor_frame.h" 8#include "cc/output/copy_output_request.h" 9#include "cc/surfaces/surface.h" 10#include "cc/surfaces/surface_manager.h" 11#include "ui/gfx/geometry/size.h" 12 13namespace cc { 14SurfaceFactory::SurfaceFactory(SurfaceManager* manager, 15 SurfaceFactoryClient* client) 16 : manager_(manager), client_(client), holder_(client) { 17} 18 19SurfaceFactory::~SurfaceFactory() { 20} 21 22void SurfaceFactory::Create(SurfaceId surface_id, const gfx::Size& size) { 23 scoped_ptr<Surface> surface(new Surface(surface_id, size, this)); 24 manager_->RegisterSurface(surface.get()); 25 DCHECK(!surface_map_.count(surface_id)); 26 surface_map_.add(surface_id, surface.Pass()); 27} 28 29void SurfaceFactory::Destroy(SurfaceId surface_id) { 30 OwningSurfaceMap::iterator it = surface_map_.find(surface_id); 31 DCHECK(it != surface_map_.end()); 32 DCHECK(it->second->factory() == this); 33 manager_->DeregisterSurface(surface_id); 34 surface_map_.erase(it); 35} 36 37void SurfaceFactory::SubmitFrame(SurfaceId surface_id, 38 scoped_ptr<CompositorFrame> frame, 39 const base::Closure& callback) { 40 OwningSurfaceMap::iterator it = surface_map_.find(surface_id); 41 DCHECK(it != surface_map_.end()); 42 DCHECK(it->second->factory() == this); 43 it->second->QueueFrame(frame.Pass(), callback); 44 manager_->SurfaceModified(surface_id); 45} 46 47void SurfaceFactory::RequestCopyOfSurface( 48 SurfaceId surface_id, 49 scoped_ptr<CopyOutputRequest> copy_request) { 50 OwningSurfaceMap::iterator it = surface_map_.find(surface_id); 51 if (it == surface_map_.end()) { 52 copy_request->SendEmptyResult(); 53 return; 54 } 55 DCHECK(it->second->factory() == this); 56 it->second->RequestCopyOfOutput(copy_request.Pass()); 57 manager_->SurfaceModified(surface_id); 58} 59 60void SurfaceFactory::ReceiveFromChild( 61 const TransferableResourceArray& resources) { 62 holder_.ReceiveFromChild(resources); 63} 64 65void SurfaceFactory::RefResources(const TransferableResourceArray& resources) { 66 holder_.RefResources(resources); 67} 68 69void SurfaceFactory::UnrefResources(const ReturnedResourceArray& resources) { 70 holder_.UnrefResources(resources); 71} 72 73} // namespace cc 74