Skip to content

Commit

Permalink
Cache uniform locations
Browse files Browse the repository at this point in the history
  • Loading branch information
PunkPun committed Aug 27, 2023
1 parent bf64339 commit 27e6e97
Showing 1 changed file with 11 additions and 19 deletions.
30 changes: 11 additions & 19 deletions OpenRA.Platforms.Default/Shader.cs
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ sealed class Shader : ThreadAffine, IShader

readonly Dictionary<string, int> samplers = new();
readonly Dictionary<int, int> legacySizeUniforms = new();
readonly Dictionary<string, int> uniformCache = new();
readonly Dictionary<int, ITexture> textures = new();
readonly Queue<int> unbindTextures = new();
readonly uint program;
Expand Down Expand Up @@ -121,15 +122,17 @@ public Shader(string name)
{
var sb = new StringBuilder(128);
OpenGL.glGetActiveUniform(program, i, 128, out _, out _, out var type, sb);
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();

Expand Down Expand Up @@ -194,9 +197,7 @@ public void SetBool(string name, bool value)
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();
}

Expand All @@ -205,9 +206,7 @@ public void SetVec(string name, float x)
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();
}

Expand All @@ -216,9 +215,7 @@ public void SetVec(string name, float x, float y)
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();
}

Expand All @@ -227,17 +224,14 @@ public void SetVec(string name, float x, float y, float z)
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)
Expand Down Expand Up @@ -265,13 +259,11 @@ public void SetMatrix(string name, float[] mtx)

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();
Expand Down

0 comments on commit 27e6e97

Please sign in to comment.