From: Nicolas Capens Date: Wed, 23 Mar 2016 06:08:57 +0000 (-0400) Subject: Use the namespace for storing objects. X-Git-Tag: android-x86-7.1-r1~608 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=5669f0d17da2867b59a6d34dd9c83b77c77ea5e5;p=android-x86%2Fexternal-swiftshader.git Use the namespace for storing objects. Bug 19219444 Change-Id: I277d80be47d2057f31559c5058e2f6ea422dacfd Reviewed-on: https://swiftshader-review.googlesource.com/4987 Reviewed-by: Alexis Hétu Tested-by: Nicolas Capens Reviewed-by: Nicolas Capens --- diff --git a/src/OpenGL/common/NameSpace.hpp b/src/OpenGL/common/NameSpace.hpp index 69b544fe5..2d72dc7d5 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 -#include - -typedef unsigned int GLuint; +#include namespace gl { template -class NameSpace : std::unordered_set +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::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 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 d59a00d99..a6db78c92 100644 --- a/src/OpenGL/libGLES_CM/Context.cpp +++ b/src/OpenGL/libGLES_CM/Context.cpp @@ -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); } } diff --git a/src/OpenGL/libGLES_CM/ResourceManager.cpp b/src/OpenGL/libGLES_CM/ResourceManager.cpp index f59d76e3a..62545c2bf 100644 --- a/src/OpenGL/libGLES_CM/ResourceManager.cpp +++ b/src/OpenGL/libGLES_CM/ResourceManager.cpp @@ -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); } } diff --git a/src/OpenGL/libGLES_CM/ResourceManager.h b/src/OpenGL/libGLES_CM/ResourceManager.h index 0fc79ed06..22d719fc8 100644 --- a/src/OpenGL/libGLES_CM/ResourceManager.h +++ b/src/OpenGL/libGLES_CM/ResourceManager.h @@ -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 BufferMap; - BufferMap mBufferMap; gl::NameSpace mBufferNameSpace; - - typedef std::map TextureMap; - TextureMap mTextureMap; - gl::NameSpace mTextureNameSpace; - - typedef std::map RenderbufferMap; - RenderbufferMap mRenderbufferMap; + gl::NameSpace mTextureNameSpace; gl::NameSpace mRenderbufferNameSpace; }; diff --git a/src/OpenGL/libGLESv2/Context.cpp b/src/OpenGL/libGLESv2/Context.cpp index dfe5be678..8fd484d5b 100644 --- a/src/OpenGL/libGLESv2/Context.cpp +++ b/src/OpenGL/libGLESv2/Context.cpp @@ -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); } } diff --git a/src/OpenGL/libGLESv2/ResourceManager.cpp b/src/OpenGL/libGLESv2/ResourceManager.cpp index 1f4103d48..85f0df331 100644 --- a/src/OpenGL/libGLESv2/ResourceManager.cpp +++ b/src/OpenGL/libGLESv2/ResourceManager.cpp @@ -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; } } diff --git a/src/OpenGL/libGLESv2/ResourceManager.h b/src/OpenGL/libGLESv2/ResourceManager.h index 381b5bddf..8e282e71e 100644 --- a/src/OpenGL/libGLESv2/ResourceManager.h +++ b/src/OpenGL/libGLESv2/ResourceManager.h @@ -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 BufferMap; - BufferMap mBufferMap; gl::NameSpace mBufferNameSpace; typedef std::map ShaderMap; @@ -99,20 +95,9 @@ class ResourceManager ProgramMap mProgramMap; gl::NameSpace mProgramShaderNameSpace; - typedef std::map TextureMap; - TextureMap mTextureMap; gl::NameSpace mTextureNameSpace; - - typedef std::map RenderbufferMap; - RenderbufferMap mRenderbufferMap; gl::NameSpace mRenderbufferNameSpace; - - typedef std::map SamplerMap; - SamplerMap mSamplerMap; gl::NameSpace mSamplerNameSpace; - - typedef std::map FenceMap; - FenceMap mFenceSyncMap; gl::NameSpace mFenceSyncNameSpace; };