• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
13 namespace cc {
SurfaceFactory(SurfaceManager * manager,SurfaceFactoryClient * client)14 SurfaceFactory::SurfaceFactory(SurfaceManager* manager,
15                                SurfaceFactoryClient* client)
16     : manager_(manager), client_(client), holder_(client) {
17 }
18 
~SurfaceFactory()19 SurfaceFactory::~SurfaceFactory() {
20 }
21 
Create(SurfaceId surface_id,const gfx::Size & size)22 void 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 
Destroy(SurfaceId surface_id)29 void 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 
SubmitFrame(SurfaceId surface_id,scoped_ptr<CompositorFrame> frame,const base::Closure & callback)37 void 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 
RequestCopyOfSurface(SurfaceId surface_id,scoped_ptr<CopyOutputRequest> copy_request)47 void 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 
ReceiveFromChild(const TransferableResourceArray & resources)60 void SurfaceFactory::ReceiveFromChild(
61     const TransferableResourceArray& resources) {
62   holder_.ReceiveFromChild(resources);
63 }
64 
RefResources(const TransferableResourceArray & resources)65 void SurfaceFactory::RefResources(const TransferableResourceArray& resources) {
66   holder_.RefResources(resources);
67 }
68 
UnrefResources(const ReturnedResourceArray & resources)69 void SurfaceFactory::UnrefResources(const ReturnedResourceArray& resources) {
70   holder_.UnrefResources(resources);
71 }
72 
73 }  // namespace cc
74