Use a shared namespace for shader and program objects.

Bug 19219444

Change-Id: I5eb797eed31ab233866e5c23d83298d3c57091a9
Reviewed-on: https://swiftshader-review.googlesource.com/4989
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/libGLESv2/ResourceManager.cpp b/src/OpenGL/libGLESv2/ResourceManager.cpp
index 85f0df3..4036954 100644
--- a/src/OpenGL/libGLESv2/ResourceManager.cpp
+++ b/src/OpenGL/libGLESv2/ResourceManager.cpp
@@ -36,14 +36,14 @@
         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())
@@ -86,32 +86,32 @@
     return mBufferNameSpace.allocate();
 }
 
-// Returns an unused shader/program name
+// Returns an unused shader name
 GLuint ResourceManager::createShader(GLenum type)
 {
-    GLuint handle = mProgramShaderNameSpace.allocate();
+	GLuint name = mProgramShaderNameSpace.allocate();
 
     if(type == GL_VERTEX_SHADER)
     {
-        mShaderMap[handle] = new VertexShader(this, handle);
+		mShaderNameSpace.insert(name, new VertexShader(this, name));
     }
     else if(type == GL_FRAGMENT_SHADER)
     {
-        mShaderMap[handle] = new FragmentShader(this, handle);
+		mShaderNameSpace.insert(name, new FragmentShader(this, name));
     }
     else UNREACHABLE(type);
 
-    return handle;
+	return name;
 }
 
-// Returns an unused program/shader name
+// Returns an unused program name
 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
@@ -157,38 +157,38 @@
 
 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;
-			mProgramShaderNameSpace.remove(shaderObject->first);
-            mShaderMap.erase(shaderObject);
+			delete shaderObject;
+			mShaderNameSpace.remove(shader);
+			mProgramShaderNameSpace.remove(shader);
         }
         else
         {
-            shaderObject->second->flagForDeletion();
+            shaderObject->flagForDeletion();
         }
     }
 }
 
 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;
-			mProgramShaderNameSpace.remove(programObject->first);
-            mProgramMap.erase(programObject);
+			delete programObject;
+			mProgramNameSpace.remove(program);
+			mProgramShaderNameSpace.remove(program);
         }
         else
         {
-            programObject->second->flagForDeletion();
+            programObject->flagForDeletion();
         }
     }
 }
@@ -240,16 +240,7 @@
 
 Shader *ResourceManager::getShader(unsigned int handle)
 {
-    ShaderMap::iterator shader = mShaderMap.find(handle);
-
-    if(shader == mShaderMap.end())
-    {
-        return nullptr;
-    }
-    else
-    {
-        return shader->second;
-    }
+    return mShaderNameSpace.find(handle);
 }
 
 Texture *ResourceManager::getTexture(unsigned int handle)
@@ -259,16 +250,7 @@
 
 Program *ResourceManager::getProgram(unsigned int handle)
 {
-    ProgramMap::iterator program = mProgramMap.find(handle);
-
-    if(program == mProgramMap.end())
-    {
-        return nullptr;
-    }
-    else
-    {
-        return program->second;
-    }
+    return mProgramNameSpace.find(handle);
 }
 
 Renderbuffer *ResourceManager::getRenderbuffer(unsigned int handle)
diff --git a/src/OpenGL/libGLESv2/ResourceManager.h b/src/OpenGL/libGLESv2/ResourceManager.h
index 8e282e7..b12e4ea 100644
--- a/src/OpenGL/libGLESv2/ResourceManager.h
+++ b/src/OpenGL/libGLESv2/ResourceManager.h
@@ -87,14 +87,9 @@
     std::size_t mRefCount;

 

     gl::NameSpace<Buffer> mBufferNameSpace;

-

-    typedef std::map<GLint, Shader*> ShaderMap;

-    ShaderMap mShaderMap;

-

-    typedef std::map<GLint, Program*> ProgramMap;

-    ProgramMap mProgramMap;

-    gl::NameSpace<Program> mProgramShaderNameSpace;

-

+    gl::NameSpace<Program> mProgramNameSpace;

+	gl::NameSpace<Shader> mShaderNameSpace;

+	gl::NameSpace<void> mProgramShaderNameSpace;   // Shaders and programs share a namespace

     gl::NameSpace<Texture> mTextureNameSpace;

     gl::NameSpace<Renderbuffer> mRenderbufferNameSpace;

 	gl::NameSpace<Sampler> mSamplerNameSpace;