blob: afc0b8133df15b8d9a22e59d5727e9a567942ce9 [file] [log] [blame]
James Robinson646469d2014-10-03 15:33:28 -07001// 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#ifndef CC_SURFACES_SURFACE_FACTORY_H_
6#define CC_SURFACES_SURFACE_FACTORY_H_
7
James Robinson74f9f1f2014-11-04 11:17:49 -08008#include <set>
9
James Robinson646469d2014-10-03 15:33:28 -070010#include "base/callback_forward.h"
11#include "base/containers/scoped_ptr_hash_map.h"
12#include "base/memory/scoped_ptr.h"
13#include "base/memory/weak_ptr.h"
14#include "cc/surfaces/surface_id.h"
15#include "cc/surfaces/surface_resource_holder.h"
James Robinsone2ac7e82014-10-15 13:21:59 -070016#include "cc/surfaces/surface_sequence.h"
James Robinson646469d2014-10-03 15:33:28 -070017#include "cc/surfaces/surfaces_export.h"
18
19namespace gfx {
20class Size;
21}
22
23namespace cc {
24class CompositorFrame;
25class CopyOutputRequest;
26class Surface;
27class SurfaceFactoryClient;
28class SurfaceManager;
29
Elliot Glayshereae49292015-01-28 10:47:32 -080030enum class SurfaceDrawStatus { DRAW_SKIPPED, DRAWN };
31
James Robinson646469d2014-10-03 15:33:28 -070032// A SurfaceFactory is used to create surfaces that may share resources and
33// receive returned resources for frames submitted to those surfaces. Resources
34// submitted to frames created by a particular factory will be returned to that
35// factory's client when they are no longer being used. This is the only class
36// most users of surfaces will need to directly interact with.
37class CC_SURFACES_EXPORT SurfaceFactory
38 : public base::SupportsWeakPtr<SurfaceFactory> {
39 public:
Elliot Glayshereae49292015-01-28 10:47:32 -080040 using DrawCallback = base::Callback<void(SurfaceDrawStatus)>;
Etienne Membrivesb1556b32014-12-16 13:56:09 +010041
James Robinson646469d2014-10-03 15:33:28 -070042 SurfaceFactory(SurfaceManager* manager, SurfaceFactoryClient* client);
43 ~SurfaceFactory();
44
James Robinson6a64b812014-12-03 13:38:42 -080045 void Create(SurfaceId surface_id);
James Robinson646469d2014-10-03 15:33:28 -070046 void Destroy(SurfaceId surface_id);
James Robinson74f9f1f2014-11-04 11:17:49 -080047 void DestroyAll();
James Robinson646469d2014-10-03 15:33:28 -070048 // A frame can only be submitted to a surface created by this factory,
49 // although the frame may reference surfaces created by other factories.
Etienne Membrivesb1556b32014-12-16 13:56:09 +010050 // The callback is called the first time this frame is used to draw, or if
51 // the frame is discarded.
James Robinson646469d2014-10-03 15:33:28 -070052 void SubmitFrame(SurfaceId surface_id,
53 scoped_ptr<CompositorFrame> frame,
Etienne Membrivesb1556b32014-12-16 13:56:09 +010054 const DrawCallback& callback);
James Robinson646469d2014-10-03 15:33:28 -070055 void RequestCopyOfSurface(SurfaceId surface_id,
56 scoped_ptr<CopyOutputRequest> copy_request);
57
58 SurfaceFactoryClient* client() { return client_; }
59
60 void ReceiveFromChild(const TransferableResourceArray& resources);
61 void RefResources(const TransferableResourceArray& resources);
62 void UnrefResources(const ReturnedResourceArray& resources);
63
James Robinsone2ac7e82014-10-15 13:21:59 -070064 SurfaceManager* manager() { return manager_; }
65
James Robinson646469d2014-10-03 15:33:28 -070066 private:
67 SurfaceManager* manager_;
68 SurfaceFactoryClient* client_;
69 SurfaceResourceHolder holder_;
70
James Robinsonf19b1022015-05-05 18:12:15 -070071 typedef base::ScopedPtrHashMap<SurfaceId, scoped_ptr<Surface>> OwningSurfaceMap;
72 OwningSurfaceMap surface_map_;
James Robinson646469d2014-10-03 15:33:28 -070073
74 DISALLOW_COPY_AND_ASSIGN(SurfaceFactory);
75};
76
77} // namespace cc
78
79#endif // CC_SURFACES_SURFACE_FACTORY_H_