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
19namespace gpu {
20
21// A resource ID, key to the resource maps.
22typedef uint32_t ResourceId;
23// Invalid resource ID.
24static const ResourceId kInvalidResource = 0u;
25
26class 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.
48class 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.
80class 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