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