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
parent 12394cf7
...@@ -142,6 +142,7 @@ Program::Program(ResourceManager *manager, GLuint handle) : mResourceManager(man ...@@ -142,6 +142,7 @@ Program::Program(ResourceManager *manager, GLuint handle) : mResourceManager(man
mVertexShader = NULL; mVertexShader = NULL;
mProgramBinary = NULL; mProgramBinary = NULL;
mDeleteStatus = false; mDeleteStatus = false;
mLinked = false;
mRefCount = 0; mRefCount = 0;
} }
...@@ -247,14 +248,9 @@ bool Program::link() ...@@ -247,14 +248,9 @@ bool Program::link()
mInfoLog.reset(); mInfoLog.reset();
mProgramBinary = new ProgramBinary; mProgramBinary = new ProgramBinary;
if (!mProgramBinary->link(mInfoLog, mAttributeBindings, mFragmentShader, mVertexShader)) mLinked = mProgramBinary->link(mInfoLog, mAttributeBindings, mFragmentShader, mVertexShader);
{
unlink(false);
return false;
}
return true; return mLinked;
} }
int AttributeBindings::getAttributeBinding(const std::string &name) const int AttributeBindings::getAttributeBinding(const std::string &name) const
...@@ -293,6 +289,12 @@ void Program::unlink(bool destroy) ...@@ -293,6 +289,12 @@ void Program::unlink(bool destroy)
delete mProgramBinary; delete mProgramBinary;
mProgramBinary = NULL; mProgramBinary = NULL;
} }
mLinked = false;
}
bool Program::isLinked()
{
return mLinked;
} }
ProgramBinary* Program::getProgramBinary() ProgramBinary* Program::getProgramBinary()
...@@ -307,15 +309,14 @@ bool Program::setProgramBinary(const void *binary, GLsizei length) ...@@ -307,15 +309,14 @@ bool Program::setProgramBinary(const void *binary, GLsizei length)
mInfoLog.reset(); mInfoLog.reset();
mProgramBinary = new ProgramBinary; mProgramBinary = new ProgramBinary;
if (!mProgramBinary->load(mInfoLog, binary, length)) mLinked = mProgramBinary->load(mInfoLog, binary, length);
if (!mLinked)
{ {
delete mProgramBinary; delete mProgramBinary;
mProgramBinary = NULL; mProgramBinary = NULL;
return false;
} }
return true; return mLinked;
} }
void Program::release() void Program::release()
...@@ -498,7 +499,7 @@ void Program::validate() ...@@ -498,7 +499,7 @@ void Program::validate()
{ {
mInfoLog.reset(); mInfoLog.reset();
if (mProgramBinary) if (isLinked() && mProgramBinary)
{ {
mProgramBinary->validate(mInfoLog); mProgramBinary->validate(mInfoLog);
} }
......
...@@ -69,6 +69,7 @@ class Program ...@@ -69,6 +69,7 @@ class Program
void bindAttributeLocation(GLuint index, const char *name); void bindAttributeLocation(GLuint index, const char *name);
bool link(); bool link();
bool isLinked();
bool setProgramBinary(const void *binary, GLsizei length); bool setProgramBinary(const void *binary, GLsizei length);
ProgramBinary *getProgramBinary(); ProgramBinary *getProgramBinary();
...@@ -106,6 +107,7 @@ class Program ...@@ -106,6 +107,7 @@ class Program
AttributeBindings mAttributeBindings; AttributeBindings mAttributeBindings;
ProgramBinary* mProgramBinary; ProgramBinary* mProgramBinary;
bool mLinked;
bool mDeleteStatus; // Flag to indicate that the program can be deleted when no longer in use bool mDeleteStatus; // Flag to indicate that the program can be deleted when no longer in use
unsigned int mRefCount; unsigned int mRefCount;
......
...@@ -2939,7 +2939,7 @@ int __stdcall glGetAttribLocation(GLuint program, const GLchar* name) ...@@ -2939,7 +2939,7 @@ int __stdcall glGetAttribLocation(GLuint program, const GLchar* name)
} }
gl::ProgramBinary *programBinary = programObject->getProgramBinary(); gl::ProgramBinary *programBinary = programObject->getProgramBinary();
if (!programBinary) if (!programObject->isLinked() || !programBinary)
{ {
return error(GL_INVALID_OPERATION, -1); return error(GL_INVALID_OPERATION, -1);
} }
...@@ -3398,7 +3398,7 @@ void __stdcall glGetProgramiv(GLuint program, GLenum pname, GLint* params) ...@@ -3398,7 +3398,7 @@ void __stdcall glGetProgramiv(GLuint program, GLenum pname, GLint* params)
*params = programObject->isFlaggedForDeletion(); *params = programObject->isFlaggedForDeletion();
return; return;
case GL_LINK_STATUS: case GL_LINK_STATUS:
*params = programObject->getProgramBinary() != NULL; *params = programObject->isLinked();
return; return;
case GL_VALIDATE_STATUS: case GL_VALIDATE_STATUS:
*params = programObject->isValidated(); *params = programObject->isValidated();
...@@ -3963,7 +3963,7 @@ void __stdcall glGetnUniformfvEXT(GLuint program, GLint location, GLsizei bufSiz ...@@ -3963,7 +3963,7 @@ void __stdcall glGetnUniformfvEXT(GLuint program, GLint location, GLsizei bufSiz
gl::Program *programObject = context->getProgram(program); gl::Program *programObject = context->getProgram(program);
if (!programObject) if (!programObject || !programObject->isLinked())
{ {
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
} }
...@@ -4003,7 +4003,7 @@ void __stdcall glGetUniformfv(GLuint program, GLint location, GLfloat* params) ...@@ -4003,7 +4003,7 @@ void __stdcall glGetUniformfv(GLuint program, GLint location, GLfloat* params)
gl::Program *programObject = context->getProgram(program); gl::Program *programObject = context->getProgram(program);
if (!programObject) if (!programObject || !programObject->isLinked())
{ {
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
} }
...@@ -4049,7 +4049,7 @@ void __stdcall glGetnUniformivEXT(GLuint program, GLint location, GLsizei bufSiz ...@@ -4049,7 +4049,7 @@ void __stdcall glGetnUniformivEXT(GLuint program, GLint location, GLsizei bufSiz
gl::Program *programObject = context->getProgram(program); gl::Program *programObject = context->getProgram(program);
if (!programObject) if (!programObject || !programObject->isLinked())
{ {
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
} }
...@@ -4089,7 +4089,7 @@ void __stdcall glGetUniformiv(GLuint program, GLint location, GLint* params) ...@@ -4089,7 +4089,7 @@ void __stdcall glGetUniformiv(GLuint program, GLint location, GLint* params)
gl::Program *programObject = context->getProgram(program); gl::Program *programObject = context->getProgram(program);
if (!programObject) if (!programObject || !programObject->isLinked())
{ {
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
} }
...@@ -4142,7 +4142,7 @@ int __stdcall glGetUniformLocation(GLuint program, const GLchar* name) ...@@ -4142,7 +4142,7 @@ int __stdcall glGetUniformLocation(GLuint program, const GLchar* name)
} }
gl::ProgramBinary *programBinary = programObject->getProgramBinary(); gl::ProgramBinary *programBinary = programObject->getProgramBinary();
if (!programBinary) if (!programObject->isLinked() || !programBinary)
{ {
return error(GL_INVALID_OPERATION, -1); return error(GL_INVALID_OPERATION, -1);
} }
...@@ -6425,7 +6425,7 @@ void __stdcall glUseProgram(GLuint program) ...@@ -6425,7 +6425,7 @@ void __stdcall glUseProgram(GLuint program)
} }
} }
if (program != 0 && !programObject->getProgramBinary()) if (program != 0 && !programObject->isLinked())
{ {
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
} }
...@@ -6848,7 +6848,7 @@ void __stdcall glGetProgramBinaryOES(GLuint program, GLsizei bufSize, GLsizei *l ...@@ -6848,7 +6848,7 @@ void __stdcall glGetProgramBinaryOES(GLuint program, GLsizei bufSize, GLsizei *l
{ {
gl::Program *programObject = context->getProgram(program); gl::Program *programObject = context->getProgram(program);
if (!programObject) if (!programObject || !programObject->isLinked())
{ {
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
} }
......
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