diff --git a/src/gl/gl_renderer.c b/src/gl/gl_renderer.c index 5a307d309..aacf6abaa 100644 --- a/src/gl/gl_renderer.c +++ b/src/gl/gl_renderer.c @@ -139,7 +139,7 @@ static void flushBatch(GLRenderer* gl) { if (gl->base.currentShader != -1) { GMLShader* shader = &gl->gmlShaders[gl->base.currentShader]; - GLShaderUniform* uniform = findShaderUniformByName(shader, "gm_BaseTexture"); + GLShaderUniform* uniform = shader->gmBaseTexture; if (uniform != nullptr) glActiveTexture(GL_TEXTURE0 + uniform->samplerSlot); glBindTexture(GL_TEXTURE_2D, gl->currentTextureId); @@ -251,6 +251,17 @@ static bool compileProgram(GMLShader* gmlShader, const char* name, const char* v gmlShader->uniforms[b].samplerSlot = samplerIndex; samplerIndex += 1; } + + if (strcmp(uniformName, "gm_BaseTexture") == 0) + gmlShader->gmBaseTexture = &gmlShader->uniforms[b]; + if (strcmp(uniformName, "gm_Matrices[0]") == 0) + gmlShader->gmMatrices = &gmlShader->uniforms[b]; + if (strcmp(uniformName, "gm_FogColour") == 0) + gmlShader->gmFogColour = &gmlShader->uniforms[b]; + if (strcmp(uniformName, "gm_AlphaTestEnabled") == 0) + gmlShader->gmAlphaTestEnabled = &gmlShader->uniforms[b]; + if (strcmp(uniformName, "gm_AlphaRefValue") == 0) + gmlShader->gmAlphaRefValue = &gmlShader->uniforms[b]; } gmlShader->shaderId = shaderId; @@ -508,13 +519,13 @@ static void glGpuSetShader(Renderer* renderer, int32_t shaderIndex) { glUseProgram(gmlShader->shaderId); //Gotta set those built-ins! they ain't gonna set themselves - GLShaderUniform* gmMatricesUniform = findShaderUniformByName(gmlShader, "gm_Matrices[0]"); - GLShaderUniform* gmFogColourUniform = findShaderUniformByName(gmlShader, "gm_FogColour"); + GLShaderUniform* gmMatricesUniform = gmlShader->gmMatrices; + GLShaderUniform* gmFogColourUniform = gmlShader->gmFogColour; //Lights are for another time - GLShaderUniform* gmAlphaTestEnabledUniform = findShaderUniformByName(gmlShader, "gm_AlphaTestEnabled"); - GLShaderUniform* gmAlphaRefValue = findShaderUniformByName(gmlShader, "gm_AlphaRefValue"); + GLShaderUniform* gmAlphaTestEnabledUniform = gmlShader->gmAlphaTestEnabled; + GLShaderUniform* gmAlphaRefValue = gmlShader->gmAlphaRefValue; Matrix4f flippedClip[MATRICES_MAX]; memcpy(flippedClip, renderer->gmlMatrices, sizeof(flippedClip)); @@ -2372,6 +2383,7 @@ static int32_t glGpuGetBlendMode(Renderer* renderer) { static void glGpuSetBlendMode(Renderer* renderer, int32_t mode) { GLRenderer* gl = (GLRenderer*) renderer; + if (mode == gl->currentBlendMode) return; flushBatch(gl); gl->currentBlendMode = mode; @@ -2386,6 +2398,8 @@ static void glGpuSetBlendMode(Renderer* renderer, int32_t mode) { static void glGpuSetBlendModeExt(Renderer* renderer, int32_t sfactor, int32_t dfactor, int32_t sfactor_alpha, int32_t dfactor_alpha) { GLRenderer* gl = (GLRenderer*) renderer; + if (sfactor == gl->currentSFactor && dfactor == gl->currentDFactor && \ + sfactor_alpha == gl->currentSFactorAlpha && dfactor_alpha == gl->currentDFactorAlpha) return; flushBatch(gl); gl->currentBlendMode = bm_complex; gl->currentSFactor = sfactor; @@ -2430,6 +2444,7 @@ static void glGpuSetAlphaTestRef(Renderer* renderer, uint8_t ref) { static void glGpuSetColorWriteEnable(Renderer* renderer, bool red, bool green, bool blue, bool alpha) { GLRenderer* gl = (GLRenderer*) renderer; + if (gl->colorWriteR == red && gl->colorWriteG == green && gl->colorWriteB == blue && gl->colorWriteA == alpha) return; flushBatch(gl); gl->colorWriteR = red; gl->colorWriteG = green; diff --git a/src/gl/gl_renderer.h b/src/gl/gl_renderer.h index 77103f524..afa34e453 100644 --- a/src/gl/gl_renderer.h +++ b/src/gl/gl_renderer.h @@ -30,6 +30,13 @@ typedef struct { bool compiled; uint32_t uniformCount; GLShaderUniform* uniforms; + + // cached uniforms + GLShaderUniform* gmBaseTexture; + GLShaderUniform* gmMatrices; + GLShaderUniform* gmFogColour; + GLShaderUniform* gmAlphaTestEnabled; + GLShaderUniform* gmAlphaRefValue; } GMLShader; typedef struct {