Deleting program does not delete shaders that are marked

TRAC #12012

Also fixes failure to delete flagged program upon glUseProgram(0).

Signed-off-by: Nicolas Capens
Signed-off-by: Daniel Koch

Author:    Andrew Lewycky

git-svn-id: https://angleproject.googlecode.com/svn/trunk@201 736b8ea6-26fd-11df-bfd4-992fa37f6226
diff --git a/src/libGLESv2/Context.cpp b/src/libGLESv2/Context.cpp
index a60d7d9..9903870 100644
--- a/src/libGLESv2/Context.cpp
+++ b/src/libGLESv2/Context.cpp
@@ -550,12 +550,13 @@
 {
     Program *programObject = getCurrentProgram();
 
+    GLuint priorProgram = currentProgram;
+    currentProgram = program;               // Must switch before trying to delete, otherwise it only gets flagged.
+
     if (programObject && programObject->isFlaggedForDeletion())
     {
-        deleteProgram(currentProgram);
+        deleteProgram(priorProgram);
     }
-
-    currentProgram = program;
 }
 
 void Context::setFramebufferZero(Framebuffer *buffer)
diff --git a/src/libGLESv2/Program.cpp b/src/libGLESv2/Program.cpp
index aa74319..18a46c0 100644
--- a/src/libGLESv2/Program.cpp
+++ b/src/libGLESv2/Program.cpp
@@ -58,6 +58,16 @@
 Program::~Program()
 {
     unlink(true);
+
+    if (mVertexShader != NULL)
+    {
+        mVertexShader->detach();
+    }
+
+    if (mFragmentShader != NULL)
+    {
+        mFragmentShader->detach();
+    }
 }
 
 bool Program::attachShader(Shader *shader)
diff --git a/src/libGLESv2/Shader.cpp b/src/libGLESv2/Shader.cpp
index 2abbd61..65799c4 100644
--- a/src/libGLESv2/Shader.cpp
+++ b/src/libGLESv2/Shader.cpp
@@ -185,6 +185,11 @@
 void Shader::detach()
 {
     mAttachCount--;
+
+    if (mAttachCount == 0 && mDeleteStatus)
+    {
+        getContext()->deleteShader(mHandle);
+    }
 }
 
 bool Shader::isAttached() const
@@ -192,11 +197,6 @@
     return mAttachCount > 0;
 }
 
-bool Shader::isDeletable() const
-{
-    return mDeleteStatus == true && mAttachCount == 0;
-}
-
 bool Shader::isFlaggedForDeletion() const
 {
     return mDeleteStatus;
diff --git a/src/libGLESv2/Shader.h b/src/libGLESv2/Shader.h
index 86ead44..7d2553a 100644
--- a/src/libGLESv2/Shader.h
+++ b/src/libGLESv2/Shader.h
@@ -44,7 +44,6 @@
     void attach();
     void detach();
     bool isAttached() const;
-    bool isDeletable() const;
     bool isFlaggedForDeletion() const;
     void flagForDeletion();
 
diff --git a/src/libGLESv2/libGLESv2.cpp b/src/libGLESv2/libGLESv2.cpp
index 5bf0d14..a6c1e11 100644
--- a/src/libGLESv2/libGLESv2.cpp
+++ b/src/libGLESv2/libGLESv2.cpp
@@ -1346,11 +1346,6 @@
             {
                 return error(GL_INVALID_OPERATION);
             }
-
-            if (shaderObject->isDeletable())
-            {
-                context->deleteShader(shader);
-            }
         }
     }
     catch(std::bad_alloc&)