Refactor Program into Program and ProgramBinary.

Program manages the state and lifetime of the program object.

ProgramBinary holds the linked program and the code to do the linking.

There should be no functional change. WebGL conformance tests did not regress.
Review URL: https://codereview.appspot.com/6267047

git-svn-id: https://angleproject.googlecode.com/svn/trunk@1143 736b8ea6-26fd-11df-bfd4-992fa37f6226
diff --git a/src/libGLESv2/libGLESv2.cpp b/src/libGLESv2/libGLESv2.cpp
index 5970f33..fba16d4 100644
--- a/src/libGLESv2/libGLESv2.cpp
+++ b/src/libGLESv2/libGLESv2.cpp
@@ -2937,12 +2937,13 @@
                 }
             }
 
-            if (!programObject->isLinked())
+            gl::ProgramBinary *programBinary = programObject->getProgramBinary();
+            if (!programBinary)
             {
                 return error(GL_INVALID_OPERATION, -1);
             }
 
-            return programObject->getAttributeLocation(name);
+            return programBinary->getAttributeLocation(name);
         }
     }
     catch(std::bad_alloc&)
@@ -3396,7 +3397,7 @@
                 *params = programObject->isFlaggedForDeletion();
                 return;
               case GL_LINK_STATUS:
-                *params = programObject->isLinked();
+                *params = programObject->getProgramBinary() != NULL;
                 return;
               case GL_VALIDATE_STATUS:
                 *params = programObject->isValidated();
@@ -3944,12 +3945,18 @@
 
             gl::Program *programObject = context->getProgram(program);
 
-            if (!programObject || !programObject->isLinked())
+            if (!programObject)
             {
                 return error(GL_INVALID_OPERATION);
             }
 
-            if (!programObject->getUniformfv(location, &bufSize, params))
+            gl::ProgramBinary *programBinary = programObject->getProgramBinary();
+            if (!programBinary)
+            {
+                return error(GL_INVALID_OPERATION);
+            }
+
+            if (!programBinary->getUniformfv(location, &bufSize, params))
             {
                 return error(GL_INVALID_OPERATION);
             }
@@ -3978,12 +3985,18 @@
 
             gl::Program *programObject = context->getProgram(program);
 
-            if (!programObject || !programObject->isLinked())
+            if (!programObject)
             {
                 return error(GL_INVALID_OPERATION);
             }
 
-            if (!programObject->getUniformfv(location, NULL, params))
+            gl::ProgramBinary *programBinary = programObject->getProgramBinary();
+            if (!programBinary)
+            {
+                return error(GL_INVALID_OPERATION);
+            }
+
+            if (!programBinary->getUniformfv(location, NULL, params))
             {
                 return error(GL_INVALID_OPERATION);
             }
@@ -4018,17 +4031,18 @@
 
             gl::Program *programObject = context->getProgram(program);
 
-            if (!programObject || !programObject->isLinked())
-            {
-                return error(GL_INVALID_OPERATION);
-            }
-
             if (!programObject)
             {
                 return error(GL_INVALID_OPERATION);
             }
 
-            if (!programObject->getUniformiv(location, &bufSize, params))
+            gl::ProgramBinary *programBinary = programObject->getProgramBinary();
+            if (!programBinary)
+            {
+                return error(GL_INVALID_OPERATION);
+            }
+
+            if (!programBinary->getUniformiv(location, &bufSize, params))
             {
                 return error(GL_INVALID_OPERATION);
             }
@@ -4057,17 +4071,18 @@
 
             gl::Program *programObject = context->getProgram(program);
 
-            if (!programObject || !programObject->isLinked())
-            {
-                return error(GL_INVALID_OPERATION);
-            }
-
             if (!programObject)
             {
                 return error(GL_INVALID_OPERATION);
             }
 
-            if (!programObject->getUniformiv(location, NULL, params))
+            gl::ProgramBinary *programBinary = programObject->getProgramBinary();
+            if (!programBinary)
+            {
+                return error(GL_INVALID_OPERATION);
+            }
+
+            if (!programBinary->getUniformiv(location, NULL, params))
             {
                 return error(GL_INVALID_OPERATION);
             }
@@ -4108,12 +4123,13 @@
                 }
             }
 
-            if (!programObject->isLinked())
+            gl::ProgramBinary *programBinary = programObject->getProgramBinary();
+            if (!programBinary)
             {
                 return error(GL_INVALID_OPERATION, -1);
             }
 
-            return programObject->getUniformLocation(name);
+            return programBinary->getUniformLocation(name);
         }
     }
     catch(std::bad_alloc&)
@@ -5844,7 +5860,13 @@
                 return error(GL_INVALID_OPERATION);
             }
 
-            if (!program->setUniform1fv(location, count, v))
+            gl::ProgramBinary *programBinary = program->getProgramBinary();
+            if (!programBinary)
+            {
+                return error(GL_INVALID_OPERATION);
+            }
+
+            if (!programBinary->setUniform1fv(location, count, v))
             {
                 return error(GL_INVALID_OPERATION);
             }
@@ -5888,7 +5910,13 @@
                 return error(GL_INVALID_OPERATION);
             }
 
-            if (!program->setUniform1iv(location, count, v))
+            gl::ProgramBinary *programBinary = program->getProgramBinary();
+            if (!programBinary)
+            {
+                return error(GL_INVALID_OPERATION);
+            }
+
+            if (!programBinary->setUniform1iv(location, count, v))
             {
                 return error(GL_INVALID_OPERATION);
             }
@@ -5934,7 +5962,13 @@
                 return error(GL_INVALID_OPERATION);
             }
 
-            if (!program->setUniform2fv(location, count, v))
+            gl::ProgramBinary *programBinary = program->getProgramBinary();
+            if (!programBinary)
+            {
+                return error(GL_INVALID_OPERATION);
+            }
+
+            if (!programBinary->setUniform2fv(location, count, v))
             {
                 return error(GL_INVALID_OPERATION);
             }
@@ -5980,7 +6014,13 @@
                 return error(GL_INVALID_OPERATION);
             }
 
-            if (!program->setUniform2iv(location, count, v))
+            gl::ProgramBinary *programBinary = program->getProgramBinary();
+            if (!programBinary)
+            {
+                return error(GL_INVALID_OPERATION);
+            }
+
+            if (!programBinary->setUniform2iv(location, count, v))
             {
                 return error(GL_INVALID_OPERATION);
             }
@@ -6026,7 +6066,13 @@
                 return error(GL_INVALID_OPERATION);
             }
 
-            if (!program->setUniform3fv(location, count, v))
+            gl::ProgramBinary *programBinary = program->getProgramBinary();
+            if (!programBinary)
+            {
+                return error(GL_INVALID_OPERATION);
+            }
+
+            if (!programBinary->setUniform3fv(location, count, v))
             {
                 return error(GL_INVALID_OPERATION);
             }
@@ -6072,7 +6118,13 @@
                 return error(GL_INVALID_OPERATION);
             }
 
-            if (!program->setUniform3iv(location, count, v))
+            gl::ProgramBinary *programBinary = program->getProgramBinary();
+            if (!programBinary)
+            {
+                return error(GL_INVALID_OPERATION);
+            }
+
+            if (!programBinary->setUniform3iv(location, count, v))
             {
                 return error(GL_INVALID_OPERATION);
             }
@@ -6118,7 +6170,13 @@
                 return error(GL_INVALID_OPERATION);
             }
 
-            if (!program->setUniform4fv(location, count, v))
+            gl::ProgramBinary *programBinary = program->getProgramBinary();
+            if (!programBinary)
+            {
+                return error(GL_INVALID_OPERATION);
+            }
+
+            if (!programBinary->setUniform4fv(location, count, v))
             {
                 return error(GL_INVALID_OPERATION);
             }
@@ -6164,7 +6222,13 @@
                 return error(GL_INVALID_OPERATION);
             }
 
-            if (!program->setUniform4iv(location, count, v))
+            gl::ProgramBinary *programBinary = program->getProgramBinary();
+            if (!programBinary)
+            {
+                return error(GL_INVALID_OPERATION);
+            }
+
+            if (!programBinary->setUniform4iv(location, count, v))
             {
                 return error(GL_INVALID_OPERATION);
             }
@@ -6204,7 +6268,13 @@
                 return error(GL_INVALID_OPERATION);
             }
 
-            if (!program->setUniformMatrix2fv(location, count, value))
+            gl::ProgramBinary *programBinary = program->getProgramBinary();
+            if (!programBinary)
+            {
+                return error(GL_INVALID_OPERATION);
+            }
+
+            if (!programBinary->setUniformMatrix2fv(location, count, value))
             {
                 return error(GL_INVALID_OPERATION);
             }
@@ -6244,7 +6314,13 @@
                 return error(GL_INVALID_OPERATION);
             }
 
-            if (!program->setUniformMatrix3fv(location, count, value))
+            gl::ProgramBinary *programBinary = program->getProgramBinary();
+            if (!programBinary)
+            {
+                return error(GL_INVALID_OPERATION);
+            }
+
+            if (!programBinary->setUniformMatrix3fv(location, count, value))
             {
                 return error(GL_INVALID_OPERATION);
             }
@@ -6284,7 +6360,13 @@
                 return error(GL_INVALID_OPERATION);
             }
 
-            if (!program->setUniformMatrix4fv(location, count, value))
+            gl::ProgramBinary *programBinary = program->getProgramBinary();
+            if (!programBinary)
+            {
+                return error(GL_INVALID_OPERATION);
+            }
+
+            if (!programBinary->setUniformMatrix4fv(location, count, value))
             {
                 return error(GL_INVALID_OPERATION);
             }
@@ -6320,7 +6402,7 @@
                 }
             }
 
-            if (program != 0 && !programObject->isLinked())
+            if (program != 0 && !programObject->getProgramBinary())
             {
                 return error(GL_INVALID_OPERATION);
             }
@@ -6358,7 +6440,13 @@
                 }
             }
 
-            programObject->validate();
+            gl::ProgramBinary *programBinary = programObject->getProgramBinary();
+            if (!programBinary)
+            {
+                return;
+            }
+
+            programBinary->validate();
         }
     }
     catch(std::bad_alloc&)