Index: src/gpu/gl/GrGLNameAllocator.h |
diff --git a/src/gpu/gl/GrGLNameAllocator.h b/src/gpu/gl/GrGLNameAllocator.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..1c2c26e59f69e14798b0cc58bddd3c1888cad533 |
--- /dev/null |
+++ b/src/gpu/gl/GrGLNameAllocator.h |
@@ -0,0 +1,86 @@ |
+ |
+/* |
+ * Copyright 2014 Google Inc. |
+ * |
+ * Use of this source code is governed by a BSD-style license that can be |
+ * found in the LICENSE file. |
+ */ |
+ |
+#ifndef GrGLNameAllocator_DEFINED |
+#define GrGLNameAllocator_DEFINED |
+ |
+#include "SkRefCnt.h" |
+#include "gl/GrGLFunctions.h" |
+ |
+/** |
+ * This class assumes ownership of an explicit range of OpenGL object names and |
+ * manages allocations within that range. This allows the app to generate new |
+ * objects on the client side without making round trips to the GL server. |
+ */ |
+class GrGLNameAllocator { |
+public: |
+ /** |
+ * Constructs a name allocator that produces names within the explicit |
+ * half-open range [firstName, end). Note that the caller will most likely |
+ * need to call glGen* beforehand to reserve a range within the GL driver, |
+ * and then invoke this constructor with that range. |
+ * |
+ * @param firstName The first name in the range owned by this class. Must be |
+ greater than zero. |
+ * @param endName The first past-the-end name beyond the range owned by |
+ this class. Must be >= firstName. |
+ */ |
+ GrGLNameAllocator(GrGLuint firstName, GrGLuint endName); |
+ |
+ /** |
+ * Destructs the name allocator. The caller is responsible for calling the |
+ * appropriate glDelete* on the range if necessary. |
+ */ |
+ ~GrGLNameAllocator(); |
+ |
+ /** |
+ * Return the beginning of this class's range. |
+ * |
+ * @return The first name in the range owned by this class. |
+ */ |
+ GrGLuint firstName() const { return fFirstName; } |
+ |
+ /** |
+ * Return the end of this class's range. Note that endName() is not owned by |
+ * this class. |
+ * |
+ * @return One plus the final name in the range owned by this class. |
+ */ |
+ GrGLuint endName() const { return fEndName; } |
+ |
+ /** |
+ * Allocate an OpenGL object name from within this class's range. |
+ * |
+ * @return The name if one was available, |
+ 0 if all the names in the range were already in use. |
+ */ |
+ GrGLuint allocateName(); |
+ |
+ /** |
+ * Free an OpenGL object name, allowing it to be returned by a future call |
+ * to allocateName(). Note that the caller should most likely redefine the |
+ * object as empty to deallocate any underlying GPU memory before calling |
+ * this method (but not call glDelete*, since that would free up the name |
+ * within the driver itself). |
+ * |
+ * @param name The object name to free. Not-allocated names are silently |
+ * ignored the same way they are in the OpenGL spec. |
+ */ |
+ void free(GrGLuint name); |
+ |
+private: |
+ class SparseNameRange; |
+ class SparseNameTree; |
+ class ContiguousNameRange; |
+ |
+ const GrGLuint fFirstName; |
+ const GrGLuint fEndName; |
+ SkAutoTUnref<SparseNameRange> fAllocatedNames; |
+}; |
+ |
+#endif |