Delete shader before generating new ones

This commit is contained in:
Eric Wasylishen 2014-10-23 00:02:23 -06:00
parent 9daba0e399
commit f5700934ad
4 changed files with 57 additions and 40 deletions

View file

@ -321,3 +321,56 @@ void R_TimeRefresh_f (void)
void D_FlushCaches (void)
{
}
static GLuint gl_arb_programs[16];
static int gl_num_arb_programs = 0;
// from RMQEngine
GLuint GL_CreateProgram (const GLchar *source)
{
GLuint progid;
GLint errPos;
const GLubyte *errString;
GLenum errGLErr;
GL_GenProgramsARBFunc (1, &progid);
GL_BindProgramARBFunc (GL_VERTEX_PROGRAM_ARB, progid);
errGLErr = glGetError ();
GL_ProgramStringARBFunc (GL_VERTEX_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, strlen (source), source);
errGLErr = glGetError ();
// Find the error position
glGetIntegerv (GL_PROGRAM_ERROR_POSITION_ARB, &errPos);
errString = glGetString (GL_PROGRAM_ERROR_STRING_ARB);
if (errGLErr != GL_NO_ERROR) Con_Printf ("Generic OpenGL Error\n");
if (errPos != -1) Con_Printf ("Program error at position: %d\n", errPos);
if (errString && errString[0]) Con_Printf ("Program error: %s\n", errString);
if ((errPos != -1) || (errString && errString[0]) || (errGLErr != GL_NO_ERROR))
{
Con_Printf ("Program:\n%s\n", source);
GL_DeleteProgramsARBFunc (1, &progid);
GL_BindProgramARBFunc (GL_VERTEX_PROGRAM_ARB, 0);
return 0;
}
else
{
if (gl_num_arb_programs == (sizeof(gl_arb_programs)/sizeof(GLuint)))
Host_Error("gl_arb_programs overflow");
gl_arb_programs[gl_num_arb_programs] = progid;
gl_num_arb_programs++;
GL_BindProgramARBFunc (GL_VERTEX_PROGRAM_ARB, 0);
return progid;
}
}
void R_DeleteShaders (void)
{
GL_DeleteProgramsARBFunc (sizeof(gl_arb_programs)/sizeof(GLuint), gl_arb_programs);
memset (gl_arb_programs, 0, sizeof(gl_arb_programs));
gl_num_arb_programs = 0;
}

View file

@ -1122,6 +1122,7 @@ static void GL_Init (void)
}
//johnfitz
R_DeleteShaders ();
GLAlias_CreateShaders ();
}

View file

@ -321,6 +321,9 @@ void R_DrawBrushModel_ShowTris (entity_t *e);
void R_DrawAliasModel_ShowTris (entity_t *e);
void R_DrawParticles_ShowTris (void);
GLuint GL_CreateProgram (const GLchar *source);
void R_DeleteShaders (void);
qboolean GLAlias_SupportsShaders (void);
void GLAlias_CreateShaders (void);
void GL_DrawAliasShadow (entity_t *e);

View file

@ -86,46 +86,6 @@ void *GLARB_GetNormalOffset (aliashdr_t *hdr, int pose)
return (void *)(currententity->model->vboxyzofs + (hdr->numverts_vbo * pose * sizeof (meshxyz_t)) + normaloffs);
}
// from RMQEngine
GLuint GL_CreateProgram (const GLchar *source)
{
GLuint progid;
GLint errPos;
const GLubyte *errString;
GLenum errGLErr;
GL_GenProgramsARBFunc (1, &progid);
GL_BindProgramARBFunc (GL_VERTEX_PROGRAM_ARB, progid);
errGLErr = glGetError ();
GL_ProgramStringARBFunc (GL_VERTEX_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, strlen (source), source);
errGLErr = glGetError ();
// Find the error position
glGetIntegerv (GL_PROGRAM_ERROR_POSITION_ARB, &errPos);
errString = glGetString (GL_PROGRAM_ERROR_STRING_ARB);
if (errGLErr != GL_NO_ERROR) Con_Printf ("Generic OpenGL Error\n");
if (errPos != -1) Con_Printf ("Program error at position: %d\n", errPos);
if (errString && errString[0]) Con_Printf ("Program error: %s\n", errString);
if ((errPos != -1) || (errString && errString[0]) || (errGLErr != GL_NO_ERROR))
{
Con_Printf ("Program:\n%s\n", source);
GL_DeleteProgramsARBFunc (1, &progid);
GL_BindProgramARBFunc (GL_VERTEX_PROGRAM_ARB, 0);
return 0;
}
else
{
// gl_arb_programs[gl_num_arb_programs] = progid;
// gl_num_arb_programs++;
GL_BindProgramARBFunc (GL_VERTEX_PROGRAM_ARB, 0);
return progid;
}
}
qboolean GLAlias_SupportsShaders (void)
{
return gl_arb_vp_able && gl_vbo_able && gl_max_texture_units >= 3;