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