From 619fb6633a490e7c27300d490f9d5eb7a9a3095d Mon Sep 17 00:00:00 2001 From: Gustas <37534529+PunkPun@users.noreply.github.com> Date: Sun, 27 Aug 2023 18:23:12 +0300 Subject: [PATCH] Cache uniform locations --- OpenRA.Platforms.Default/Shader.cs | 32 +++++++++++------------------- 1 file changed, 12 insertions(+), 20 deletions(-) diff --git a/OpenRA.Platforms.Default/Shader.cs b/OpenRA.Platforms.Default/Shader.cs index fafd6e2a41..68bb2e89d4 100644 --- a/OpenRA.Platforms.Default/Shader.cs +++ b/OpenRA.Platforms.Default/Shader.cs @@ -25,6 +25,7 @@ namespace OpenRA.Platforms.Default readonly Dictionary samplers = new(); readonly Dictionary legacySizeUniforms = new(); + readonly Dictionary uniformCache = new(); readonly Dictionary textures = new(); readonly Queue unbindTextures = new(); readonly uint program; @@ -121,15 +122,17 @@ namespace OpenRA.Platforms.Default { var sb = new StringBuilder(128); OpenGL.glGetActiveUniform(program, i, 128, out _, out _, out var type, sb); - var sampler = sb.ToString(); OpenGL.CheckGLError(); + var sampler = sb.ToString(); + var loc = OpenGL.glGetUniformLocation(program, sampler); + OpenGL.CheckGLError(); + uniformCache[sampler] = loc; + if (type == OpenGL.GL_SAMPLER_2D) { samplers.Add(sampler, nextTexUnit); - var loc = OpenGL.glGetUniformLocation(program, sampler); - OpenGL.CheckGLError(); OpenGL.glUniform1i(loc, nextTexUnit); OpenGL.CheckGLError(); @@ -194,9 +197,7 @@ namespace OpenRA.Platforms.Default VerifyThreadAffinity(); OpenGL.glUseProgram(program); OpenGL.CheckGLError(); - var param = OpenGL.glGetUniformLocation(program, name); - OpenGL.CheckGLError(); - OpenGL.glUniform1i(param, value ? 1 : 0); + OpenGL.glUniform1i(uniformCache[name], value ? 1 : 0); OpenGL.CheckGLError(); } @@ -205,9 +206,7 @@ namespace OpenRA.Platforms.Default VerifyThreadAffinity(); OpenGL.glUseProgram(program); OpenGL.CheckGLError(); - var param = OpenGL.glGetUniformLocation(program, name); - OpenGL.CheckGLError(); - OpenGL.glUniform1f(param, x); + OpenGL.glUniform1f(uniformCache[name], x); OpenGL.CheckGLError(); } @@ -216,9 +215,7 @@ namespace OpenRA.Platforms.Default VerifyThreadAffinity(); OpenGL.glUseProgram(program); OpenGL.CheckGLError(); - var param = OpenGL.glGetUniformLocation(program, name); - OpenGL.CheckGLError(); - OpenGL.glUniform2f(param, x, y); + OpenGL.glUniform2f(uniformCache[name], x, y); OpenGL.CheckGLError(); } @@ -227,17 +224,14 @@ namespace OpenRA.Platforms.Default VerifyThreadAffinity(); OpenGL.glUseProgram(program); OpenGL.CheckGLError(); - var param = OpenGL.glGetUniformLocation(program, name); - OpenGL.CheckGLError(); - OpenGL.glUniform3f(param, x, y, z); + OpenGL.glUniform3f(uniformCache[name], x, y, z); OpenGL.CheckGLError(); } public void SetVec(string name, float[] vec, int length) { VerifyThreadAffinity(); - var param = OpenGL.glGetUniformLocation(program, name); - OpenGL.CheckGLError(); + var param = uniformCache[name]; unsafe { fixed (float* pVec = vec) @@ -265,13 +259,11 @@ namespace OpenRA.Platforms.Default OpenGL.glUseProgram(program); OpenGL.CheckGLError(); - var param = OpenGL.glGetUniformLocation(program, name); - OpenGL.CheckGLError(); unsafe { fixed (float* pMtx = mtx) - OpenGL.glUniformMatrix4fv(param, 1, false, new IntPtr(pMtx)); + OpenGL.glUniformMatrix4fv(uniformCache[name], 1, false, new IntPtr(pMtx)); } OpenGL.CheckGLError();