• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2012 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 // This file contains the definition of the IdAllocator class.
6 
7 #ifndef GPU_COMMAND_BUFFER_CLIENT_ID_ALLOCATOR_H_
8 #define GPU_COMMAND_BUFFER_CLIENT_ID_ALLOCATOR_H_
9 
10 #include <stdint.h>
11 
12 #include <set>
13 #include <utility>
14 
15 #include "base/compiler_specific.h"
16 #include "base/macros.h"
17 #include "gpu/gpu_export.h"
18 
19 namespace gpu {
20 
21 // A resource ID, key to the resource maps.
22 typedef uint32_t ResourceId;
23 // Invalid resource ID.
24 static const ResourceId kInvalidResource = 0u;
25 
26 class GPU_EXPORT IdAllocatorInterface {
27  public:
28   virtual ~IdAllocatorInterface();
29 
30   // Allocates a new resource ID.
31   virtual ResourceId AllocateID() = 0;
32 
33   // Allocates an Id starting at or above desired_id.
34   // Note: may wrap if it starts near limit.
35   virtual ResourceId AllocateIDAtOrAbove(ResourceId desired_id) = 0;
36 
37   // Marks an id as used. Returns false if id was already used.
38   virtual bool MarkAsUsed(ResourceId id) = 0;
39 
40   // Frees a resource ID.
41   virtual void FreeID(ResourceId id) = 0;
42 
43   // Checks whether or not a resource ID is in use.
44   virtual bool InUse(ResourceId id) const = 0;
45 };
46 
47 // A class to manage the allocation of resource IDs.
48 class GPU_EXPORT IdAllocator : public IdAllocatorInterface {
49  public:
50   IdAllocator();
51   virtual ~IdAllocator();
52 
53   // Implement IdAllocatorInterface.
54   virtual ResourceId AllocateID() OVERRIDE;
55   virtual ResourceId AllocateIDAtOrAbove(ResourceId desired_id) OVERRIDE;
56   virtual bool MarkAsUsed(ResourceId id) OVERRIDE;
57   virtual void FreeID(ResourceId id) OVERRIDE;
58   virtual bool InUse(ResourceId id) const OVERRIDE;
59 
60  private:
61   // TODO(gman): This would work much better with ranges or a hash table.
62   typedef std::set<ResourceId> ResourceIdSet;
63 
64   // The highest ID on the used list.
65   ResourceId LastUsedId() const;
66 
67   // Lowest ID that isn't on the used list. This is slow, use as a last resort.
68   ResourceId FindFirstUnusedId() const;
69 
70   ResourceIdSet used_ids_;
71   ResourceIdSet free_ids_;
72 
73   DISALLOW_COPY_AND_ASSIGN(IdAllocator);
74 };
75 
76 // A class to manage the allocation of resource IDs that are never reused. This
77 // implementation does not track which IDs are currently used. It is useful for
78 // shared and programs which cannot be implicitly created by binding a
79 // previously unused ID.
80 class NonReusedIdAllocator : public IdAllocatorInterface {
81  public:
82   NonReusedIdAllocator();
83   virtual ~NonReusedIdAllocator();
84 
85   // Implement IdAllocatorInterface.
86   virtual ResourceId AllocateID() OVERRIDE;
87   virtual ResourceId AllocateIDAtOrAbove(ResourceId desired_id) OVERRIDE;
88   virtual bool MarkAsUsed(ResourceId id) OVERRIDE;
89   virtual void FreeID(ResourceId id) OVERRIDE;
90   virtual bool InUse(ResourceId id) const OVERRIDE;
91 
92  private:
93   ResourceId last_id_;
94 
95   DISALLOW_COPY_AND_ASSIGN(NonReusedIdAllocator);
96 };
97 
98 }  // namespace gpu
99 
100 #endif  // GPU_COMMAND_BUFFER_CLIENT_ID_ALLOCATOR_H_
101