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