diff options
author | Luboš Luňák <l.lunak@collabora.com> | 2015-01-20 14:48:48 +0100 |
---|---|---|
committer | Michael Meeks <michael.meeks@collabora.com> | 2015-01-28 14:29:06 +0000 |
commit | a51481f413a2bf513a171c460fd5522c8fb30361 (patch) | |
tree | 6056675e04a1f55e21eb30c2d3a4365ec775f0eb /vcl | |
parent | fadd4a2c740e2abe911d29d00f273d115b2c9b54 (diff) |
make it possible to easily have variants of glsl programs
Now it's possible to add a preamble to the compiled program, so there can
be just one program with #ifdef's inside and the small variants can be
selected using #define in the preamble instead of having several almost
identical programs.
Change-Id: I6c5112313b91b6269ebdecdfc896e0f96209ea2b
Signed-off-by: Michael Meeks <michael.meeks@collabora.com>
Diffstat (limited to 'vcl')
-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 |
6 files changed, 32 insertions, 12 deletions
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); |