diff options
-rw-r--r-- | include/vcl/opengl/OpenGLContext.hxx | 14 | ||||
-rw-r--r-- | include/vcl/opengl/OpenGLHelper.hxx | 2 | ||||
-rw-r--r-- | vcl/inc/opengl/program.hxx | 2 | ||||
-rw-r--r-- | vcl/inc/openglgdiimpl.hxx | 2 | ||||
-rw-r--r-- | vcl/opengl/gdiimpl.cxx | 4 | ||||
-rw-r--r-- | vcl/opengl/program.cxx | 4 | ||||
-rw-r--r-- | vcl/source/opengl/OpenGLContext.cxx | 26 | ||||
-rw-r--r-- | vcl/source/opengl/OpenGLHelper.cxx | 6 |
8 files changed, 43 insertions, 17 deletions
diff --git a/include/vcl/opengl/OpenGLContext.hxx b/include/vcl/opengl/OpenGLContext.hxx index e2d6b777c9ee..670e83fd9e29 100644 --- a/include/vcl/opengl/OpenGLContext.hxx +++ b/include/vcl/opengl/OpenGLContext.hxx @@ -162,8 +162,6 @@ struct GLWindow ~GLWindow(); }; -typedef std::pair<OUString, OUString> ProgramKey; - class VCLOPENGL_DLLPUBLIC OpenGLContext { public: @@ -204,8 +202,8 @@ public: void ReleaseFramebuffers(); // retrieve a program from the cache or compile/link it - OpenGLProgram* GetProgram( const OUString& rVertexShader, const OUString& rFragmentShader ); - OpenGLProgram* UseProgram( const OUString& rVertexShader, const OUString& rFragmentShader ); + OpenGLProgram* GetProgram( const OUString& rVertexShader, const OUString& rFragmentShader, const OString& preamble = "" ); + OpenGLProgram* UseProgram( const OUString& rVertexShader, const OUString& rFragmentShader, const OString& preamble = "" ); bool isCurrent(); static void clearCurrent(); @@ -267,6 +265,14 @@ private: OpenGLFramebuffer* mpFirstFramebuffer; OpenGLFramebuffer* mpLastFramebuffer; + struct ProgramKey + { + ProgramKey( const OUString& vertexShader, const OUString& fragmentShader, const OString& preamble ); + bool operator< ( const ProgramKey& other ) const; + OUString vertexShader; + OUString fragmentShader; + OString preamble; + }; boost::ptr_map<ProgramKey, OpenGLProgram> maPrograms; OpenGLProgram* mpCurrentProgram; #ifdef DBG_UTIL diff --git a/include/vcl/opengl/OpenGLHelper.hxx b/include/vcl/opengl/OpenGLHelper.hxx index 243051519dac..4e11bf8306ef 100644 --- a/include/vcl/opengl/OpenGLHelper.hxx +++ b/include/vcl/opengl/OpenGLHelper.hxx @@ -25,7 +25,7 @@ class VCLOPENGL_DLLPUBLIC OpenGLHelper { public: - static GLint LoadShaders(const OUString& rVertexShaderName, const OUString& rFragmentShaderName); + static GLint LoadShaders(const OUString& rVertexShaderName, const OUString& rFragmentShaderName, const OString& preamble = "" ); /** * The caller is responsible for allocate the memory for the RGBA buffer, before call diff --git a/vcl/inc/opengl/program.hxx b/vcl/inc/opengl/program.hxx index 1e137aaaefd4..8c5af1005955 100644 --- a/vcl/inc/opengl/program.hxx +++ b/vcl/inc/opengl/program.hxx @@ -43,7 +43,7 @@ public: OpenGLProgram(); ~OpenGLProgram(); - bool Load( const OUString& rVertexShader, const OUString& rFragmentShader ); + bool Load( const OUString& rVertexShader, const OUString& rFragmentShader, const OString& preamble = "" ); bool Use(); bool Clean(); diff --git a/vcl/inc/openglgdiimpl.hxx b/vcl/inc/openglgdiimpl.hxx index 7bb4532a3205..bab969010153 100644 --- a/vcl/inc/openglgdiimpl.hxx +++ b/vcl/inc/openglgdiimpl.hxx @@ -73,7 +73,7 @@ protected: bool CheckOffscreenTexture(); public: - bool UseProgram( const OUString& rVertexShader, const OUString& rFragmentShader ); + bool UseProgram( const OUString& rVertexShader, const OUString& rFragmentShader, const OString& preamble = "" ); bool UseSolid( SalColor nColor, sal_uInt8 nTransparency ); bool UseSolid( SalColor nColor, double fTransparency ); bool UseSolid( SalColor nColor ); diff --git a/vcl/opengl/gdiimpl.cxx b/vcl/opengl/gdiimpl.cxx index 519837589cdd..b74c76318b5b 100644 --- a/vcl/opengl/gdiimpl.cxx +++ b/vcl/opengl/gdiimpl.cxx @@ -371,11 +371,11 @@ bool OpenGLSalGraphicsImpl::CheckOffscreenTexture() return true; } -bool OpenGLSalGraphicsImpl::UseProgram( const OUString& rVertexShader, const OUString& rFragmentShader ) +bool OpenGLSalGraphicsImpl::UseProgram( const OUString& rVertexShader, const OUString& rFragmentShader, const OString& preamble ) { if( mpProgram != NULL ) mpProgram->Clean(); - mpProgram = mpContext->UseProgram( rVertexShader, rFragmentShader ); + mpProgram = mpContext->UseProgram( rVertexShader, rFragmentShader, preamble ); #ifdef DBG_UTIL mProgramIsSolidColor = false; // UseSolid() will set to true if needed #endif diff --git a/vcl/opengl/program.cxx b/vcl/opengl/program.cxx index 80c23959f67f..be86be2161fc 100644 --- a/vcl/opengl/program.cxx +++ b/vcl/opengl/program.cxx @@ -31,9 +31,9 @@ OpenGLProgram::~OpenGLProgram() glDeleteProgram( mnId ); } -bool OpenGLProgram::Load( const OUString& rVertexShader, const OUString& rFragmentShader ) +bool OpenGLProgram::Load( const OUString& rVertexShader, const OUString& rFragmentShader, const OString& preamble ) { - mnId = OpenGLHelper::LoadShaders( rVertexShader, rFragmentShader ); + mnId = OpenGLHelper::LoadShaders( rVertexShader, rFragmentShader, preamble ); return ( mnId != 0 ); } diff --git a/vcl/source/opengl/OpenGLContext.cxx b/vcl/source/opengl/OpenGLContext.cxx index cfa819109a9b..99f64e8142ed 100644 --- a/vcl/source/opengl/OpenGLContext.cxx +++ b/vcl/source/opengl/OpenGLContext.cxx @@ -1536,9 +1536,9 @@ void OpenGLContext::ReleaseFramebuffers() } } -OpenGLProgram* OpenGLContext::GetProgram( const OUString& rVertexShader, const OUString& rFragmentShader ) +OpenGLProgram* OpenGLContext::GetProgram( const OUString& rVertexShader, const OUString& rFragmentShader, const OString& preamble ) { - ProgramKey aKey( rVertexShader, rFragmentShader ); + ProgramKey aKey( rVertexShader, rFragmentShader, preamble ); boost::ptr_map<ProgramKey, OpenGLProgram>::iterator it = maPrograms.find( aKey ); @@ -1546,7 +1546,7 @@ OpenGLProgram* OpenGLContext::GetProgram( const OUString& rVertexShader, const O return it->second; OpenGLProgram* pProgram = new OpenGLProgram; - if( !pProgram->Load( rVertexShader, rFragmentShader ) ) + if( !pProgram->Load( rVertexShader, rFragmentShader, preamble ) ) { delete pProgram; return NULL; @@ -1556,9 +1556,9 @@ OpenGLProgram* OpenGLContext::GetProgram( const OUString& rVertexShader, const O return pProgram; } -OpenGLProgram* OpenGLContext::UseProgram( const OUString& rVertexShader, const OUString& rFragmentShader ) +OpenGLProgram* OpenGLContext::UseProgram( const OUString& rVertexShader, const OUString& rFragmentShader, const OString& preamble ) { - OpenGLProgram* pProgram = GetProgram( rVertexShader, rFragmentShader ); + OpenGLProgram* pProgram = GetProgram( rVertexShader, rFragmentShader, preamble ); if( pProgram == mpCurrentProgram ) return pProgram; @@ -1569,4 +1569,20 @@ 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: */ diff --git a/vcl/source/opengl/OpenGLHelper.cxx b/vcl/source/opengl/OpenGLHelper.cxx index a30b9ef5d983..c71380e32337 100644 --- a/vcl/source/opengl/OpenGLHelper.cxx +++ b/vcl/source/opengl/OpenGLHelper.cxx @@ -98,7 +98,7 @@ namespace { } } -GLint OpenGLHelper::LoadShaders(const OUString& rVertexShaderName,const OUString& rFragmentShaderName) +GLint OpenGLHelper::LoadShaders(const OUString& rVertexShaderName,const OUString& rFragmentShaderName, const OString& preamble) { // Create the shaders GLuint VertexShaderID = glCreateShader(GL_VERTEX_SHADER); @@ -108,6 +108,8 @@ GLint OpenGLHelper::LoadShaders(const OUString& rVertexShaderName,const OUString // Compile Vertex Shader OString aVertexShaderSource = loadShader(rVertexShaderName); + if( !preamble.isEmpty()) + aVertexShaderSource = preamble + "\n" + aVertexShaderSource; char const * VertexSourcePointer = aVertexShaderSource.getStr(); glShaderSource(VertexShaderID, 1, &VertexSourcePointer , NULL); glCompileShader(VertexShaderID); @@ -120,6 +122,8 @@ GLint OpenGLHelper::LoadShaders(const OUString& rVertexShaderName,const OUString // Compile Fragment Shader OString aFragmentShaderSource = loadShader(rFragmentShaderName); + if( !preamble.isEmpty()) + aFragmentShaderSource = preamble + "\n" + aFragmentShaderSource; char const * FragmentSourcePointer = aFragmentShaderSource.getStr(); glShaderSource(FragmentShaderID, 1, &FragmentSourcePointer , NULL); glCompileShader(FragmentShaderID); |