From 4806b6c4c101694e79f81774201d2d7d56d8674e Mon Sep 17 00:00:00 2001 From: ExMix Date: Sat, 18 Oct 2014 10:25:25 +0300 Subject: [PATCH] [core] change program and uniforms only if it changed --- graphics/opengl/gl_render_context.cpp | 6 +- graphics/opengl/program.cpp | 113 ++++++++++++++++++++------ graphics/opengl/program.hpp | 3 + 3 files changed, 95 insertions(+), 27 deletions(-) diff --git a/graphics/opengl/gl_render_context.cpp b/graphics/opengl/gl_render_context.cpp index 111065f990..66d895a48f 100644 --- a/graphics/opengl/gl_render_context.cpp +++ b/graphics/opengl/gl_render_context.cpp @@ -38,7 +38,11 @@ namespace graphics void RenderContext::setProgram(shared_ptr const & prg) { - m_program = prg; + if (m_program != prg) + { + m_program = prg; + m_program->riseChangedFlag(); + } } ProgramManager * RenderContext::programManager() diff --git a/graphics/opengl/program.cpp b/graphics/opengl/program.cpp index 4f2d597ae1..dbf2b6c0b5 100644 --- a/graphics/opengl/program.cpp +++ b/graphics/opengl/program.cpp @@ -106,7 +106,11 @@ namespace graphics Uniform & f = it->second; f.m_type = EFloat; - f.m_data.m_floatVal[0] = v0; + if (f.m_data.m_floatVal[0] != v0) + { + f.m_data.m_floatVal[0] = v0; + f.m_changed = true; + } } void Program::setParam(ESemantic sem, float v0, float v1) @@ -116,8 +120,13 @@ namespace graphics Uniform & f = it->second; f.m_type = EFloatVec2; - f.m_data.m_floatVal[0] = v0; - f.m_data.m_floatVal[1] = v1; + if (f.m_data.m_floatVal[0] != v0 || + f.m_data.m_floatVal[1] != v1) + { + f.m_data.m_floatVal[0] = v0; + f.m_data.m_floatVal[1] = v1; + f.m_changed = true; + } } void Program::setParam(ESemantic sem, float v0, float v1, float v2) @@ -127,9 +136,15 @@ namespace graphics Uniform & f = it->second; f.m_type = EFloatVec3; - f.m_data.m_floatVal[0] = v0; - f.m_data.m_floatVal[1] = v1; - f.m_data.m_floatVal[2] = v2; + if (f.m_data.m_floatVal[0] != v0 || + f.m_data.m_floatVal[1] != v1 || + f.m_data.m_floatVal[2] != v2) + { + f.m_data.m_floatVal[0] = v0; + f.m_data.m_floatVal[1] = v1; + f.m_data.m_floatVal[2] = v2; + f.m_changed = true; + } } void Program::setParam(ESemantic sem, float v0, float v1, float v2, float v3) @@ -139,10 +154,17 @@ namespace graphics Uniform & f = it->second; f.m_type = EFloatVec4; - f.m_data.m_floatVal[0] = v0; - f.m_data.m_floatVal[1] = v1; - f.m_data.m_floatVal[2] = v2; - f.m_data.m_floatVal[3] = v3; + if (f.m_data.m_floatVal[0] != v0 || + f.m_data.m_floatVal[1] != v1 || + f.m_data.m_floatVal[2] != v2 || + f.m_data.m_floatVal[3] != v3) + { + f.m_data.m_floatVal[0] = v0; + f.m_data.m_floatVal[1] = v1; + f.m_data.m_floatVal[2] = v2; + f.m_data.m_floatVal[3] = v3; + f.m_changed = true; + } } void Program::setParam(ESemantic sem, int v0) @@ -152,7 +174,11 @@ namespace graphics Uniform & f = it->second; f.m_type = EInteger; - f.m_data.m_intVal[0] = v0; + if (f.m_data.m_intVal[0] != v0) + { + f.m_data.m_intVal[0] = v0; + f.m_changed = true; + } } void Program::setParam(ESemantic sem, int v0, int v1) @@ -162,8 +188,13 @@ namespace graphics Uniform & f = it->second; f.m_type = EIntegerVec2; - f.m_data.m_intVal[0] = v0; - f.m_data.m_intVal[1] = v1; + if (f.m_data.m_intVal[0] != v0 || + f.m_data.m_intVal[1] != v1) + { + f.m_data.m_intVal[0] = v0; + f.m_data.m_intVal[1] = v1; + f.m_changed = true; + } } void Program::setParam(ESemantic sem, int v0, int v1, int v2) @@ -173,9 +204,15 @@ namespace graphics Uniform & f = it->second; f.m_type = EIntegerVec3; - f.m_data.m_intVal[0] = v0; - f.m_data.m_intVal[1] = v1; - f.m_data.m_intVal[2] = v2; + if (f.m_data.m_intVal[0] != v0 || + f.m_data.m_intVal[1] != v1 || + f.m_data.m_intVal[2] != v2) + { + f.m_data.m_intVal[0] = v0; + f.m_data.m_intVal[1] = v1; + f.m_data.m_intVal[2] = v2; + f.m_changed = true; + } } void Program::setParam(ESemantic sem, int v0, int v1, int v2, int v3) @@ -185,10 +222,17 @@ namespace graphics Uniform & f = it->second; f.m_type = EIntegerVec4; - f.m_data.m_intVal[0] = v0; - f.m_data.m_intVal[1] = v1; - f.m_data.m_intVal[2] = v2; - f.m_data.m_intVal[3] = v3; + if (f.m_data.m_intVal[0] != v0 || + f.m_data.m_intVal[1] != v1 || + f.m_data.m_intVal[2] != v2 || + f.m_data.m_intVal[3] != v3) + { + f.m_data.m_intVal[0] = v0; + f.m_data.m_intVal[1] = v1; + f.m_data.m_intVal[2] = v2; + f.m_data.m_intVal[3] = v3; + f.m_changed = true; + } } template @@ -201,7 +245,11 @@ namespace graphics Uniform & f = it->second; f.m_type = dt; - copy(&m(0, 0), &m(0, 0) + N * N, f.m_data.m_matVal); + if (!equal(&m(0, 0), &m(0, 0) + N * N, f.m_data.m_matVal)) + { + copy(&m(0, 0), &m(0, 0) + N * N, f.m_data.m_matVal); + f.m_changed = true; + } } void Program::setParam(ESemantic sem, math::Matrix const & m) @@ -274,11 +322,14 @@ namespace graphics void Program::applyUniforms() { /// setting all uniforms - for (TUniforms::const_iterator it = m_uniforms.begin(); - it != m_uniforms.end(); - ++it) + typedef pair TNode; + for (TNode & node : m_uniforms) { - Uniform const & u = it->second; + Uniform & u = node.second; + if (!u.m_changed) + continue; + + u.m_changed = false; switch (u.m_type) { @@ -354,7 +405,12 @@ namespace graphics void Program::makeCurrent() { - OGLCHECK(glUseProgramFn(m_handle)); + if (m_changed) + { + + OGLCHECK(glUseProgramFn(m_handle)); + m_changed = false; + } m_storage.m_vertices->makeCurrent(); @@ -364,6 +420,11 @@ namespace graphics applyUniforms(); } + + void Program::riseChangedFlag() + { + m_changed = true; + } } } diff --git a/graphics/opengl/program.hpp b/graphics/opengl/program.hpp index e749b3ca43..660cfde7cf 100644 --- a/graphics/opengl/program.hpp +++ b/graphics/opengl/program.hpp @@ -36,6 +36,7 @@ namespace graphics } m_data; EDataType m_type; GLint m_handle; + bool m_changed = true; }; struct Attribute @@ -47,6 +48,7 @@ namespace graphics size_t m_stride; }; + bool m_changed = true; GLuint m_handle; typedef map TUniforms; @@ -93,6 +95,7 @@ namespace graphics void setStorage(Storage const & storage); void makeCurrent(); + void riseChangedFlag(); }; } }