Kaydet (Commit) 7b6654df authored tarafından Tor Lillqvist's avatar Tor Lillqvist Kaydeden (comit) Andras Timar

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/19245Reviewed-by: 's avatarMiklos Vajna <vmiklos@collabora.co.uk>
Tested-by: 's avatarMiklos Vajna <vmiklos@collabora.co.uk>
(cherry picked from commit 33e418bb)
üst 23f7e908
......@@ -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;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment