summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/vcl/opengl/OpenGLContext.hxx14
-rw-r--r--include/vcl/opengl/OpenGLHelper.hxx2
-rw-r--r--vcl/inc/opengl/program.hxx2
-rw-r--r--vcl/inc/openglgdiimpl.hxx2
-rw-r--r--vcl/opengl/gdiimpl.cxx4
-rw-r--r--vcl/opengl/program.cxx4
-rw-r--r--vcl/source/opengl/OpenGLContext.cxx26
-rw-r--r--vcl/source/opengl/OpenGLHelper.cxx6
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);