From f5700934ad1e817a121cc5f15358f624cd735344 Mon Sep 17 00:00:00 2001 From: Eric Wasylishen Date: Thu, 23 Oct 2014 00:02:23 -0600 Subject: [PATCH] Delete shader before generating new ones --- quakespasm/Quake/gl_rmisc.c | 53 ++++++++++++++++++++++++++++++++++++ quakespasm/Quake/gl_vidsdl.c | 1 + quakespasm/Quake/glquake.h | 3 ++ quakespasm/Quake/r_alias.c | 40 --------------------------- 4 files changed, 57 insertions(+), 40 deletions(-) diff --git a/quakespasm/Quake/gl_rmisc.c b/quakespasm/Quake/gl_rmisc.c index 89619914..62b035be 100644 --- a/quakespasm/Quake/gl_rmisc.c +++ b/quakespasm/Quake/gl_rmisc.c @@ -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; +} diff --git a/quakespasm/Quake/gl_vidsdl.c b/quakespasm/Quake/gl_vidsdl.c index cce99bcf..453362d1 100644 --- a/quakespasm/Quake/gl_vidsdl.c +++ b/quakespasm/Quake/gl_vidsdl.c @@ -1122,6 +1122,7 @@ static void GL_Init (void) } //johnfitz + R_DeleteShaders (); GLAlias_CreateShaders (); } diff --git a/quakespasm/Quake/glquake.h b/quakespasm/Quake/glquake.h index d77c78a5..69e5fb5b 100644 --- a/quakespasm/Quake/glquake.h +++ b/quakespasm/Quake/glquake.h @@ -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); diff --git a/quakespasm/Quake/r_alias.c b/quakespasm/Quake/r_alias.c index c18f6a94..830abd88 100644 --- a/quakespasm/Quake/r_alias.c +++ b/quakespasm/Quake/r_alias.c @@ -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;