• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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      */
firstName()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      */
endName()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