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