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;
 		}