summaryrefslogtreecommitdiff
path: root/vcl/source/opengl/OpenGLHelper.cxx
diff options
context:
space:
mode:
authorTor Lillqvist <tml@collabora.com>2015-10-08 13:24:12 +0300
committerMiklos Vajna <vmiklos@collabora.co.uk>2015-10-09 12:01:36 +0000
commit33e418bbaadec02bf911b606e0d588d7fe4d5808 (patch)
treee281e363ef1f46f46237663d377ddd76b8447ca3 /vcl/source/opengl/OpenGLHelper.cxx
parente0b2971d93e0c64d1ab57b66d6f590dd1bb6a797 (diff)
Don't re-read the same glsl files over and over again
Change-Id: I10b4badaba01630e1a054b3d4d9cc4720822511a (cherry picked from commit 048076b8e32a8d348e4b1b4dc72fef860f4498bd) Reviewed-on: https://gerrit.libreoffice.org/19245 Reviewed-by: Miklos Vajna <vmiklos@collabora.co.uk> Tested-by: Miklos Vajna <vmiklos@collabora.co.uk>
Diffstat (limited to 'vcl/source/opengl/OpenGLHelper.cxx')
-rw-r--r--vcl/source/opengl/OpenGLHelper.cxx24
1 files changed, 20 insertions, 4 deletions
diff --git a/vcl/source/opengl/OpenGLHelper.cxx b/vcl/source/opengl/OpenGLHelper.cxx
index 538e4670180f..651e63ee69f9 100644
--- a/vcl/source/opengl/OpenGLHelper.cxx
+++ b/vcl/source/opengl/OpenGLHelper.cxx
@@ -11,6 +11,7 @@
#include <vcl/opengl/OpenGLHelper.hxx>
#include <osl/file.hxx>
+#include <osl/mutex.hxx>
#include <rtl/bootstrap.hxx>
#include <rtl/digest.h>
#include <rtl/strbuf.hxx>
@@ -66,6 +67,7 @@ OString loadShader(const OUString& rFilename)
{
OUString aFileURL = getShaderFolder() + rFilename +".glsl";
osl::File aFile(aFileURL);
+ SAL_INFO("vcl.opengl", "Reading " << aFileURL);
if(aFile.open(osl_File_OpenFlag_Read) == osl::FileBase::E_None)
{
sal_uInt64 nSize = 0;
@@ -85,6 +87,20 @@ OString loadShader(const OUString& rFilename)
return OString();
}
+OString& getShaderSource(const OUString& rFilename)
+{
+ static std::unordered_map<OUString, OString, OUStringHash> aMap;
+ static osl::Mutex aMutex;
+ osl::MutexGuard aGuard(aMutex);
+
+ if (aMap.find(rFilename) == aMap.end())
+ {
+ aMap[rFilename] = loadShader(rFilename);
+ }
+
+ return aMap[rFilename];
+}
+
}
namespace {
@@ -189,8 +205,8 @@ namespace
const OString& rPreamble )
{
// read shaders source
- OString aVertexShaderSource = loadShader( rVertexShaderName );
- OString aFragmentShaderSource = loadShader( rFragmentShaderName );
+ OString aVertexShaderSource = getShaderSource( rVertexShaderName );
+ OString aFragmentShaderSource = getShaderSource( rFragmentShaderName );
// get info about the graphic device
#if defined( SAL_UNX ) && !defined( MACOSX ) && !defined( IOS )&& !defined( ANDROID )
@@ -374,8 +390,8 @@ GLint OpenGLHelper::LoadShaders(const OUString& rVertexShaderName,
GLint ProgramID = glCreateProgram();
// read shaders from file
- OString aVertexShaderSource = loadShader(rVertexShaderName);
- OString aFragmentShaderSource = loadShader(rFragmentShaderName);
+ OString aVertexShaderSource = getShaderSource(rVertexShaderName);
+ OString aFragmentShaderSource = getShaderSource(rFragmentShaderName);
GLint bBinaryResult = GL_FALSE;