From 812eaae502c1e728d1ba485197a59e14fae7ce79 Mon Sep 17 00:00:00 2001 From: Dan Royer Date: Tue, 9 Jan 2024 08:45:36 -0800 Subject: [PATCH] faster lookup of uniform locations --- .../ro3/apps/viewport/ShaderProgram.java | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/marginallyclever/ro3/apps/viewport/ShaderProgram.java b/src/main/java/com/marginallyclever/ro3/apps/viewport/ShaderProgram.java index 42d294d54..1ceda6aaa 100644 --- a/src/main/java/com/marginallyclever/ro3/apps/viewport/ShaderProgram.java +++ b/src/main/java/com/marginallyclever/ro3/apps/viewport/ShaderProgram.java @@ -10,6 +10,8 @@ import javax.vecmath.Vector3d; import java.awt.*; import java.security.InvalidParameterException; +import java.util.HashMap; +import java.util.Map; /** *

{@link ShaderProgram} is a wrapper for vertex and fragment shader programs. It also provides a simple interface @@ -20,14 +22,19 @@ public class ShaderProgram { private final int programId; private final int vertexShaderId; private final int fragmentShaderId; + private final Map uniformLocations = new HashMap<>(); public ShaderProgram(GL3 gl, String[] vertexCode, String[] fragmentCode) { vertexShaderId = loadShader(gl, GL3.GL_VERTEX_SHADER, vertexCode,"vertex"); fragmentShaderId = loadShader(gl, GL3.GL_FRAGMENT_SHADER, fragmentCode,"fragment"); + programId = gl.glCreateProgram(); + gl.glAttachShader(programId, vertexShaderId); gl.glAttachShader(programId, fragmentShaderId); + gl.glLinkProgram(programId); + if (!checkStatus(gl, programId, GL3.GL_LINK_STATUS)) { throw new IllegalStateException("Failed to link shader program."); } @@ -96,8 +103,12 @@ public int getProgramId() { } public int getUniformLocation(GL3 gl, String name) { - int result = gl.glGetUniformLocation(programId, name); - if(result==-1) throw new InvalidParameterException("Could not find uniform "+name); + Integer result = uniformLocations.get(name); + if(result == null) { + result = gl.glGetUniformLocation(programId, name); + if(result==-1) throw new InvalidParameterException("Could not find uniform "+name); + uniformLocations.put(name,result); + } return result; }