Commit 5669f0d1 by Nicolas Capens

Use the namespace for storing objects.

Bug 19219444 Change-Id: I277d80be47d2057f31559c5058e2f6ea422dacfd Reviewed-on: https://swiftshader-review.googlesource.com/4987Reviewed-by: 's avatarAlexis Hétu <sugoi@google.com> Tested-by: 's avatarNicolas Capens <capn@google.com> Reviewed-by: 's avatarNicolas Capens <capn@google.com>
parent fddfe9c9
......@@ -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 @@ public:
}
}
void release(GLuint name)
ObjectType *remove(GLuint name)
{
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)
{
erase(name);
freeName = std::min(name, freeName);
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
};
......
......@@ -978,8 +978,8 @@ void Context::deleteFramebuffer(GLuint framebuffer)
{
detachFramebuffer(framebuffer);
mFramebufferNameSpace.release(framebufferObject->first);
delete framebufferObject->second;
delete framebufferObject->second;
mFramebufferNameSpace.remove(framebufferObject->first);
mFramebufferMap.erase(framebufferObject);
}
}
......
......@@ -27,19 +27,19 @@ ResourceManager::ResourceManager()
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 @@ void ResourceManager::release()
// 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 @@ void ResourceManager::checkBufferAllocation(unsigned int buffer)
Buffer *bufferObject = new Buffer(buffer);
bufferObject->addRef();
mBufferNameSpace.insert(buffer);
mBufferMap[buffer] = bufferObject;
mBufferNameSpace.insert(buffer, bufferObject);
}
}
......@@ -205,8 +152,7 @@ void ResourceManager::checkTextureAllocation(GLuint texture, TextureType type)
textureObject->addRef();
mTextureNameSpace.insert(texture);
mTextureMap[texture] = textureObject;
mTextureNameSpace.insert(texture, textureObject);
}
}
......@@ -217,8 +163,7 @@ void ResourceManager::checkRenderbufferAllocation(GLuint handle)
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);
}
}
......
......@@ -58,8 +58,6 @@ public:
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 @@ public:
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;
};
......
......@@ -1028,8 +1028,8 @@ void Context::deleteFramebuffer(GLuint framebuffer)
{
detachFramebuffer(framebuffer);
mFramebufferNameSpace.release(framebufferObject->first);
delete framebufferObject->second;
delete framebufferObject->second;
mFramebufferNameSpace.remove(framebufferObject->first);
mFramebufferMap.erase(framebufferObject);
}
}
......@@ -1040,8 +1040,8 @@ void Context::deleteFence(GLuint fence)
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 @@ void Context::deleteQuery(GLuint query)
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 @@ void Context::deleteVertexArray(GLuint vertexArray)
bindVertexArray(0);
}
mVertexArrayNameSpace.release(vertexArrayObject->first);
delete vertexArrayObject->second;
mVertexArrayNameSpace.remove(vertexArrayObject->first);
mVertexArrayMap.erase(vertexArrayObject);
}
}
......@@ -1102,8 +1101,8 @@ void Context::deleteTransformFeedback(GLuint transformFeedback)
if(transformFeedbackObject != mTransformFeedbackMap.end())
{
mTransformFeedbackNameSpace.release(transformFeedbackObject->first);
delete transformFeedbackObject->second;
mTransformFeedbackNameSpace.remove(transformFeedbackObject->first);
mTransformFeedbackMap.erase(transformFeedbackObject);
}
}
......
......@@ -31,9 +31,9 @@ ResourceManager::ResourceManager()
ResourceManager::~ResourceManager()
{
while(!mBufferMap.empty())
while(!mBufferNameSpace.empty())
{
deleteBuffer(mBufferMap.begin()->first);
deleteBuffer(mBufferNameSpace.firstName());
}
while(!mProgramMap.empty())
......@@ -46,24 +46,24 @@ ResourceManager::~ResourceManager()
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 @@ void ResourceManager::release()
// 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 @@ GLuint ResourceManager::createProgram()
// 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 @@ void ResourceManager::deleteShader(GLuint shader)
{
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 @@ void ResourceManager::deleteProgram(GLuint program)
{
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::deleteProgram(GLuint program)
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 @@ 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)
......@@ -318,49 +273,17 @@ 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)
......@@ -370,8 +293,7 @@ void ResourceManager::checkBufferAllocation(unsigned int buffer)
Buffer *bufferObject = new Buffer(buffer);
bufferObject->addRef();
mBufferNameSpace.insert(buffer);
mBufferMap[buffer] = bufferObject;
mBufferNameSpace.insert(buffer, bufferObject);
}
}
......@@ -409,8 +331,7 @@ void ResourceManager::checkTextureAllocation(GLuint texture, TextureType type)
textureObject->addRef();
mTextureNameSpace.insert(texture);
mTextureMap[texture] = textureObject;
mTextureNameSpace.insert(texture, textureObject);
}
}
......@@ -421,8 +342,7 @@ void ResourceManager::checkRenderbufferAllocation(GLuint handle)
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 @@ void ResourceManager::checkSamplerAllocation(GLuint sampler)
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;
}
}
......@@ -45,7 +45,7 @@ enum TextureType
class ResourceManager
{
public:
public:
ResourceManager();
~ResourceManager();
......@@ -76,8 +76,6 @@ class ResourceManager
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 @@ class ResourceManager
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 @@ class ResourceManager
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;
};
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment