Use the namespace for storing objects.
Bug 19219444
Change-Id: I277d80be47d2057f31559c5058e2f6ea422dacfd
Reviewed-on: https://swiftshader-review.googlesource.com/4987
Reviewed-by: Alexis Hétu <sugoi@google.com>
Tested-by: Nicolas Capens <capn@google.com>
Reviewed-by: Nicolas Capens <capn@google.com>
diff --git a/src/OpenGL/common/NameSpace.hpp b/src/OpenGL/common/NameSpace.hpp
index 69b544f..2d72dc7 100644
--- a/src/OpenGL/common/NameSpace.hpp
+++ b/src/OpenGL/common/NameSpace.hpp
@@ -16,41 +16,59 @@
#define gl_NameSpace_hpp
#include "Object.hpp"
+#include "debug.h"
-#include <unordered_set>
-#include <algorithm>
-
-typedef unsigned int GLuint;
+#include <unordered_map>
namespace gl
{
template<class ObjectType, GLuint baseName = 1>
-class NameSpace : std::unordered_set<GLuint>
+class NameSpace
{
public:
NameSpace() : freeName(baseName)
{
}
+ ~NameSpace()
+ {
+ ASSERT(empty());
+ }
+
+ bool empty()
+ {
+ return map.empty();
+ }
+
+ GLuint firstName()
+ {
+ return map.begin()->first;
+ }
+
GLuint allocate()
{
GLuint name = freeName;
- while(find(name) != end())
+ while(isReserved(name))
{
name++;
}
- insert(name);
+ map.insert({name, nullptr});
freeName = name + 1;
return name;
}
- void insert(GLuint name)
+ bool isReserved(GLuint name)
{
- std::unordered_set<GLuint>::insert(name);
+ return map.find(name) != map.end();
+ }
+
+ void insert(GLuint name, ObjectType *object)
+ {
+ map[name] = object;
if(name == freeName)
{
@@ -58,13 +76,47 @@
}
}
- void release(GLuint name)
+ ObjectType *remove(GLuint name)
{
- erase(name);
- freeName = std::min(name, freeName);
+ auto element = map.find(name);
+
+ if(element != map.end())
+ {
+ ObjectType *object = element->second;
+ map.erase(element);
+
+ if(name < freeName)
+ {
+ freeName = name;
+ }
+
+ return object;
+ }
+
+ return nullptr;
+ }
+
+ ObjectType *find(GLuint name)
+ {
+ if(name < baseName)
+ {
+ return nullptr;
+ }
+
+ auto element = map.find(name);
+
+ if(element == map.end())
+ {
+ return nullptr;
+ }
+
+ return element->second;
}
private:
+ typedef std::unordered_map<GLuint, ObjectType*> Map;
+ Map map;
+
GLuint freeName; // Lowest known potentially free name
};
diff --git a/src/OpenGL/libGLES_CM/Context.cpp b/src/OpenGL/libGLES_CM/Context.cpp
index d59a00d..a6db78c 100644
--- a/src/OpenGL/libGLES_CM/Context.cpp
+++ b/src/OpenGL/libGLES_CM/Context.cpp
@@ -978,8 +978,8 @@
{
detachFramebuffer(framebuffer);
- mFramebufferNameSpace.release(framebufferObject->first);
- delete framebufferObject->second;
+ delete framebufferObject->second;
+ mFramebufferNameSpace.remove(framebufferObject->first);
mFramebufferMap.erase(framebufferObject);
}
}
diff --git a/src/OpenGL/libGLES_CM/ResourceManager.cpp b/src/OpenGL/libGLES_CM/ResourceManager.cpp
index f59d76e..62545c2 100644
--- a/src/OpenGL/libGLES_CM/ResourceManager.cpp
+++ b/src/OpenGL/libGLES_CM/ResourceManager.cpp
@@ -27,19 +27,19 @@
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());
}
}
@@ -59,116 +59,64 @@
// 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)
@@ -178,8 +126,7 @@
Buffer *bufferObject = new Buffer(buffer);
bufferObject->addRef();
- mBufferNameSpace.insert(buffer);
- mBufferMap[buffer] = bufferObject;
+ mBufferNameSpace.insert(buffer, bufferObject);
}
}
@@ -205,8 +152,7 @@
textureObject->addRef();
- mTextureNameSpace.insert(texture);
- mTextureMap[texture] = textureObject;
+ mTextureNameSpace.insert(texture, textureObject);
}
}
@@ -217,8 +163,7 @@
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);
}
}
diff --git a/src/OpenGL/libGLES_CM/ResourceManager.h b/src/OpenGL/libGLES_CM/ResourceManager.h
index 0fc79ed..22d719f 100644
--- a/src/OpenGL/libGLES_CM/ResourceManager.h
+++ b/src/OpenGL/libGLES_CM/ResourceManager.h
@@ -58,8 +58,6 @@
Texture *getTexture(GLuint handle);
Renderbuffer *getRenderbuffer(GLuint handle);
- void setRenderbuffer(GLuint handle, Renderbuffer *renderbuffer);
-
void checkBufferAllocation(unsigned int buffer);
void checkTextureAllocation(GLuint texture, TextureType type);
void checkRenderbufferAllocation(GLuint handle);
@@ -67,16 +65,8 @@
private:
std::size_t mRefCount;
- typedef std::map<GLint, Buffer*> BufferMap;
- BufferMap mBufferMap;
gl::NameSpace<Buffer> mBufferNameSpace;
-
- typedef std::map<GLint, Texture*> TextureMap;
- TextureMap mTextureMap;
- gl::NameSpace<Texture> mTextureNameSpace;
-
- typedef std::map<GLint, Renderbuffer*> RenderbufferMap;
- RenderbufferMap mRenderbufferMap;
+ gl::NameSpace<Texture> mTextureNameSpace;
gl::NameSpace<Renderbuffer> mRenderbufferNameSpace;
};
diff --git a/src/OpenGL/libGLESv2/Context.cpp b/src/OpenGL/libGLESv2/Context.cpp
index dfe5be6..8fd484d 100644
--- a/src/OpenGL/libGLESv2/Context.cpp
+++ b/src/OpenGL/libGLESv2/Context.cpp
@@ -1028,8 +1028,8 @@
{
detachFramebuffer(framebuffer);
- mFramebufferNameSpace.release(framebufferObject->first);
- delete framebufferObject->second;
+ delete framebufferObject->second;
+ mFramebufferNameSpace.remove(framebufferObject->first);
mFramebufferMap.erase(framebufferObject);
}
}
@@ -1040,8 +1040,8 @@
if(fenceObject != mFenceMap.end())
{
- mFenceNameSpace.release(fenceObject->first);
- delete fenceObject->second;
+ delete fenceObject->second;
+ mFenceNameSpace.remove(fenceObject->first);
mFenceMap.erase(fenceObject);
}
}
@@ -1052,13 +1052,12 @@
if(queryObject != mQueryMap.end())
{
- mQueryNameSpace.release(queryObject->first);
-
if(queryObject->second)
{
queryObject->second->release();
}
+ mQueryNameSpace.remove(queryObject->first);
mQueryMap.erase(queryObject);
}
}
@@ -1081,8 +1080,8 @@
bindVertexArray(0);
}
- mVertexArrayNameSpace.release(vertexArrayObject->first);
delete vertexArrayObject->second;
+ mVertexArrayNameSpace.remove(vertexArrayObject->first);
mVertexArrayMap.erase(vertexArrayObject);
}
}
@@ -1102,8 +1101,8 @@
if(transformFeedbackObject != mTransformFeedbackMap.end())
{
- mTransformFeedbackNameSpace.release(transformFeedbackObject->first);
delete transformFeedbackObject->second;
+ mTransformFeedbackNameSpace.remove(transformFeedbackObject->first);
mTransformFeedbackMap.erase(transformFeedbackObject);
}
}
diff --git a/src/OpenGL/libGLESv2/ResourceManager.cpp b/src/OpenGL/libGLESv2/ResourceManager.cpp
index 1f4103d..85f0df3 100644
--- a/src/OpenGL/libGLESv2/ResourceManager.cpp
+++ b/src/OpenGL/libGLESv2/ResourceManager.cpp
@@ -31,9 +31,9 @@
ResourceManager::~ResourceManager()
{
- while(!mBufferMap.empty())
+ while(!mBufferNameSpace.empty())
{
- deleteBuffer(mBufferMap.begin()->first);
+ deleteBuffer(mBufferNameSpace.firstName());
}
while(!mProgramMap.empty())
@@ -46,24 +46,24 @@
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());
}
}
@@ -83,11 +83,7 @@
// 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
@@ -121,54 +117,41 @@
// 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();
}
}
@@ -180,8 +163,8 @@
{
if(shaderObject->second->getRefCount() == 0)
{
- mProgramShaderNameSpace.release(shaderObject->first);
- delete shaderObject->second;
+ delete shaderObject->second;
+ mProgramShaderNameSpace.remove(shaderObject->first);
mShaderMap.erase(shaderObject);
}
else
@@ -199,8 +182,8 @@
{
if(programObject->second->getRefCount() == 0)
{
- mProgramShaderNameSpace.release(programObject->first);
- delete programObject->second;
+ delete programObject->second;
+ mProgramShaderNameSpace.remove(programObject->first);
mProgramMap.erase(programObject);
}
else
@@ -212,64 +195,47 @@
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)
@@ -288,18 +254,7 @@
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)
@@ -318,49 +273,17 @@
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)
@@ -370,8 +293,7 @@
Buffer *bufferObject = new Buffer(buffer);
bufferObject->addRef();
- mBufferNameSpace.insert(buffer);
- mBufferMap[buffer] = bufferObject;
+ mBufferNameSpace.insert(buffer, bufferObject);
}
}
@@ -409,8 +331,7 @@
textureObject->addRef();
- mTextureNameSpace.insert(texture);
- mTextureMap[texture] = textureObject;
+ mTextureNameSpace.insert(texture, textureObject);
}
}
@@ -421,8 +342,7 @@
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);
}
}
@@ -433,14 +353,13 @@
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;
}
}
diff --git a/src/OpenGL/libGLESv2/ResourceManager.h b/src/OpenGL/libGLESv2/ResourceManager.h
index 381b5bd..8e282e7 100644
--- a/src/OpenGL/libGLESv2/ResourceManager.h
+++ b/src/OpenGL/libGLESv2/ResourceManager.h
@@ -45,7 +45,7 @@
class ResourceManager
{
- public:
+public:
ResourceManager();
~ResourceManager();
@@ -76,8 +76,6 @@
Sampler *getSampler(GLuint handle);
FenceSync *getFenceSync(GLuint handle);
- void setRenderbuffer(GLuint handle, Renderbuffer *renderbuffer);
-
void checkBufferAllocation(unsigned int buffer);
void checkTextureAllocation(GLuint texture, TextureType type);
void checkRenderbufferAllocation(GLuint handle);
@@ -85,11 +83,9 @@
bool isSampler(GLuint sampler);
- private:
+private:
std::size_t mRefCount;
- typedef std::map<GLint, Buffer*> BufferMap;
- BufferMap mBufferMap;
gl::NameSpace<Buffer> mBufferNameSpace;
typedef std::map<GLint, Shader*> ShaderMap;
@@ -99,20 +95,9 @@
ProgramMap mProgramMap;
gl::NameSpace<Program> mProgramShaderNameSpace;
- typedef std::map<GLint, Texture*> TextureMap;
- TextureMap mTextureMap;
gl::NameSpace<Texture> mTextureNameSpace;
-
- typedef std::map<GLint, Renderbuffer*> RenderbufferMap;
- RenderbufferMap mRenderbufferMap;
gl::NameSpace<Renderbuffer> mRenderbufferNameSpace;
-
- typedef std::map<GLint, Sampler*> SamplerMap;
- SamplerMap mSamplerMap;
gl::NameSpace<Sampler> mSamplerNameSpace;
-
- typedef std::map<GLint, FenceSync*> FenceMap;
- FenceMap mFenceSyncMap;
gl::NameSpace<FenceSync> mFenceSyncNameSpace;
};