Renderer: Cache uniform and attribute locations
This commit is contained in:
parent
bc3ba0dc56
commit
bda140ab73
@ -168,10 +168,12 @@ void OpenGl20Renderer::loadEffectConfig(String const& name, Json const& effectCo
|
|||||||
}
|
}
|
||||||
|
|
||||||
glUseProgram(m_program = program);
|
glUseProgram(m_program = program);
|
||||||
setupGlUniforms(m_program);
|
|
||||||
|
|
||||||
auto& effect = m_effects.emplace(name, Effect{ program, effectConfig, {}, {} }).first->second;
|
auto& effect = m_effects.emplace(name, Effect()).first->second;
|
||||||
|
effect.program = m_program;
|
||||||
|
effect.config = effectConfig;
|
||||||
m_currentEffect = &effect;
|
m_currentEffect = &effect;
|
||||||
|
setupGlUniforms(effect);
|
||||||
|
|
||||||
for (auto const& p : effectConfig.getObject("effectParameters", {})) {
|
for (auto const& p : effectConfig.getObject("effectParameters", {})) {
|
||||||
EffectParameter effectParameter;
|
EffectParameter effectParameter;
|
||||||
@ -303,7 +305,7 @@ bool OpenGl20Renderer::switchEffectConfig(String const& name) {
|
|||||||
Effect& effect = find->second;
|
Effect& effect = find->second;
|
||||||
|
|
||||||
glUseProgram(m_program = effect.program);
|
glUseProgram(m_program = effect.program);
|
||||||
setupGlUniforms(m_program);
|
setupGlUniforms(effect);
|
||||||
m_currentEffect = &effect;
|
m_currentEffect = &effect;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@ -825,21 +827,24 @@ void OpenGl20Renderer::renderGlBuffer(GlRenderBuffer const& renderBuffer, Mat3F
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void OpenGl20Renderer::setupGlUniforms(GLuint program) {
|
//Assumes the passed effect program is currently in use.
|
||||||
m_positionAttribute = glGetAttribLocation(program, "vertexPosition");
|
void OpenGl20Renderer::setupGlUniforms(Effect& effect) {
|
||||||
m_texCoordAttribute = glGetAttribLocation(program, "vertexTextureCoordinate");
|
GLuint program = effect.program;
|
||||||
m_texIndexAttribute = glGetAttribLocation(program, "vertexTextureIndex");
|
|
||||||
m_colorAttribute = glGetAttribLocation(program, "vertexColor");
|
m_positionAttribute = effect.getAttribute("vertexPosition");
|
||||||
m_param1Attribute = glGetAttribLocation(program, "vertexParam1");
|
m_texCoordAttribute = effect.getAttribute("vertexTextureCoordinate");
|
||||||
|
m_texIndexAttribute = effect.getAttribute("vertexTextureIndex");
|
||||||
|
m_colorAttribute = effect.getAttribute("vertexColor");
|
||||||
|
m_param1Attribute = effect.getAttribute("vertexParam1");
|
||||||
|
|
||||||
m_textureUniforms.clear();
|
m_textureUniforms.clear();
|
||||||
m_textureSizeUniforms.clear();
|
m_textureSizeUniforms.clear();
|
||||||
for (size_t i = 0; i < MultiTextureCount; ++i) {
|
for (size_t i = 0; i < MultiTextureCount; ++i) {
|
||||||
m_textureUniforms.append(glGetUniformLocation(program, strf("texture{}", i).c_str()));
|
m_textureUniforms.append(effect.getUniform(strf("texture{}", i).c_str()));
|
||||||
m_textureSizeUniforms.append(glGetUniformLocation(program, strf("textureSize{}", i).c_str()));
|
m_textureSizeUniforms.append(effect.getUniform(strf("textureSize{}", i).c_str()));
|
||||||
}
|
}
|
||||||
m_screenSizeUniform = glGetUniformLocation(program, "screenSize");
|
m_screenSizeUniform = effect.getUniform("screenSize");
|
||||||
m_vertexTransformUniform = glGetUniformLocation(program, "vertexTransform");
|
m_vertexTransformUniform = effect.getUniform("vertexTransform");
|
||||||
|
|
||||||
for (size_t i = 0; i < MultiTextureCount; ++i)
|
for (size_t i = 0; i < MultiTextureCount; ++i)
|
||||||
glUniform1i(m_textureUniforms[i], i);
|
glUniform1i(m_textureUniforms[i], i);
|
||||||
@ -847,4 +852,25 @@ void OpenGl20Renderer::setupGlUniforms(GLuint program) {
|
|||||||
glUniform2f(m_screenSizeUniform, m_screenSize[0], m_screenSize[1]);
|
glUniform2f(m_screenSizeUniform, m_screenSize[0], m_screenSize[1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GLuint OpenGl20Renderer::Effect::getAttribute(String const& name) {
|
||||||
|
auto find = attributes.find(name);
|
||||||
|
if (find == attributes.end()) {
|
||||||
|
GLuint attrib = glGetAttribLocation(program, name.utf8Ptr());
|
||||||
|
attributes[name] = attrib;
|
||||||
|
return attrib;
|
||||||
|
}
|
||||||
|
return find->second;
|
||||||
|
}
|
||||||
|
|
||||||
|
GLuint OpenGl20Renderer::Effect::getUniform(String const& name) {
|
||||||
|
auto find = uniforms.find(name);
|
||||||
|
if (find == uniforms.end()) {
|
||||||
|
GLuint uniform = glGetUniformLocation(program, name.utf8Ptr());
|
||||||
|
uniforms[name] = uniform;
|
||||||
|
return uniform;
|
||||||
|
}
|
||||||
|
return find->second;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -158,11 +158,18 @@ private:
|
|||||||
RefPtr<GlLoneTexture> textureValue;
|
RefPtr<GlLoneTexture> textureValue;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Effect {
|
class Effect {
|
||||||
|
public:
|
||||||
GLuint program;
|
GLuint program;
|
||||||
Json config;
|
Json config;
|
||||||
StringMap<EffectParameter> parameters;
|
StringMap<EffectParameter> parameters;
|
||||||
StringMap<EffectTexture> textures;
|
StringMap<EffectTexture> textures;
|
||||||
|
|
||||||
|
StringMap<GLuint> attributes;
|
||||||
|
StringMap<GLuint> uniforms;
|
||||||
|
|
||||||
|
GLuint getAttribute(String const& name);
|
||||||
|
GLuint getUniform(String const& name);
|
||||||
};
|
};
|
||||||
|
|
||||||
static bool logGlErrorSummary(String prefix);
|
static bool logGlErrorSummary(String prefix);
|
||||||
@ -176,7 +183,7 @@ private:
|
|||||||
|
|
||||||
void renderGlBuffer(GlRenderBuffer const& renderBuffer, Mat3F const& transformation);
|
void renderGlBuffer(GlRenderBuffer const& renderBuffer, Mat3F const& transformation);
|
||||||
|
|
||||||
void setupGlUniforms(GLuint program);
|
void setupGlUniforms(Effect& effect);
|
||||||
|
|
||||||
Vec2U m_screenSize;
|
Vec2U m_screenSize;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user