Updating trunk VERSION from 2139.0 to 2140.0
[chromium-blink-merge.git] / gpu / command_buffer / common / id_allocator.h
blob3f2dc4a65e295c2b3e4d42ab9633c366c6de0b43
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.
5 // This file contains the definition of the IdAllocator class.
7 #ifndef GPU_COMMAND_BUFFER_CLIENT_ID_ALLOCATOR_H_
8 #define GPU_COMMAND_BUFFER_CLIENT_ID_ALLOCATOR_H_
10 #include <stdint.h>
12 #include <set>
13 #include <utility>
15 #include "base/compiler_specific.h"
16 #include "base/macros.h"
17 #include "gpu/gpu_export.h"
19 namespace gpu {
21 // A resource ID, key to the resource maps.
22 typedef uint32_t ResourceId;
23 // Invalid resource ID.
24 static const ResourceId kInvalidResource = 0u;
26 class GPU_EXPORT IdAllocatorInterface {
27 public:
28 virtual ~IdAllocatorInterface();
30 // Allocates a new resource ID.
31 virtual ResourceId AllocateID() = 0;
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;
37 // Marks an id as used. Returns false if id was already used.
38 virtual bool MarkAsUsed(ResourceId id) = 0;
40 // Frees a resource ID.
41 virtual void FreeID(ResourceId id) = 0;
43 // Checks whether or not a resource ID is in use.
44 virtual bool InUse(ResourceId id) const = 0;
47 // A class to manage the allocation of resource IDs.
48 class GPU_EXPORT IdAllocator : public IdAllocatorInterface {
49 public:
50 IdAllocator();
51 virtual ~IdAllocator();
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;
60 private:
61 // TODO(gman): This would work much better with ranges or a hash table.
62 typedef std::set<ResourceId> ResourceIdSet;
64 // The highest ID on the used list.
65 ResourceId LastUsedId() const;
67 // Lowest ID that isn't on the used list. This is slow, use as a last resort.
68 ResourceId FindFirstUnusedId() const;
70 ResourceIdSet used_ids_;
71 ResourceIdSet free_ids_;
73 DISALLOW_COPY_AND_ASSIGN(IdAllocator);
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();
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;
92 private:
93 ResourceId last_id_;
95 DISALLOW_COPY_AND_ASSIGN(NonReusedIdAllocator);
98 } // namespace gpu
100 #endif // GPU_COMMAND_BUFFER_CLIENT_ID_ALLOCATOR_H_