Restore the explicit isLinked() method for Programs and fix link().
Trac #21270
Bug=351
Signed-off-by: Nicolas Capens
If link fails we still need to keep the failed binary around for information
such as number of active attributes, varyings, etc.
Thus we can no longer use the presence of a binary to tell us if we've successfully
linked a program object.
git-svn-id: https://angleproject.googlecode.com/svn/trunk@1241 736b8ea6-26fd-11df-bfd4-992fa37f6226
diff --git a/src/libGLESv2/Program.cpp b/src/libGLESv2/Program.cpp
index b0509ab..3923035 100644
--- a/src/libGLESv2/Program.cpp
+++ b/src/libGLESv2/Program.cpp
@@ -142,6 +142,7 @@
mVertexShader = NULL;
mProgramBinary = NULL;
mDeleteStatus = false;
+ mLinked = false;
mRefCount = 0;
}
@@ -247,14 +248,9 @@
mInfoLog.reset();
mProgramBinary = new ProgramBinary;
- if (!mProgramBinary->link(mInfoLog, mAttributeBindings, mFragmentShader, mVertexShader))
- {
- unlink(false);
+ mLinked = mProgramBinary->link(mInfoLog, mAttributeBindings, mFragmentShader, mVertexShader);
- return false;
- }
-
- return true;
+ return mLinked;
}
int AttributeBindings::getAttributeBinding(const std::string &name) const
@@ -293,6 +289,12 @@
delete mProgramBinary;
mProgramBinary = NULL;
}
+ mLinked = false;
+}
+
+bool Program::isLinked()
+{
+ return mLinked;
}
ProgramBinary* Program::getProgramBinary()
@@ -307,15 +309,14 @@
mInfoLog.reset();
mProgramBinary = new ProgramBinary;
- if (!mProgramBinary->load(mInfoLog, binary, length))
+ mLinked = mProgramBinary->load(mInfoLog, binary, length);
+ if (!mLinked)
{
delete mProgramBinary;
mProgramBinary = NULL;
-
- return false;
}
- return true;
+ return mLinked;
}
void Program::release()
@@ -498,7 +499,7 @@
{
mInfoLog.reset();
- if (mProgramBinary)
+ if (isLinked() && mProgramBinary)
{
mProgramBinary->validate(mInfoLog);
}