Chromium Code Reviews| 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" |
| + |
| +/** |
|
bsalomon
2014/06/09 13:52:21
Nice dox in this class, thanks!
|
| + * 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 |