delegated_frame_resource_collection.h revision 8bcbed890bc3ce4d7a057a8f32cab53fa534672e
1// Copyright 2013 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_LAYERS_DELEGATED_FRAME_RESOURCE_COLLECTION_H_
6#define CC_LAYERS_DELEGATED_FRAME_RESOURCE_COLLECTION_H_
7
8#include "base/containers/hash_tables.h"
9#include "base/memory/ref_counted.h"
10#include "base/threading/thread_checker.h"
11#include "cc/base/cc_export.h"
12#include "cc/resources/return_callback.h"
13#include "cc/resources/returned_resource.h"
14#include "cc/resources/transferable_resource.h"
15
16namespace cc {
17class BlockingTaskRunner;
18
19class CC_EXPORT DelegatedFrameResourceCollectionClient {
20 public:
21  // Called to inform the client that returned resources can be
22  // grabbed off the DelegatedFrameResourceCollection.
23  virtual void UnusedResourcesAreAvailable() = 0;
24};
25
26class CC_EXPORT DelegatedFrameResourceCollection
27    : public base::RefCounted<DelegatedFrameResourceCollection> {
28 public:
29  DelegatedFrameResourceCollection();
30
31  void SetClient(DelegatedFrameResourceCollectionClient* client);
32
33  void TakeUnusedResourcesForChildCompositor(ReturnedResourceArray* array);
34
35  // Considers all resources as lost, and returns true if it held any resource
36  // to lose.
37  bool LoseAllResources();
38
39  // Methods for DelegatedFrameProvider.
40  void RefResources(const TransferableResourceArray& resources);
41  void UnrefResources(const ReturnedResourceArray& returned);
42  void ReceivedResources(const TransferableResourceArray& resources);
43  ReturnCallback GetReturnResourcesCallbackForImplThread();
44
45 private:
46  friend class base::RefCounted<DelegatedFrameResourceCollection>;
47  ~DelegatedFrameResourceCollection();
48
49  void UnrefResourcesOnImplThread(
50      scoped_refptr<BlockingTaskRunner> main_thread_runner,
51      const ReturnedResourceArray& returned);
52
53  DelegatedFrameResourceCollectionClient* client_;
54  scoped_refptr<BlockingTaskRunner> main_thread_runner_;
55
56  ReturnedResourceArray returned_resources_for_child_compositor_;
57  bool lost_all_resources_;
58
59  struct RefCount {
60    int refs_to_return;
61    int refs_to_wait_for;
62  };
63  typedef base::hash_map<unsigned, RefCount> ResourceIdRefCountMap;
64  ResourceIdRefCountMap resource_id_ref_count_map_;
65
66  base::ThreadChecker main_thread_checker_;
67
68  DISALLOW_COPY_AND_ASSIGN(DelegatedFrameResourceCollection);
69};
70
71}  // namespace cc
72
73#endif  // CC_LAYERS_DELEGATED_FRAME_RESOURCE_COLLECTION_H_
74