/*
* 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