diff options
author | Marco Cecchetti <marco.cecchetti@collabora.com> | 2015-09-13 12:15:13 +0200 |
---|---|---|
committer | Marco Cecchetti <marco.cecchetti@collabora.com> | 2015-09-14 13:00:49 +0200 |
commit | 3f73cfdf5c721b250910cd220e54d53e3311840b (patch) | |
tree | 866104092fa4d2dd755fe605a460b297056bd71c /vcl/source/opengl/OpenGLContext.cxx | |
parent | e6ae8ce99566f59b2011f614160f6bdd4d5034cc (diff) |
tdf#93814: Added support for caching shader program binaries.private/mcecchetti/gl-program-binary
Change-Id: I21c844b47282f6b3eec443933a86421a074e24df
Diffstat (limited to 'vcl/source/opengl/OpenGLContext.cxx')
-rw-r--r-- | vcl/source/opengl/OpenGLContext.cxx | 34 |
1 files changed, 10 insertions, 24 deletions
diff --git a/vcl/source/opengl/OpenGLContext.cxx b/vcl/source/opengl/OpenGLContext.cxx index 181d5ab38be3..bfbd8a7b9607 100644 --- a/vcl/source/opengl/OpenGLContext.cxx +++ b/vcl/source/opengl/OpenGLContext.cxx @@ -1634,22 +1634,24 @@ void OpenGLContext::ReleaseFramebuffers() BindFramebuffer( NULL ); } -OpenGLProgram* OpenGLContext::GetProgram( const OUString& rVertexShader, const OUString& rFragmentShader, const OString& preamble ) +OpenGLProgram* OpenGLContext::GetProgram( const OUString& rVertexShader, const OUString& rFragmentShader, const rtl::OString& preamble ) { OpenGLZone aZone; - ProgramKey aKey( rVertexShader, rFragmentShader, preamble ); + rtl::OString aKey = OpenGLHelper::GetDigest( rVertexShader, rFragmentShader, preamble ); - std::map< ProgramKey, std::shared_ptr<OpenGLProgram> >::iterator - it = maPrograms.find( aKey ); - if( it != maPrograms.end() ) - return it->second.get(); + if( !aKey.isEmpty() ) + { + ProgramCollection::iterator it = maPrograms.find( aKey ); + if( it != maPrograms.end() ) + return it->second.get(); + } std::shared_ptr<OpenGLProgram> pProgram = std::make_shared<OpenGLProgram>(); - if( !pProgram->Load( rVertexShader, rFragmentShader, preamble ) ) + if( !pProgram->Load( rVertexShader, rFragmentShader, preamble, aKey ) ) return NULL; - maPrograms.insert(std::pair<ProgramKey, std::shared_ptr<OpenGLProgram> >(aKey, pProgram)); + maPrograms.insert(std::make_pair(aKey, pProgram)); return pProgram.get(); } @@ -1675,20 +1677,4 @@ OpenGLProgram* OpenGLContext::UseProgram( const OUString& rVertexShader, const O return mpCurrentProgram; } -inline -OpenGLContext::ProgramKey::ProgramKey( const OUString& v, const OUString& f, const OString& p ) -: vertexShader( v ), fragmentShader( f ), preamble( p ) -{ -} - -inline -bool OpenGLContext::ProgramKey::operator< ( const ProgramKey& other ) const -{ - if( vertexShader != other.vertexShader ) - return vertexShader < other.vertexShader; - if( fragmentShader != other.fragmentShader ) - return fragmentShader < other.fragmentShader; - return preamble < other.preamble; -} - /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |