Commit 433ae74c by Nicolas Capens

Use a shared namespace for shader and program objects.

Bug 19219444 Change-Id: I5eb797eed31ab233866e5c23d83298d3c57091a9 Reviewed-on: https://swiftshader-review.googlesource.com/4989Reviewed-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 5669f0d1
...@@ -36,14 +36,14 @@ ResourceManager::~ResourceManager() ...@@ -36,14 +36,14 @@ ResourceManager::~ResourceManager()
deleteBuffer(mBufferNameSpace.firstName()); deleteBuffer(mBufferNameSpace.firstName());
} }
while(!mProgramMap.empty()) while(!mProgramNameSpace.empty())
{ {
deleteProgram(mProgramMap.begin()->first); deleteProgram(mProgramNameSpace.firstName());
} }
while(!mShaderMap.empty()) while(!mShaderNameSpace.empty())
{ {
deleteShader(mShaderMap.begin()->first); deleteShader(mShaderNameSpace.firstName());
} }
while(!mRenderbufferNameSpace.empty()) while(!mRenderbufferNameSpace.empty())
...@@ -86,32 +86,32 @@ GLuint ResourceManager::createBuffer() ...@@ -86,32 +86,32 @@ GLuint ResourceManager::createBuffer()
return mBufferNameSpace.allocate(); return mBufferNameSpace.allocate();
} }
// Returns an unused shader/program name // Returns an unused shader name
GLuint ResourceManager::createShader(GLenum type) GLuint ResourceManager::createShader(GLenum type)
{ {
GLuint handle = mProgramShaderNameSpace.allocate(); GLuint name = mProgramShaderNameSpace.allocate();
if(type == GL_VERTEX_SHADER) if(type == GL_VERTEX_SHADER)
{ {
mShaderMap[handle] = new VertexShader(this, handle); mShaderNameSpace.insert(name, new VertexShader(this, name));
} }
else if(type == GL_FRAGMENT_SHADER) else if(type == GL_FRAGMENT_SHADER)
{ {
mShaderMap[handle] = new FragmentShader(this, handle); mShaderNameSpace.insert(name, new FragmentShader(this, name));
} }
else UNREACHABLE(type); else UNREACHABLE(type);
return handle; return name;
} }
// Returns an unused program/shader name // Returns an unused program name
GLuint ResourceManager::createProgram() GLuint ResourceManager::createProgram()
{ {
GLuint handle = mProgramShaderNameSpace.allocate(); GLuint name = mProgramShaderNameSpace.allocate();
mProgramMap[handle] = new Program(this, handle); mProgramNameSpace.insert(name, new Program(this, name));
return handle; return name;
} }
// Returns an unused texture name // Returns an unused texture name
...@@ -157,38 +157,38 @@ void ResourceManager::deleteBuffer(GLuint buffer) ...@@ -157,38 +157,38 @@ void ResourceManager::deleteBuffer(GLuint buffer)
void ResourceManager::deleteShader(GLuint shader) void ResourceManager::deleteShader(GLuint shader)
{ {
ShaderMap::iterator shaderObject = mShaderMap.find(shader); Shader *shaderObject = mShaderNameSpace.find(shader);
if(shaderObject != mShaderMap.end()) if(shaderObject)
{ {
if(shaderObject->second->getRefCount() == 0) if(shaderObject->getRefCount() == 0)
{ {
delete shaderObject->second; delete shaderObject;
mProgramShaderNameSpace.remove(shaderObject->first); mShaderNameSpace.remove(shader);
mShaderMap.erase(shaderObject); mProgramShaderNameSpace.remove(shader);
} }
else else
{ {
shaderObject->second->flagForDeletion(); shaderObject->flagForDeletion();
} }
} }
} }
void ResourceManager::deleteProgram(GLuint program) void ResourceManager::deleteProgram(GLuint program)
{ {
ProgramMap::iterator programObject = mProgramMap.find(program); Program *programObject = mProgramNameSpace.find(program);
if(programObject != mProgramMap.end()) if(programObject)
{ {
if(programObject->second->getRefCount() == 0) if(programObject->getRefCount() == 0)
{ {
delete programObject->second; delete programObject;
mProgramShaderNameSpace.remove(programObject->first); mProgramNameSpace.remove(program);
mProgramMap.erase(programObject); mProgramShaderNameSpace.remove(program);
} }
else else
{ {
programObject->second->flagForDeletion(); programObject->flagForDeletion();
} }
} }
} }
...@@ -240,16 +240,7 @@ Buffer *ResourceManager::getBuffer(unsigned int handle) ...@@ -240,16 +240,7 @@ Buffer *ResourceManager::getBuffer(unsigned int handle)
Shader *ResourceManager::getShader(unsigned int handle) Shader *ResourceManager::getShader(unsigned int handle)
{ {
ShaderMap::iterator shader = mShaderMap.find(handle); return mShaderNameSpace.find(handle);
if(shader == mShaderMap.end())
{
return nullptr;
}
else
{
return shader->second;
}
} }
Texture *ResourceManager::getTexture(unsigned int handle) Texture *ResourceManager::getTexture(unsigned int handle)
...@@ -259,16 +250,7 @@ Texture *ResourceManager::getTexture(unsigned int handle) ...@@ -259,16 +250,7 @@ Texture *ResourceManager::getTexture(unsigned int handle)
Program *ResourceManager::getProgram(unsigned int handle) Program *ResourceManager::getProgram(unsigned int handle)
{ {
ProgramMap::iterator program = mProgramMap.find(handle); return mProgramNameSpace.find(handle);
if(program == mProgramMap.end())
{
return nullptr;
}
else
{
return program->second;
}
} }
Renderbuffer *ResourceManager::getRenderbuffer(unsigned int handle) Renderbuffer *ResourceManager::getRenderbuffer(unsigned int handle)
......
...@@ -87,14 +87,9 @@ private: ...@@ -87,14 +87,9 @@ private:
std::size_t mRefCount; std::size_t mRefCount;
gl::NameSpace<Buffer> mBufferNameSpace; gl::NameSpace<Buffer> mBufferNameSpace;
gl::NameSpace<Program> mProgramNameSpace;
typedef std::map<GLint, Shader*> ShaderMap; gl::NameSpace<Shader> mShaderNameSpace;
ShaderMap mShaderMap; gl::NameSpace<void> mProgramShaderNameSpace; // Shaders and programs share a namespace
typedef std::map<GLint, Program*> ProgramMap;
ProgramMap mProgramMap;
gl::NameSpace<Program> mProgramShaderNameSpace;
gl::NameSpace<Texture> mTextureNameSpace; gl::NameSpace<Texture> mTextureNameSpace;
gl::NameSpace<Renderbuffer> mRenderbufferNameSpace; gl::NameSpace<Renderbuffer> mRenderbufferNameSpace;
gl::NameSpace<Sampler> mSamplerNameSpace; gl::NameSpace<Sampler> mSamplerNameSpace;
......
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