Kaydet (Commit) 697917f7 authored tarafından Marco Cecchetti's avatar Marco Cecchetti Kaydeden (comit) Michael Meeks

tdf#93814: Added support for caching shader program binaries.

Reviewed-on: https://gerrit.libreoffice.org/18555Tested-by: 's avatarJenkins <ci@libreoffice.org>
Reviewed-by: 's avatarTomaž Vajngerl <quikee@gmail.com>
Signed-off-by: 's avatarMichael Meeks <michael.meeks@collabora.com>

Conflicts:
	include/vcl/opengl/OpenGLContext.hxx
	include/vcl/opengl/OpenGLHelper.hxx
	vcl/inc/opengl/win/WinDeviceInfo.hxx
	vcl/source/opengl/OpenGLContext.cxx

Change-Id: I21c844b47282f6b3eec443933a86421a074e24df
üst 50902f4d
...@@ -56,9 +56,13 @@ class NSOpenGLView; ...@@ -56,9 +56,13 @@ class NSOpenGLView;
#include <vcl/window.hxx> #include <vcl/window.hxx>
#include <tools/gen.hxx> #include <tools/gen.hxx>
#include <vcl/syschild.hxx> #include <vcl/syschild.hxx>
#include <rtl/crc.h>
#include <rtl/ref.hxx> #include <rtl/ref.hxx>
#include <map>
#include <memory>
#include <set> #include <set>
#include <unordered_map>
class OpenGLFramebuffer; class OpenGLFramebuffer;
class OpenGLProgram; class OpenGLProgram;
...@@ -276,15 +280,15 @@ private: ...@@ -276,15 +280,15 @@ private:
OpenGLFramebuffer* mpFirstFramebuffer; OpenGLFramebuffer* mpFirstFramebuffer;
OpenGLFramebuffer* mpLastFramebuffer; OpenGLFramebuffer* mpLastFramebuffer;
struct ProgramKey struct ProgramHash
{ {
ProgramKey( const OUString& vertexShader, const OUString& fragmentShader, const OString& preamble ); size_t operator()( const rtl::OString& aDigest ) const
bool operator< ( const ProgramKey& other ) const; {
OUString vertexShader; return (size_t)( rtl_crc32( 0, aDigest.getStr(), aDigest.getLength() ) );
OUString fragmentShader; }
OString preamble;
}; };
std::map<ProgramKey, boost::shared_ptr<OpenGLProgram> > maPrograms; typedef std::unordered_map< rtl::OString, std::shared_ptr<OpenGLProgram>, ProgramHash > ProgramCollection;
ProgramCollection maPrograms;
OpenGLProgram* mpCurrentProgram; OpenGLProgram* mpCurrentProgram;
#ifdef DBG_UTIL #ifdef DBG_UTIL
std::set<SalGraphicsImpl*> maParents; std::set<SalGraphicsImpl*> maParents;
......
...@@ -36,8 +36,13 @@ ...@@ -36,8 +36,13 @@
class VCL_DLLPUBLIC OpenGLHelper class VCL_DLLPUBLIC OpenGLHelper
{ {
OpenGLHelper() SAL_DELETED_FUNCTION; // Should not be instantiated
public: public:
static GLint LoadShaders(const OUString& rVertexShaderName, const OUString& rFragmentShaderName, const OString& preamble = "" );
static rtl::OString GetDigest(const OUString& rVertexShaderName, const OUString& rFragmentShaderName, const rtl::OString& preamble = "" );
static GLint LoadShaders(const OUString& rVertexShaderName, const OUString& rFragmentShaderName, const rtl::OString& preamble = "", const rtl::OString& rDigest = "" );
/** /**
* The caller is responsible for allocate the memory for the RGBA buffer, before call * The caller is responsible for allocate the memory for the RGBA buffer, before call
......
...@@ -50,7 +50,8 @@ public: ...@@ -50,7 +50,8 @@ public:
OpenGLProgram(); OpenGLProgram();
~OpenGLProgram(); ~OpenGLProgram();
bool Load( const OUString& rVertexShader, const OUString& rFragmentShader, const OString& preamble = "" ); bool Load( const OUString& rVertexShader, const OUString& rFragmentShader,
const rtl::OString& preamble = "", const rtl::OString& rDigest = "" );
bool Use(); bool Use();
bool Clean(); bool Clean();
......
...@@ -75,15 +75,8 @@ enum DeviceVendor { ...@@ -75,15 +75,8 @@ enum DeviceVendor {
struct DriverInfo struct DriverInfo
{ {
typedef std::vector<OUString> DeviceFamilyVector; DriverInfo(OperatingSystem os, const OUString& vendor, VersionComparisonOp op,
uint64_t driverVersion, bool bWhiteListed = false, const char *suggestedVersion = nullptr);
// If |ownDevices| is true, you are transferring ownership of the devices
// array, and it will be deleted when this GfxDriverInfo is destroyed.
DriverInfo(OperatingSystem os, const OUString& vendor, DeviceFamilyVector* devices,
VersionComparisonOp op,
uint64_t driverVersion, bool bWhiteListed = false, const char *suggestedVersion = nullptr,
bool ownDevices = false);
DriverInfo(); DriverInfo();
DriverInfo(const DriverInfo&); DriverInfo(const DriverInfo&);
...@@ -183,6 +176,51 @@ public: ...@@ -183,6 +176,51 @@ public:
virtual ~WinOpenGLDeviceInfo(); virtual ~WinOpenGLDeviceInfo();
virtual bool isDeviceBlocked(); virtual bool isDeviceBlocked();
const OUString& GetDriverVersion() const
{
return maDriverVersion;
}
const OUString& GetDriverDate() const
{
return maDriverDate;
}
const OUString& GetDeviceID() const
{
return maDeviceID;
}
const OUString& GetAdapterVendorID() const
{
return maAdapterVendorID;
}
const OUString& GetAdapterDeviceID() const
{
return maAdapterDeviceID;
}
const OUString& GetAdapterSubsysID() const
{
return maAdapterSubsysID;
}
const OUString& GetDeviceKey() const
{
return maDeviceKey;
}
const OUString& GetDeviceString() const
{
return maDeviceString;
}
sal_uInt32 GetWindowsVersion() const
{
return mnWindowsVersion;
}
}; };
#endif #endif
......
...@@ -44,6 +44,32 @@ public: ...@@ -44,6 +44,32 @@ public:
virtual ~X11OpenGLDeviceInfo(); virtual ~X11OpenGLDeviceInfo();
virtual bool isDeviceBlocked() SAL_OVERRIDE; virtual bool isDeviceBlocked() SAL_OVERRIDE;
const OString& GetVendor() const
{
return maVendor;
}
const OString& GetRenderer() const
{
return maRenderer;
}
const OString& GetVersion() const
{
return maVersion;
}
const OString& GetOS() const
{
return maOS;
}
const OString& GetOSRelease() const
{
return maOSRelease;
}
}; };
#endif #endif
......
...@@ -36,9 +36,12 @@ OpenGLProgram::~OpenGLProgram() ...@@ -36,9 +36,12 @@ OpenGLProgram::~OpenGLProgram()
glDeleteProgram( mnId ); glDeleteProgram( mnId );
} }
bool OpenGLProgram::Load( const OUString& rVertexShader, const OUString& rFragmentShader, const OString& preamble ) bool OpenGLProgram::Load( const OUString& rVertexShader,
const OUString& rFragmentShader,
const rtl::OString& preamble,
const rtl::OString& rDigest )
{ {
mnId = OpenGLHelper::LoadShaders( rVertexShader, rFragmentShader, preamble ); mnId = OpenGLHelper::LoadShaders( rVertexShader, rFragmentShader, preamble, rDigest );
return ( mnId != 0 ); return ( mnId != 0 );
} }
......
...@@ -1725,22 +1725,25 @@ void OpenGLContext::ReleaseFramebuffers() ...@@ -1725,22 +1725,25 @@ void OpenGLContext::ReleaseFramebuffers()
BindFramebuffer( NULL ); 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; OpenGLZone aZone;
ProgramKey aKey( rVertexShader, rFragmentShader, preamble ); rtl::OString aKey = OpenGLHelper::GetDigest( rVertexShader, rFragmentShader, preamble );
std::map< ProgramKey, boost::shared_ptr<OpenGLProgram> >::iterator if( !aKey.isEmpty() )
it = maPrograms.find( aKey ); {
if( it != maPrograms.end() ) ProgramCollection::iterator it = maPrograms.find( aKey );
return it->second.get(); if( it != maPrograms.end() )
return it->second.get();
}
boost::shared_ptr<OpenGLProgram> pProgram = boost::make_shared<OpenGLProgram>(); std::shared_ptr<OpenGLProgram> pProgram = std::make_shared<OpenGLProgram>();
if( !pProgram->Load( rVertexShader, rFragmentShader, preamble ) ) if( !pProgram->Load( rVertexShader, rFragmentShader, preamble, aKey ) )
return NULL; return NULL;
maPrograms.insert(std::pair<ProgramKey, boost::shared_ptr<OpenGLProgram> >(aKey, pProgram)); maPrograms.insert(std::make_pair(aKey, pProgram));
return pProgram.get(); return pProgram.get();
} }
...@@ -1766,20 +1769,4 @@ OpenGLProgram* OpenGLContext::UseProgram( const OUString& rVertexShader, const O ...@@ -1766,20 +1769,4 @@ OpenGLProgram* OpenGLContext::UseProgram( const OUString& rVertexShader, const O
return mpCurrentProgram; 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: */ /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
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