Commit fddfe9c9 by Nicolas Capens

Fix reserving user picked object names.

Bug 19219444 Change-Id: Ic0e3c5a37174917a541452bab9f92738bc766044 Reviewed-on: https://swiftshader-review.googlesource.com/4986Tested-by: 's avatarNicolas Capens <capn@google.com> Reviewed-by: 's avatarAlexis Hétu <sugoi@google.com> Reviewed-by: 's avatarNicolas Capens <capn@google.com>
parent c57e5366
......@@ -48,6 +48,16 @@ public:
return name;
}
void insert(GLuint name)
{
std::unordered_set<GLuint>::insert(name);
if(name == freeName)
{
freeName++;
}
}
void release(GLuint name)
{
erase(name);
......@@ -55,7 +65,7 @@ public:
}
private:
GLuint freeName;
GLuint freeName; // Lowest known potentially free name
};
}
......
......@@ -125,7 +125,7 @@ Context::Context(const egl::Config *config, const Context *shareContext)
mState.textureUnit[i].operand2Alpha = GL_SRC_ALPHA;
}
if(shareContext != NULL)
if(shareContext)
{
mResourceManager = shareContext->mResourceManager;
mResourceManager->addRef();
......@@ -254,21 +254,21 @@ Context::~Context()
{
for(int sampler = 0; sampler < MAX_TEXTURE_UNITS; sampler++)
{
mState.samplerTexture[type][sampler] = NULL;
mState.samplerTexture[type][sampler] = nullptr;
}
}
for(int i = 0; i < MAX_VERTEX_ATTRIBS; i++)
{
mState.vertexAttribute[i].mBoundBuffer = NULL;
mState.vertexAttribute[i].mBoundBuffer = nullptr;
}
mState.arrayBuffer = NULL;
mState.elementArrayBuffer = NULL;
mState.renderbuffer = NULL;
mState.arrayBuffer = nullptr;
mState.elementArrayBuffer = nullptr;
mState.renderbuffer = nullptr;
mTexture2DZero = NULL;
mTextureExternalZero = NULL;
mTexture2DZero = nullptr;
mTextureExternalZero = nullptr;
delete mVertexDataManager;
delete mIndexDataManager;
......@@ -935,7 +935,7 @@ GLuint Context::createFramebuffer()
{
GLuint handle = mFramebufferNameSpace.allocate();
mFramebufferMap[handle] = NULL;
mFramebufferMap[handle] = nullptr;
return handle;
}
......@@ -1044,6 +1044,8 @@ void Context::bindFramebuffer(GLuint framebuffer)
void Context::bindRenderbuffer(GLuint renderbuffer)
{
mResourceManager->checkRenderbufferAllocation(renderbuffer);
mState.renderbuffer = getRenderbuffer(renderbuffer);
}
......@@ -1065,7 +1067,7 @@ Framebuffer *Context::getFramebuffer(unsigned int handle)
if(framebuffer == mFramebufferMap.end())
{
return NULL;
return nullptr;
}
else
{
......@@ -2976,19 +2978,19 @@ void Context::detachBuffer(GLuint buffer)
if(mState.arrayBuffer.name() == buffer)
{
mState.arrayBuffer = NULL;
mState.arrayBuffer = nullptr;
}
if(mState.elementArrayBuffer.name() == buffer)
{
mState.elementArrayBuffer = NULL;
mState.elementArrayBuffer = nullptr;
}
for(int attribute = 0; attribute < MAX_VERTEX_ATTRIBS; attribute++)
{
if(mState.vertexAttribute[attribute].mBoundBuffer.name() == buffer)
{
mState.vertexAttribute[attribute].mBoundBuffer = NULL;
mState.vertexAttribute[attribute].mBoundBuffer = nullptr;
}
}
}
......@@ -3005,7 +3007,7 @@ void Context::detachTexture(GLuint texture)
{
if(mState.samplerTexture[type][sampler].name() == texture)
{
mState.samplerTexture[type][sampler] = NULL;
mState.samplerTexture[type][sampler] = nullptr;
}
}
}
......
......@@ -9,7 +9,7 @@
// or implied, including but not limited to any patent rights, are granted to you.
//
// ResourceManager.cpp: Implements the ResourceManager class, which tracks and
// ResourceManager.cpp: Implements the ResourceManager class, which tracks and
// retrieves objects which may be shared by multiple Contexts.
#include "ResourceManager.h"
......@@ -61,7 +61,7 @@ GLuint ResourceManager::createBuffer()
{
GLuint handle = mBufferNameSpace.allocate();
mBufferMap[handle] = NULL;
mBufferMap[handle] = nullptr;
return handle;
}
......@@ -71,7 +71,7 @@ GLuint ResourceManager::createTexture()
{
GLuint handle = mTextureNameSpace.allocate();
mTextureMap[handle] = NULL;
mTextureMap[handle] = nullptr;
return handle;
}
......@@ -81,7 +81,7 @@ GLuint ResourceManager::createRenderbuffer()
{
GLuint handle = mRenderbufferNameSpace.allocate();
mRenderbufferMap[handle] = NULL;
mRenderbufferMap[handle] = nullptr;
return handle;
}
......@@ -128,7 +128,7 @@ Buffer *ResourceManager::getBuffer(unsigned int handle)
if(buffer == mBufferMap.end())
{
return NULL;
return nullptr;
}
else
{
......@@ -138,13 +138,13 @@ Buffer *ResourceManager::getBuffer(unsigned int handle)
Texture *ResourceManager::getTexture(unsigned int handle)
{
if(handle == 0) return NULL;
if(handle == 0) return nullptr;
TextureMap::iterator texture = mTextureMap.find(handle);
if(texture == mTextureMap.end())
{
return NULL;
return nullptr;
}
else
{
......@@ -158,16 +158,10 @@ Renderbuffer *ResourceManager::getRenderbuffer(unsigned int handle)
if(renderbuffer == mRenderbufferMap.end())
{
return NULL;
return nullptr;
}
else
{
if (!renderbuffer->second)
{
Renderbuffer *renderbufferObject = new Renderbuffer(handle, new Colorbuffer(0, 0, GL_RGBA4_OES, 0));
mRenderbufferMap[handle] = renderbufferObject;
renderbufferObject->addRef();
}
return renderbuffer->second;
}
}
......@@ -182,8 +176,10 @@ void ResourceManager::checkBufferAllocation(unsigned int buffer)
if(buffer != 0 && !getBuffer(buffer))
{
Buffer *bufferObject = new Buffer(buffer);
bufferObject->addRef();
mBufferNameSpace.insert(buffer);
mBufferMap[buffer] = bufferObject;
bufferObject->addRef();
}
}
......@@ -207,9 +203,23 @@ void ResourceManager::checkTextureAllocation(GLuint texture, TextureType type)
return;
}
textureObject->addRef();
mTextureNameSpace.insert(texture);
mTextureMap[texture] = textureObject;
textureObject->addRef();
}
}
void ResourceManager::checkRenderbufferAllocation(GLuint handle)
{
if(handle != 0 && !getRenderbuffer(handle))
{
Renderbuffer *renderbufferObject = new Renderbuffer(handle, new Colorbuffer(0, 0, GL_RGBA4_OES, 0));
renderbufferObject->addRef();
mRenderbufferNameSpace.insert(handle);
mRenderbufferMap[handle] = renderbufferObject;
}
}
}
......@@ -62,6 +62,7 @@ public:
void checkBufferAllocation(unsigned int buffer);
void checkTextureAllocation(GLuint texture, TextureType type);
void checkRenderbufferAllocation(GLuint handle);
private:
std::size_t mRefCount;
......
......@@ -141,7 +141,7 @@ GLuint ResourceManager::createRenderbuffer()
// Returns an unused sampler name
GLuint ResourceManager::createSampler()
{
GLuint handle = mSamplerHandleAllocator.allocate();
GLuint handle = mSamplerNameSpace.allocate();
mSamplerMap[handle] = nullptr;
......@@ -151,7 +151,7 @@ GLuint ResourceManager::createSampler()
// Returns the next unused fence name, and allocates the fence
GLuint ResourceManager::createFenceSync(GLenum condition, GLbitfield flags)
{
GLuint handle = mFenceSyncHandleAllocator.allocate();
GLuint handle = mFenceSyncNameSpace.allocate();
FenceSync* fenceSync = new FenceSync(handle, condition, flags);
mFenceSyncMap[handle] = fenceSync;
......@@ -240,7 +240,7 @@ void ResourceManager::deleteSampler(GLuint sampler)
if(samplerObject != mSamplerMap.end())
{
mSamplerHandleAllocator.release(samplerObject->first);
mSamplerNameSpace.release(samplerObject->first);
if(samplerObject->second) samplerObject->second->release();
mSamplerMap.erase(samplerObject);
}
......@@ -252,7 +252,7 @@ void ResourceManager::deleteFenceSync(GLuint fenceSync)
if(fenceObjectIt != mFenceSyncMap.end())
{
mFenceSyncHandleAllocator.release(fenceObjectIt->first);
mFenceSyncNameSpace.release(fenceObjectIt->first);
if(fenceObjectIt->second) fenceObjectIt->second->release();
mFenceSyncMap.erase(fenceObjectIt);
}
......@@ -368,8 +368,10 @@ void ResourceManager::checkBufferAllocation(unsigned int buffer)
if(buffer != 0 && !getBuffer(buffer))
{
Buffer *bufferObject = new Buffer(buffer);
bufferObject->addRef();
mBufferNameSpace.insert(buffer);
mBufferMap[buffer] = bufferObject;
bufferObject->addRef();
}
}
......@@ -405,8 +407,10 @@ void ResourceManager::checkTextureAllocation(GLuint texture, TextureType type)
return;
}
textureObject->addRef();
mTextureNameSpace.insert(texture);
mTextureMap[texture] = textureObject;
textureObject->addRef();
}
}
......@@ -415,8 +419,10 @@ void ResourceManager::checkRenderbufferAllocation(GLuint handle)
if(handle != 0 && !getRenderbuffer(handle))
{
Renderbuffer *renderbufferObject = new Renderbuffer(handle, new Colorbuffer(0, 0, GL_RGBA4_OES, 0));
mRenderbufferMap[handle] = renderbufferObject;
renderbufferObject->addRef();
mRenderbufferNameSpace.insert(handle);
mRenderbufferMap[handle] = renderbufferObject;
}
}
......@@ -425,9 +431,10 @@ void ResourceManager::checkSamplerAllocation(GLuint sampler)
if(sampler != 0 && !getSampler(sampler))
{
Sampler *samplerObject = new Sampler(sampler);
mSamplerMap[sampler] = samplerObject;
samplerObject->addRef();
// Samplers cannot be created via Bind
mSamplerNameSpace.insert(sampler);
mSamplerMap[sampler] = samplerObject;
}
}
......
......@@ -109,11 +109,11 @@ class ResourceManager
typedef std::map<GLint, Sampler*> SamplerMap;
SamplerMap mSamplerMap;
gl::NameSpace<Sampler> mSamplerHandleAllocator;
gl::NameSpace<Sampler> mSamplerNameSpace;
typedef std::map<GLint, FenceSync*> FenceMap;
FenceMap mFenceSyncMap;
gl::NameSpace<FenceSync> mFenceSyncHandleAllocator;
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