1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Copyright 2014 The Chromium Authors. All rights reserved. 2116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// found in the LICENSE file. 4116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "cc/surfaces/surface_factory.h" 6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 7116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "cc/output/compositor_frame.h" 81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "cc/output/copy_output_request.h" 9116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "cc/surfaces/surface.h" 10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "cc/surfaces/surface_manager.h" 11116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/gfx/geometry/size.h" 12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 13116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace cc { 14116680a4aac90f2aa7413d9095a592090648e557Ben MurdochSurfaceFactory::SurfaceFactory(SurfaceManager* manager, 15116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SurfaceFactoryClient* client) 16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch : manager_(manager), client_(client), holder_(client) { 17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 19116680a4aac90f2aa7413d9095a592090648e557Ben MurdochSurfaceFactory::~SurfaceFactory() { 20116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 22116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid SurfaceFactory::Create(SurfaceId surface_id, const gfx::Size& size) { 23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<Surface> surface(new Surface(surface_id, size, this)); 24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch manager_->RegisterSurface(surface.get()); 25116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK(!surface_map_.count(surface_id)); 26116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch surface_map_.add(surface_id, surface.Pass()); 27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 28116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 29116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid SurfaceFactory::Destroy(SurfaceId surface_id) { 30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch OwningSurfaceMap::iterator it = surface_map_.find(surface_id); 31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK(it != surface_map_.end()); 32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK(it->second->factory() == this); 33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch manager_->DeregisterSurface(surface_id); 34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch surface_map_.erase(it); 35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 37116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid SurfaceFactory::SubmitFrame(SurfaceId surface_id, 381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<CompositorFrame> frame, 391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const base::Closure& callback) { 40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch OwningSurfaceMap::iterator it = surface_map_.find(surface_id); 41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK(it != surface_map_.end()); 42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK(it->second->factory() == this); 431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci it->second->QueueFrame(frame.Pass(), callback); 441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci manager_->SurfaceModified(surface_id); 451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid SurfaceFactory::RequestCopyOfSurface( 481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SurfaceId surface_id, 491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<CopyOutputRequest> copy_request) { 501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci OwningSurfaceMap::iterator it = surface_map_.find(surface_id); 511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (it == surface_map_.end()) { 521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci copy_request->SendEmptyResult(); 531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return; 541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(it->second->factory() == this); 561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci it->second->RequestCopyOfOutput(copy_request.Pass()); 5703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) manager_->SurfaceModified(surface_id); 58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 60116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid SurfaceFactory::ReceiveFromChild( 61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const TransferableResourceArray& resources) { 62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch holder_.ReceiveFromChild(resources); 63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 65116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid SurfaceFactory::RefResources(const TransferableResourceArray& resources) { 66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch holder_.RefResources(resources); 67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 69116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid SurfaceFactory::UnrefResources(const ReturnedResourceArray& resources) { 70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch holder_.UnrefResources(resources); 71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 72116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} // namespace cc 74