Home | History | Annotate | Download | only in gl
      1 
      2 /*
      3  * Copyright 2014 Google Inc.
      4  *
      5  * Use of this source code is governed by a BSD-style license that can be
      6  * found in the LICENSE file.
      7  */
      8 
      9 #ifndef GrGLNameAllocator_DEFINED
     10 #define GrGLNameAllocator_DEFINED
     11 
     12 #include "SkRefCnt.h"
     13 #include "gl/GrGLFunctions.h"
     14 
     15 /**
     16  * This class assumes ownership of an explicit range of OpenGL object names and
     17  * manages allocations within that range. This allows the app to generate new
     18  * objects on the client side without making round trips to the GL server.
     19  */
     20 class GrGLNameAllocator {
     21 public:
     22     /**
     23      * Constructs a name allocator that produces names within the explicit
     24      * half-open range [firstName, end). Note that the caller will most likely
     25      * need to call glGen* beforehand to reserve a range within the GL driver,
     26      * and then invoke this constructor with that range.
     27      *
     28      * @param firstName The first name in the range owned by this class. Must be
     29                         greater than zero.
     30      * @param endName   The first past-the-end name beyond the range owned by
     31                         this class. Must be >= firstName.
     32      */
     33     GrGLNameAllocator(GrGLuint firstName, GrGLuint endName);
     34 
     35     /**
     36      * Destructs the name allocator. The caller is responsible for calling the
     37      * appropriate glDelete* on the range if necessary.
     38      */
     39     ~GrGLNameAllocator();
     40 
     41     /**
     42      * Return the beginning of this class's range.
     43      *
     44      * @return The first name in the range owned by this class.
     45      */
     46     GrGLuint firstName() const { return fFirstName; }
     47 
     48     /**
     49      * Return the end of this class's range. Note that endName() is not owned by
     50      * this class.
     51      *
     52      * @return One plus the final name in the range owned by this class.
     53      */
     54     GrGLuint endName() const { return fEndName; }
     55 
     56     /**
     57      * Allocate an OpenGL object name from within this class's range.
     58      *
     59      * @return The name if one was available,
     60                0 if all the names in the range were already in use.
     61      */
     62     GrGLuint allocateName();
     63 
     64     /**
     65      * Free an OpenGL object name, allowing it to be returned by a future call
     66      * to allocateName(). Note that the caller should most likely redefine the
     67      * object as empty to deallocate any underlying GPU memory before calling
     68      * this method (but not call glDelete*, since that would free up the name
     69      * within the driver itself).
     70      *
     71      * @param name The object name to free. Not-allocated names are silently
     72      *             ignored the same way they are in the OpenGL spec.
     73      */
     74     void free(GrGLuint name);
     75 
     76 private:
     77     class SparseNameRange;
     78     class SparseNameTree;
     79     class ContiguousNameRange;
     80 
     81     const GrGLuint fFirstName;
     82     const GrGLuint fEndName;
     83     SkAutoTUnref<SparseNameRange> fAllocatedNames;
     84 };
     85 
     86 #endif
     87