diff --git a/graphics/opengl/geometry_renderer.cpp b/graphics/opengl/geometry_renderer.cpp index 8d2f2e8d6d..5aafb552cb 100644 --- a/graphics/opengl/geometry_renderer.cpp +++ b/graphics/opengl/geometry_renderer.cpp @@ -166,7 +166,7 @@ namespace graphics gl::RenderContext * rc = static_cast(renderContext()); ProgramManager * pm = rc->programManager(); - shared_ptr prg = pm->getProgram("basic", "noalphatest"); + shared_ptr prg = pm->getProgram(EVxTextured, EFrgNoAlphaTest); prg->setParam(ESemModelView, rc->matrix(EModelView)); prg->setParam(ESemProjection, rc->matrix(EProjection)); @@ -410,7 +410,7 @@ namespace graphics /// Applying program gl::RenderContext * rc = static_cast(renderContext()); ProgramManager * pm = rc->programManager(); - shared_ptr prg = pm->getProgram("basic", "alphatest"); + shared_ptr prg = pm->getProgram(EVxTextured, EFrgAlphaTest); prg->setParam(ESemModelView, rc->matrix(EModelView)); prg->setParam(ESemProjection, rc->matrix(EProjection)); @@ -435,7 +435,7 @@ namespace graphics /// Applying program gl::RenderContext * rc = static_cast(renderContext()); ProgramManager * pm = rc->programManager(); - shared_ptr prg = pm->getProgram("basic", "noalphatest"); + shared_ptr prg = pm->getProgram(EVxTextured, EFrgNoAlphaTest); prg->setParam(ESemModelView, rc->matrix(EModelView)); prg->setParam(ESemProjection, rc->matrix(EProjection)); @@ -480,7 +480,7 @@ namespace graphics /// Applying program gl::RenderContext * rc = static_cast(renderContext()); ProgramManager * pm = rc->programManager(); - shared_ptr prg = pm->getProgram("sharp", "alphatest"); + shared_ptr prg = pm->getProgram(EVxSharp, EFrgAlphaTest); prg->setParam(ESemModelView, rc->matrix(EModelView)); prg->setParam(ESemProjection, rc->matrix(EProjection)); diff --git a/graphics/opengl/program_manager.cpp b/graphics/opengl/program_manager.cpp index 7a735cc3b2..5178428a4a 100644 --- a/graphics/opengl/program_manager.cpp +++ b/graphics/opengl/program_manager.cpp @@ -5,6 +5,7 @@ namespace graphics { namespace gl { + #if defined(OMIM_GL_ES) #define PRECISION "lowp" #else @@ -26,7 +27,7 @@ namespace graphics " TexCoordOut0 = TexCoord0;\n" "}\n"; - m_vxShaders["basic"].reset(new Shader(vxSrc, EVertexShader)); + m_vxShaders[EVxTextured].reset(new Shader(vxSrc, EVertexShader)); /// Sharp Vertex Shader Source @@ -42,7 +43,7 @@ namespace graphics " TexCoordOut0 = TexCoord0;\n" "}\n"; - m_vxShaders["sharp"].reset(new Shader(sharpVxSrc, EVertexShader)); + m_vxShaders[EVxSharp].reset(new Shader(sharpVxSrc, EVertexShader)); /// Fragment Shader with alphaTest @@ -55,7 +56,7 @@ namespace graphics " discard;\n" "}\n"; - m_frgShaders["alphatest"].reset(new Shader(alphaTestFrgSrc, EFragmentShader)); + m_frgShaders[EFrgAlphaTest].reset(new Shader(alphaTestFrgSrc, EFragmentShader)); /// Fragment shader without alphaTest @@ -65,29 +66,27 @@ namespace graphics "void main(void) {\n" " gl_FragColor = texture2D(Sampler0, TexCoordOut0);\n" "}\n"; - m_frgShaders["noalphatest"].reset(new Shader(noAlphaTestFrgSrc, EFragmentShader)); + m_frgShaders[EFrgNoAlphaTest].reset(new Shader(noAlphaTestFrgSrc, EFragmentShader)); - getProgram("basic", "alphatest"); - getProgram("basic", "noalphatest"); + getProgram(EVxTextured, EFrgAlphaTest); + getProgram(EVxTextured, EFrgNoAlphaTest); - getProgram("sharp", "alphatest"); - getProgram("sharp", "noalphatest"); + getProgram(EVxSharp, EFrgAlphaTest); + getProgram(EVxSharp, EFrgNoAlphaTest); } - shared_ptr const ProgramManager::getProgram(char const * vxName, - char const * frgName) + shared_ptr const ProgramManager::getProgram(EVxType vxType, + EFrgType frgType) { - string prgName(string(vxName) + ":" + frgName); + pair key(vxType, frgType); - map >::const_iterator it = m_programs.find(prgName); + map, shared_ptr >::const_iterator it = m_programs.find(key); if (it != m_programs.end()) return it->second; - shared_ptr program(new Program(m_vxShaders[vxName], m_frgShaders[frgName])); + shared_ptr program(new Program(m_vxShaders[vxType], m_frgShaders[frgType])); - m_programs[prgName] = program; - - LOG(LINFO, (this, ", ", vxName, ", ", frgName, ", ", program)); + m_programs[key] = program; return program; } diff --git a/graphics/opengl/program_manager.hpp b/graphics/opengl/program_manager.hpp index 29ec720f3e..7f341a46a7 100644 --- a/graphics/opengl/program_manager.hpp +++ b/graphics/opengl/program_manager.hpp @@ -11,20 +11,32 @@ namespace graphics { namespace gl { + enum EVxType + { + EVxTextured, + EVxSharp + }; + + enum EFrgType + { + EFrgAlphaTest, + EFrgNoAlphaTest + }; + class ProgramManager { private: - map > m_vxShaders; - map > m_frgShaders; - map > m_programs; + map > m_vxShaders; + map > m_frgShaders; + map , shared_ptr > m_programs; public: ProgramManager(); - shared_ptr const getProgram(char const * vxName, - char const * frgName); + shared_ptr const getProgram(EVxType vxType, + EFrgType frgType); }; } }