From c0c095e1d1e4873968bcbe260992549e27b92ec6 Mon Sep 17 00:00:00 2001 From: Hannu Hanhi <hhanhipublic@gmail.com> Date: Sun, 19 Apr 2020 01:54:46 +0300 Subject: [PATCH] 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; }