Skip to content

Commit

Permalink
Fixed GL error related to shader recompilation - see comment in code
Browse files Browse the repository at this point in the history
  • Loading branch information
sopyer committed Nov 5, 2011
1 parent 9989d7a commit 280d5f1
Showing 1 changed file with 42 additions and 30 deletions.
72 changes: 42 additions & 30 deletions SDK/Framework/ShaderEditOverlay.cpp
Expand Up @@ -352,58 +352,70 @@ void ShaderEditOverlay::saveShaderSource()

void ShaderEditOverlay::compileProgram()
{
GLint lengthDoc;
TextRange tr;
char errbuf[65536];
GLint type;
GLint size;
GLint res;
GLuint sh;
GLuint prg;

lengthDoc = mShaderEditor.Command(SCI_GETLENGTH);
tr.chrg.cpMin = 0;
tr.chrg.cpMax = lengthDoc;
tr.lpstrText = (char*)malloc(lengthDoc+1);
mShaderEditor.Command(SCI_GETTEXTRANGE, 0, reinterpret_cast<LPARAM>(&tr));
saveShaderSource();

glShaderSource(mSelectedShader, 1, (const char**)&tr.lpstrText, &lengthDoc);
prg = glCreateProgram();

char errbuf[65536];
GLint type;
GLint size;
GLint res;
GLuint sh;
GLuint prg;
//Some string manipulation black magic to avoid ATI GL errors.
//It seems ATI GL runtime, when destroys programs, deletes shaders,
//which are marked for deletion, anyway without checking whether
//they are attached to other programs.
//If this bug is fixed, probably this code should be rewritten...
for (size_t i=0; i<mAttachedShaders.size(); ++i)
{
GLint len;
char* buf;

glGetShaderiv(mSelectedShader, GL_SHADER_TYPE, &type);
sh = glCreateShader(type);
glShaderSource(sh, 1, (const char**)&tr.lpstrText, &lengthDoc);
glCompileShader(sh);
glGetShaderInfoLog(sh, sizeof(errbuf), &size, errbuf);
glGetShaderiv(sh, GL_COMPILE_STATUS, &res);
glGetShaderiv(mAttachedShaders[i], GL_SHADER_TYPE, &type);
sh = glCreateShader(type);

if (!res) goto error;
glGetShaderiv(mAttachedShaders[i], GL_SHADER_SOURCE_LENGTH, &len);
buf = (char*)malloc(len);
glGetShaderSource(mAttachedShaders[i], len, &len, buf);
glShaderSource(sh, 1, (const char**)&buf, &len);
free(buf);

glCompileShader(mSelectedShader);
glGetShaderiv(mSelectedShader, GL_COMPILE_STATUS, &res);
assert(res);
glCompileShader(sh);

prg = glCreateProgram();
if (mAttachedShaders[i]==mSelectedShader)
glGetShaderInfoLog(sh, sizeof(errbuf), &size, errbuf);

for (size_t i=0; i<mAttachedShaders.size(); ++i)
{
glAttachShader(prg, mAttachedShaders[i]==mSelectedShader?sh:mAttachedShaders[i]);
glGetShaderiv(sh, GL_COMPILE_STATUS, &res);

if (!res)
{
glDeleteShader(sh);
goto error;
}

glAttachShader(prg, sh);

glDeleteShader(sh);
}

glLinkProgram(prg);
glGetProgramInfoLog(prg, sizeof(errbuf)-size, &size, errbuf+size);
glGetProgramiv(prg, GL_LINK_STATUS, &res);
if (res)
{
glCompileShader(mSelectedShader);
glGetShaderiv(mSelectedShader, GL_COMPILE_STATUS, &res);
assert(res);

glLinkProgram(mSelectedProgram);
glGetProgramiv(mSelectedProgram, GL_LINK_STATUS, &res);
assert(res);
}
glDeleteProgram(prg);

error:
free(tr.lpstrText);
glDeleteShader(sh);
//update result window
mDebugOutputView.Command(SCI_CANCEL);
mDebugOutputView.Command(SCI_SETREADONLY, false);
Expand Down

0 comments on commit 280d5f1

Please sign in to comment.