From 0758a8caec0524e0f297885474a6b2c73a51084b Mon Sep 17 00:00:00 2001 From: Hannu Hanhi Date: Sun, 19 Apr 2020 01:35:38 +0300 Subject: [PATCH 1/3] Optimization: Don't reset shader program at end of DrawPolygon, instead reset it in UnSetShader --- src/hardware/r_opengl/r_opengl.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/hardware/r_opengl/r_opengl.c b/src/hardware/r_opengl/r_opengl.c index 63e86c7fb..27f82cc82 100644 --- a/src/hardware/r_opengl/r_opengl.c +++ b/src/hardware/r_opengl/r_opengl.c @@ -1073,6 +1073,7 @@ EXPORT void HWRAPI(UnSetShader) (void) #ifdef GL_SHADERS gl_shadersenabled = false; gl_currentshaderprogram = 0; + pglUseProgram(0); #endif } @@ -2054,10 +2055,6 @@ EXPORT void HWRAPI(DrawPolygon) (FSurfaceInfo *pSurf, FOutVector *pOutVerts, FUI if (PolyFlags & PF_ForceWrapY) Clamp2D(GL_TEXTURE_WRAP_T); - -#ifdef GL_SHADERS - pglUseProgram(0); -#endif } typedef struct vbo_vertex_s From c0c095e1d1e4873968bcbe260992549e27b92ec6 Mon Sep 17 00:00:00 2001 From: Hannu Hanhi Date: Sun, 19 Apr 2020 01:54:46 +0300 Subject: [PATCH 2/3] Optimization: only call pglUseProgram if shader actually needs changing --- src/hardware/r_opengl/r_opengl.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/hardware/r_opengl/r_opengl.c b/src/hardware/r_opengl/r_opengl.c index 27f82cc82..bf385aead 100644 --- a/src/hardware/r_opengl/r_opengl.c +++ b/src/hardware/r_opengl/r_opengl.c @@ -583,6 +583,7 @@ static PFNglGetUniformLocation pglGetUniformLocation; static char *gl_customvertexshaders[MAXSHADERS]; static char *gl_customfragmentshaders[MAXSHADERS]; static GLuint gl_currentshaderprogram = 0; +static boolean gl_shaderprogramchanged = true; // 13062019 typedef enum @@ -1058,8 +1059,12 @@ EXPORT void HWRAPI(SetShader) (int shader) #ifdef GL_SHADERS if (gl_allowshaders) { + if ((GLuint)shader != gl_currentshaderprogram) + { + gl_currentshaderprogram = shader; + gl_shaderprogramchanged = true; + } gl_shadersenabled = true; - gl_currentshaderprogram = shader; return; } #else @@ -1868,7 +1873,11 @@ static void *Shader_Load(FSurfaceInfo *Surface, GLRGBAFloat *poly, GLRGBAFloat * gl_shaderprogram_t *shader = &gl_shaderprograms[gl_currentshaderprogram]; if (shader->program) { - pglUseProgram(gl_shaderprograms[gl_currentshaderprogram].program); + if (gl_shaderprogramchanged) + { + pglUseProgram(gl_shaderprograms[gl_currentshaderprogram].program); + gl_shaderprogramchanged = false; + } Shader_SetUniforms(Surface, poly, tint, fade); return shader; } From 78c2928b8b3e4be52642428fd202dd25b6df3a67 Mon Sep 17 00:00:00 2001 From: Hannu Hanhi Date: Sun, 19 Apr 2020 01:55:27 +0300 Subject: [PATCH 3/3] Optimization: also don't reset shader on models --- src/hardware/r_opengl/r_opengl.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/hardware/r_opengl/r_opengl.c b/src/hardware/r_opengl/r_opengl.c index bf385aead..d80de8aad 100644 --- a/src/hardware/r_opengl/r_opengl.c +++ b/src/hardware/r_opengl/r_opengl.c @@ -2856,10 +2856,6 @@ static void DrawModelEx(model_t *model, INT32 frameIndex, INT32 duration, INT32 pglShadeModel(GL_FLAT); } #endif - -#ifdef GL_SHADERS - pglUseProgram(0); -#endif } // -----------------+