#define gl_NameSpace_hpp\r
\r
#include "Object.hpp"\r
+#include "debug.h"\r
\r
-#include <unordered_set>\r
-#include <algorithm>\r
-\r
-typedef unsigned int GLuint;\r
+#include <unordered_map>\r
\r
namespace gl\r
{\r
\r
template<class ObjectType, GLuint baseName = 1>\r
-class NameSpace : std::unordered_set<GLuint>\r
+class NameSpace\r
{\r
public:\r
NameSpace() : freeName(baseName)\r
{\r
}\r
\r
+ ~NameSpace()\r
+ {\r
+ ASSERT(empty());\r
+ }\r
+\r
+ bool empty()\r
+ {\r
+ return map.empty();\r
+ }\r
+\r
+ GLuint firstName()\r
+ {\r
+ return map.begin()->first;\r
+ }\r
+\r
GLuint allocate()\r
{\r
GLuint name = freeName;\r
\r
- while(find(name) != end())\r
+ while(isReserved(name))\r
{\r
name++;\r
}\r
\r
- insert(name);\r
+ map.insert({name, nullptr});\r
freeName = name + 1;\r
\r
return name;\r
}\r
\r
- void insert(GLuint name)\r
+ bool isReserved(GLuint name)\r
{\r
- std::unordered_set<GLuint>::insert(name);\r
+ return map.find(name) != map.end();\r
+ }\r
+\r
+ void insert(GLuint name, ObjectType *object)\r
+ {\r
+ map[name] = object;\r
\r
if(name == freeName)\r
{\r
}\r
}\r
\r
- void release(GLuint name)\r
+ ObjectType *remove(GLuint name)\r
+ {\r
+ auto element = map.find(name);\r
+\r
+ if(element != map.end())\r
+ {\r
+ ObjectType *object = element->second;\r
+ map.erase(element);\r
+\r
+ if(name < freeName)\r
+ {\r
+ freeName = name;\r
+ }\r
+\r
+ return object;\r
+ }\r
+\r
+ return nullptr;\r
+ }\r
+\r
+ ObjectType *find(GLuint name)\r
{\r
- erase(name);\r
- freeName = std::min(name, freeName);\r
+ if(name < baseName)\r
+ {\r
+ return nullptr;\r
+ }\r
+\r
+ auto element = map.find(name);\r
+\r
+ if(element == map.end())\r
+ {\r
+ return nullptr;\r
+ }\r
+\r
+ return element->second;\r
}\r
\r
private:\r
+ typedef std::unordered_map<GLuint, ObjectType*> Map;\r
+ Map map;\r
+\r
GLuint freeName; // Lowest known potentially free name\r
};\r
\r
{\r
detachFramebuffer(framebuffer);\r
\r
- mFramebufferNameSpace.release(framebufferObject->first);\r
- delete framebufferObject->second;\r
+ delete framebufferObject->second;\r
+ mFramebufferNameSpace.remove(framebufferObject->first);\r
mFramebufferMap.erase(framebufferObject);\r
}\r
}\r
ResourceManager::~ResourceManager()
{
- while(!mBufferMap.empty())
+ while(!mBufferNameSpace.empty())
{
- deleteBuffer(mBufferMap.begin()->first);
+ deleteBuffer(mBufferNameSpace.firstName());
}
- while(!mRenderbufferMap.empty())
+ while(!mRenderbufferNameSpace.empty())
{
- deleteRenderbuffer(mRenderbufferMap.begin()->first);
+ deleteRenderbuffer(mRenderbufferNameSpace.firstName());
}
- while(!mTextureMap.empty())
+ while(!mTextureNameSpace.empty())
{
- deleteTexture(mTextureMap.begin()->first);
+ deleteTexture(mTextureNameSpace.firstName());
}
}
// Returns an unused buffer name
GLuint ResourceManager::createBuffer()
{
- GLuint handle = mBufferNameSpace.allocate();
-
- mBufferMap[handle] = nullptr;
-
- return handle;
+ return mBufferNameSpace.allocate();
}
// Returns an unused texture name
GLuint ResourceManager::createTexture()
{
- GLuint handle = mTextureNameSpace.allocate();
-
- mTextureMap[handle] = nullptr;
-
- return handle;
+ return mTextureNameSpace.allocate();
}
// Returns an unused renderbuffer name
GLuint ResourceManager::createRenderbuffer()
{
- GLuint handle = mRenderbufferNameSpace.allocate();
-
- mRenderbufferMap[handle] = nullptr;
-
- return handle;
+ return mRenderbufferNameSpace.allocate();
}
void ResourceManager::deleteBuffer(GLuint buffer)
{
- BufferMap::iterator bufferObject = mBufferMap.find(buffer);
+ Buffer *bufferObject = mBufferNameSpace.remove(buffer);
- if(bufferObject != mBufferMap.end())
+ if(bufferObject)
{
- mBufferNameSpace.release(bufferObject->first);
- if(bufferObject->second) bufferObject->second->release();
- mBufferMap.erase(bufferObject);
+ bufferObject->release();
}
}
void ResourceManager::deleteTexture(GLuint texture)
{
- TextureMap::iterator textureObject = mTextureMap.find(texture);
+ Texture *textureObject = mTextureNameSpace.find(texture);
- if(textureObject != mTextureMap.end())
+ if(textureObject)
{
- mTextureNameSpace.release(textureObject->first);
- if(textureObject->second) textureObject->second->release();
- mTextureMap.erase(textureObject);
+ textureObject->release();
}
}
void ResourceManager::deleteRenderbuffer(GLuint renderbuffer)
{
- RenderbufferMap::iterator renderbufferObject = mRenderbufferMap.find(renderbuffer);
+ Renderbuffer *renderbufferObject = mRenderbufferNameSpace.find(renderbuffer);
- if(renderbufferObject != mRenderbufferMap.end())
+ if(renderbufferObject)
{
- mRenderbufferNameSpace.release(renderbufferObject->first);
- if(renderbufferObject->second) renderbufferObject->second->release();
- mRenderbufferMap.erase(renderbufferObject);
+ renderbufferObject->release();
}
}
Buffer *ResourceManager::getBuffer(unsigned int handle)
{
- BufferMap::iterator buffer = mBufferMap.find(handle);
-
- if(buffer == mBufferMap.end())
- {
- return nullptr;
- }
- else
- {
- return buffer->second;
- }
+ return mBufferNameSpace.find(handle);
}
Texture *ResourceManager::getTexture(unsigned int handle)
{
- if(handle == 0) return nullptr;
-
- TextureMap::iterator texture = mTextureMap.find(handle);
-
- if(texture == mTextureMap.end())
- {
- return nullptr;
- }
- else
- {
- return texture->second;
- }
+ return mTextureNameSpace.find(handle);
}
Renderbuffer *ResourceManager::getRenderbuffer(unsigned int handle)
{
- RenderbufferMap::iterator renderbuffer = mRenderbufferMap.find(handle);
-
- if(renderbuffer == mRenderbufferMap.end())
- {
- return nullptr;
- }
- else
- {
- return renderbuffer->second;
- }
-}
-
-void ResourceManager::setRenderbuffer(GLuint handle, Renderbuffer *buffer)
-{
- mRenderbufferMap[handle] = buffer;
+ return mRenderbufferNameSpace.find(handle);
}
void ResourceManager::checkBufferAllocation(unsigned int buffer)
Buffer *bufferObject = new Buffer(buffer);
bufferObject->addRef();
- mBufferNameSpace.insert(buffer);
- mBufferMap[buffer] = bufferObject;
+ mBufferNameSpace.insert(buffer, bufferObject);
}
}
textureObject->addRef();
- mTextureNameSpace.insert(texture);
- mTextureMap[texture] = textureObject;
+ mTextureNameSpace.insert(texture, textureObject);
}
}
Renderbuffer *renderbufferObject = new Renderbuffer(handle, new Colorbuffer(0, 0, GL_RGBA4_OES, 0));
renderbufferObject->addRef();
- mRenderbufferNameSpace.insert(handle);
- mRenderbufferMap[handle] = renderbufferObject;
+ mRenderbufferNameSpace.insert(handle, renderbufferObject);
}
}
Texture *getTexture(GLuint handle);\r
Renderbuffer *getRenderbuffer(GLuint handle);\r
\r
- void setRenderbuffer(GLuint handle, Renderbuffer *renderbuffer);\r
-\r
void checkBufferAllocation(unsigned int buffer);\r
void checkTextureAllocation(GLuint texture, TextureType type);\r
void checkRenderbufferAllocation(GLuint handle);\r
private:\r
std::size_t mRefCount;\r
\r
- typedef std::map<GLint, Buffer*> BufferMap;\r
- BufferMap mBufferMap;\r
gl::NameSpace<Buffer> mBufferNameSpace;\r
-\r
- typedef std::map<GLint, Texture*> TextureMap;\r
- TextureMap mTextureMap;\r
- gl::NameSpace<Texture> mTextureNameSpace;\r
-\r
- typedef std::map<GLint, Renderbuffer*> RenderbufferMap;\r
- RenderbufferMap mRenderbufferMap;\r
+ gl::NameSpace<Texture> mTextureNameSpace;\r
gl::NameSpace<Renderbuffer> mRenderbufferNameSpace;\r
};\r
\r
{\r
detachFramebuffer(framebuffer);\r
\r
- mFramebufferNameSpace.release(framebufferObject->first);\r
- delete framebufferObject->second;\r
+ delete framebufferObject->second;\r
+ mFramebufferNameSpace.remove(framebufferObject->first);\r
mFramebufferMap.erase(framebufferObject);\r
}\r
}\r
\r
if(fenceObject != mFenceMap.end())\r
{\r
- mFenceNameSpace.release(fenceObject->first);\r
- delete fenceObject->second;\r
+ delete fenceObject->second;\r
+ mFenceNameSpace.remove(fenceObject->first);\r
mFenceMap.erase(fenceObject);\r
}\r
}\r
\r
if(queryObject != mQueryMap.end())\r
{\r
- mQueryNameSpace.release(queryObject->first);\r
-\r
if(queryObject->second)\r
{\r
queryObject->second->release();\r
}\r
\r
+ mQueryNameSpace.remove(queryObject->first);\r
mQueryMap.erase(queryObject);\r
}\r
}\r
bindVertexArray(0);\r
}\r
\r
- mVertexArrayNameSpace.release(vertexArrayObject->first);\r
delete vertexArrayObject->second;\r
+ mVertexArrayNameSpace.remove(vertexArrayObject->first);\r
mVertexArrayMap.erase(vertexArrayObject);\r
}\r
}\r
\r
if(transformFeedbackObject != mTransformFeedbackMap.end())\r
{\r
- mTransformFeedbackNameSpace.release(transformFeedbackObject->first);\r
delete transformFeedbackObject->second;\r
+ mTransformFeedbackNameSpace.remove(transformFeedbackObject->first);\r
mTransformFeedbackMap.erase(transformFeedbackObject);\r
}\r
}\r
ResourceManager::~ResourceManager()
{
- while(!mBufferMap.empty())
+ while(!mBufferNameSpace.empty())
{
- deleteBuffer(mBufferMap.begin()->first);
+ deleteBuffer(mBufferNameSpace.firstName());
}
while(!mProgramMap.empty())
deleteShader(mShaderMap.begin()->first);
}
- while(!mRenderbufferMap.empty())
+ while(!mRenderbufferNameSpace.empty())
{
- deleteRenderbuffer(mRenderbufferMap.begin()->first);
+ deleteRenderbuffer(mRenderbufferNameSpace.firstName());
}
- while(!mTextureMap.empty())
+ while(!mTextureNameSpace.empty())
{
- deleteTexture(mTextureMap.begin()->first);
+ deleteTexture(mTextureNameSpace.firstName());
}
- while(!mSamplerMap.empty())
+ while(!mSamplerNameSpace.empty())
{
- deleteSampler(mSamplerMap.begin()->first);
+ deleteSampler(mSamplerNameSpace.firstName());
}
- while(!mFenceSyncMap.empty())
+ while(!mFenceSyncNameSpace.empty())
{
- deleteFenceSync(mFenceSyncMap.begin()->first);
+ deleteFenceSync(mFenceSyncNameSpace.firstName());
}
}
// Returns an unused buffer name
GLuint ResourceManager::createBuffer()
{
- GLuint handle = mBufferNameSpace.allocate();
-
- mBufferMap[handle] = nullptr;
-
- return handle;
+ return mBufferNameSpace.allocate();
}
// Returns an unused shader/program name
// Returns an unused texture name
GLuint ResourceManager::createTexture()
{
- GLuint handle = mTextureNameSpace.allocate();
-
- mTextureMap[handle] = nullptr;
-
- return handle;
+ return mTextureNameSpace.allocate();
}
// Returns an unused renderbuffer name
GLuint ResourceManager::createRenderbuffer()
{
- GLuint handle = mRenderbufferNameSpace.allocate();
-
- mRenderbufferMap[handle] = nullptr;
-
- return handle;
+ return mRenderbufferNameSpace.allocate();
}
// Returns an unused sampler name
GLuint ResourceManager::createSampler()
{
- GLuint handle = mSamplerNameSpace.allocate();
-
- mSamplerMap[handle] = nullptr;
-
- return handle;
+ return mSamplerNameSpace.allocate();
}
// Returns the next unused fence name, and allocates the fence
GLuint ResourceManager::createFenceSync(GLenum condition, GLbitfield flags)
{
- GLuint handle = mFenceSyncNameSpace.allocate();
+ GLuint name = mFenceSyncNameSpace.allocate();
- FenceSync* fenceSync = new FenceSync(handle, condition, flags);
- mFenceSyncMap[handle] = fenceSync;
+ FenceSync *fenceSync = new FenceSync(name, condition, flags);
fenceSync->addRef();
- return handle;
+ mFenceSyncNameSpace.insert(name, fenceSync);
+
+ return name;
}
void ResourceManager::deleteBuffer(GLuint buffer)
{
- BufferMap::iterator bufferObject = mBufferMap.find(buffer);
+ Buffer *bufferObject = mBufferNameSpace.remove(buffer);
- if(bufferObject != mBufferMap.end())
+ if(bufferObject)
{
- mBufferNameSpace.release(bufferObject->first);
- if(bufferObject->second) bufferObject->second->release();
- mBufferMap.erase(bufferObject);
+ bufferObject->release();
}
}
{
if(shaderObject->second->getRefCount() == 0)
{
- mProgramShaderNameSpace.release(shaderObject->first);
- delete shaderObject->second;
+ delete shaderObject->second;
+ mProgramShaderNameSpace.remove(shaderObject->first);
mShaderMap.erase(shaderObject);
}
else
{
if(programObject->second->getRefCount() == 0)
{
- mProgramShaderNameSpace.release(programObject->first);
- delete programObject->second;
+ delete programObject->second;
+ mProgramShaderNameSpace.remove(programObject->first);
mProgramMap.erase(programObject);
}
else
void ResourceManager::deleteTexture(GLuint texture)
{
- TextureMap::iterator textureObject = mTextureMap.find(texture);
+ Texture *textureObject = mTextureNameSpace.remove(texture);
- if(textureObject != mTextureMap.end())
+ if(textureObject)
{
- mTextureNameSpace.release(textureObject->first);
- if(textureObject->second) textureObject->second->release();
- mTextureMap.erase(textureObject);
+ textureObject->release();
}
}
void ResourceManager::deleteRenderbuffer(GLuint renderbuffer)
{
- RenderbufferMap::iterator renderbufferObject = mRenderbufferMap.find(renderbuffer);
+ Renderbuffer *renderbufferObject = mRenderbufferNameSpace.remove(renderbuffer);
- if(renderbufferObject != mRenderbufferMap.end())
+ if(renderbufferObject)
{
- mRenderbufferNameSpace.release(renderbufferObject->first);
- if(renderbufferObject->second) renderbufferObject->second->release();
- mRenderbufferMap.erase(renderbufferObject);
+ renderbufferObject->release();
}
}
void ResourceManager::deleteSampler(GLuint sampler)
{
- auto samplerObject = mSamplerMap.find(sampler);
+ Sampler *samplerObject = mSamplerNameSpace.remove(sampler);
- if(samplerObject != mSamplerMap.end())
+ if(samplerObject)
{
- mSamplerNameSpace.release(samplerObject->first);
- if(samplerObject->second) samplerObject->second->release();
- mSamplerMap.erase(samplerObject);
+ samplerObject->release();
}
}
void ResourceManager::deleteFenceSync(GLuint fenceSync)
{
- auto fenceObjectIt = mFenceSyncMap.find(fenceSync);
+ FenceSync *fenceObject = mFenceSyncNameSpace.remove(fenceSync);
- if(fenceObjectIt != mFenceSyncMap.end())
+ if(fenceObject)
{
- mFenceSyncNameSpace.release(fenceObjectIt->first);
- if(fenceObjectIt->second) fenceObjectIt->second->release();
- mFenceSyncMap.erase(fenceObjectIt);
+ fenceObject->release();
}
}
Buffer *ResourceManager::getBuffer(unsigned int handle)
{
- BufferMap::iterator buffer = mBufferMap.find(handle);
-
- if(buffer == mBufferMap.end())
- {
- return nullptr;
- }
- else
- {
- return buffer->second;
- }
+ return mBufferNameSpace.find(handle);
}
Shader *ResourceManager::getShader(unsigned int handle)
Texture *ResourceManager::getTexture(unsigned int handle)
{
- if(handle == 0) return nullptr;
-
- TextureMap::iterator texture = mTextureMap.find(handle);
-
- if(texture == mTextureMap.end())
- {
- return nullptr;
- }
- else
- {
- return texture->second;
- }
+ return mTextureNameSpace.find(handle);
}
Program *ResourceManager::getProgram(unsigned int handle)
Renderbuffer *ResourceManager::getRenderbuffer(unsigned int handle)
{
- RenderbufferMap::iterator renderbuffer = mRenderbufferMap.find(handle);
-
- if(renderbuffer == mRenderbufferMap.end())
- {
- return nullptr;
- }
- else
- {
- return renderbuffer->second;
- }
+ return mRenderbufferNameSpace.find(handle);
}
Sampler *ResourceManager::getSampler(unsigned int handle)
{
- auto sampler = mSamplerMap.find(handle);
-
- if(sampler == mSamplerMap.end())
- {
- return nullptr;
- }
- else
- {
- return sampler->second;
- }
+ return mSamplerNameSpace.find(handle);
}
FenceSync *ResourceManager::getFenceSync(unsigned int handle)
{
- auto fenceObjectIt = mFenceSyncMap.find(handle);
-
- if(fenceObjectIt == mFenceSyncMap.end())
- {
- return nullptr;
- }
- else
- {
- return fenceObjectIt->second;
- }
-}
-
-void ResourceManager::setRenderbuffer(GLuint handle, Renderbuffer *buffer)
-{
- mRenderbufferMap[handle] = buffer;
+ return mFenceSyncNameSpace.find(handle);
}
void ResourceManager::checkBufferAllocation(unsigned int buffer)
Buffer *bufferObject = new Buffer(buffer);
bufferObject->addRef();
- mBufferNameSpace.insert(buffer);
- mBufferMap[buffer] = bufferObject;
+ mBufferNameSpace.insert(buffer, bufferObject);
}
}
textureObject->addRef();
- mTextureNameSpace.insert(texture);
- mTextureMap[texture] = textureObject;
+ mTextureNameSpace.insert(texture, textureObject);
}
}
Renderbuffer *renderbufferObject = new Renderbuffer(handle, new Colorbuffer(0, 0, GL_RGBA4_OES, 0));
renderbufferObject->addRef();
- mRenderbufferNameSpace.insert(handle);
- mRenderbufferMap[handle] = renderbufferObject;
+ mRenderbufferNameSpace.insert(handle, renderbufferObject);
}
}
Sampler *samplerObject = new Sampler(sampler);
samplerObject->addRef();
- mSamplerNameSpace.insert(sampler);
- mSamplerMap[sampler] = samplerObject;
+ mSamplerNameSpace.insert(sampler, samplerObject);
}
}
bool ResourceManager::isSampler(GLuint sampler)
{
- return mSamplerMap.find(sampler) != mSamplerMap.end();
+ return mSamplerNameSpace.find(sampler) != nullptr;
}
}
\r
class ResourceManager\r
{\r
- public:\r
+public:\r
ResourceManager();\r
~ResourceManager();\r
\r
Sampler *getSampler(GLuint handle);\r
FenceSync *getFenceSync(GLuint handle);\r
\r
- void setRenderbuffer(GLuint handle, Renderbuffer *renderbuffer);\r
-\r
void checkBufferAllocation(unsigned int buffer);\r
void checkTextureAllocation(GLuint texture, TextureType type);\r
void checkRenderbufferAllocation(GLuint handle);\r
\r
bool isSampler(GLuint sampler);\r
\r
- private:\r
+private:\r
std::size_t mRefCount;\r
\r
- typedef std::map<GLint, Buffer*> BufferMap;\r
- BufferMap mBufferMap;\r
gl::NameSpace<Buffer> mBufferNameSpace;\r
\r
typedef std::map<GLint, Shader*> ShaderMap;\r
ProgramMap mProgramMap;\r
gl::NameSpace<Program> mProgramShaderNameSpace;\r
\r
- typedef std::map<GLint, Texture*> TextureMap;\r
- TextureMap mTextureMap;\r
gl::NameSpace<Texture> mTextureNameSpace;\r
-\r
- typedef std::map<GLint, Renderbuffer*> RenderbufferMap;\r
- RenderbufferMap mRenderbufferMap;\r
gl::NameSpace<Renderbuffer> mRenderbufferNameSpace;\r
-\r
- typedef std::map<GLint, Sampler*> SamplerMap;\r
- SamplerMap mSamplerMap;\r
gl::NameSpace<Sampler> mSamplerNameSpace;\r
-\r
- typedef std::map<GLint, FenceSync*> FenceMap;\r
- FenceMap mFenceSyncMap;\r
gl::NameSpace<FenceSync> mFenceSyncNameSpace;\r
};\r
\r