Home | History | Annotate | Download | only in common
      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