From Colin McDonald, "If the glCreateProgram in osg::Program fails for any reason, then subsequently

Program::PerContextProgram::linkProgram would crash.  I've put in some
checks to prevent that."
This commit is contained in:
Robert Osfield 2018-03-12 15:55:35 +00:00
parent 3f686d8719
commit 5c8a5307d6

View File

@ -656,8 +656,16 @@ Program::PerContextProgram::PerContextProgram(const Program* program, unsigned i
{ {
_extensions = GLExtensions::Get( _contextID, true ); _extensions = GLExtensions::Get( _contextID, true );
_glProgramHandle = _extensions->glCreateProgram(); _glProgramHandle = _extensions->glCreateProgram();
if (_glProgramHandle)
{
_ownsProgramHandle = true; _ownsProgramHandle = true;
} }
else
{
OSG_WARN << "Unable to create osg::Program \"" << _program->getName() << "\"" << " contextID=" << _contextID << std::endl;
}
}
requestLink(); requestLink();
} }
@ -682,6 +690,8 @@ void Program::PerContextProgram::linkProgram(osg::State& state)
if( ! _needsLink ) return; if( ! _needsLink ) return;
_needsLink = false; _needsLink = false;
if (!_glProgramHandle) return;
OSG_INFO << "Linking osg::Program \"" << _program->getName() << "\"" OSG_INFO << "Linking osg::Program \"" << _program->getName() << "\""
<< " id=" << _glProgramHandle << " id=" << _glProgramHandle
<< " contextID=" << _contextID << " contextID=" << _contextID
@ -709,7 +719,7 @@ void Program::PerContextProgram::linkProgram(osg::State& state)
if (!_loadedBinary) if (!_loadedBinary)
{ {
const GLsizei shaderMaxCount = 20; const GLsizei shaderMaxCount = 20;
GLsizei shadersCount; GLsizei shadersCount = 0;
GLuint shaderObjectHandle[shaderMaxCount]; GLuint shaderObjectHandle[shaderMaxCount];
_extensions->glGetAttachedShaders(_glProgramHandle, shaderMaxCount, &shadersCount, shaderObjectHandle); _extensions->glGetAttachedShaders(_glProgramHandle, shaderMaxCount, &shadersCount, shaderObjectHandle);
@ -1035,6 +1045,8 @@ void Program::PerContextProgram::linkProgram(osg::State& state)
bool Program::PerContextProgram::validateProgram() bool Program::PerContextProgram::validateProgram()
{ {
if (!_glProgramHandle) return false;
GLint validated = GL_FALSE; GLint validated = GL_FALSE;
_extensions->glValidateProgram( _glProgramHandle ); _extensions->glValidateProgram( _glProgramHandle );
_extensions->glGetProgramiv( _glProgramHandle, GL_VALIDATE_STATUS, &validated ); _extensions->glGetProgramiv( _glProgramHandle, GL_VALIDATE_STATUS, &validated );
@ -1057,11 +1069,15 @@ bool Program::PerContextProgram::validateProgram()
bool Program::PerContextProgram::getInfoLog( std::string& infoLog ) const bool Program::PerContextProgram::getInfoLog( std::string& infoLog ) const
{ {
if (!_glProgramHandle) return false;
return _extensions->getProgramInfoLog( _glProgramHandle, infoLog ); return _extensions->getProgramInfoLog( _glProgramHandle, infoLog );
} }
Program::ProgramBinary* Program::PerContextProgram::compileProgramBinary(osg::State& state) Program::ProgramBinary* Program::PerContextProgram::compileProgramBinary(osg::State& state)
{ {
if (!_glProgramHandle) return 0;
linkProgram(state); linkProgram(state);
GLint binaryLength = 0; GLint binaryLength = 0;
_extensions->glGetProgramiv( _glProgramHandle, GL_PROGRAM_BINARY_LENGTH, &binaryLength ); _extensions->glGetProgramiv( _glProgramHandle, GL_PROGRAM_BINARY_LENGTH, &binaryLength );
@ -1079,5 +1095,7 @@ Program::ProgramBinary* Program::PerContextProgram::compileProgramBinary(osg::St
void Program::PerContextProgram::useProgram() const void Program::PerContextProgram::useProgram() const
{ {
if (!_glProgramHandle) return;
_extensions->glUseProgram( _glProgramHandle ); _extensions->glUseProgram( _glProgramHandle );
} }