summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Meeks <michael.meeks@collabora.com>2015-08-29 23:15:54 +0100
committerJan Holesovsky <kendy@collabora.com>2015-09-01 14:00:13 +0000
commit77d7cab8b90b967c6788546a77150f78d74549ea (patch)
treeb8b6033f28507de9aee2bfd7d3a386967c5ffeb3
parentfba2fee26909ac14f6d1531655556dc33bc29df4 (diff)
tdf#93772 - handle framebuffer unbinding on GL context switch.
Also start gl tests in vcldemo: $ SAL_FORCEGL=1 vcldemo --gltests Change-Id: I8f0022770d57cd60c830659e3f7fcc0721320a10 Reviewed-on: https://gerrit.libreoffice.org/18135 Reviewed-by: Jan Holesovsky <kendy@collabora.com> Tested-by: Jan Holesovsky <kendy@collabora.com>
-rw-r--r--include/vcl/opengl/OpenGLContext.hxx2
-rw-r--r--vcl/Executable_vcldemo.mk7
-rw-r--r--vcl/inc/opengl/framebuffer.hxx2
-rw-r--r--vcl/inc/opengl/texture.hxx2
-rw-r--r--vcl/inc/openglgdiimpl.hxx4
-rw-r--r--vcl/opengl/framebuffer.cxx2
-rw-r--r--vcl/source/opengl/OpenGLContext.cxx5
-rw-r--r--vcl/workben/vcldemo.cxx86
8 files changed, 103 insertions, 7 deletions
diff --git a/include/vcl/opengl/OpenGLContext.hxx b/include/vcl/opengl/OpenGLContext.hxx
index 8c756b7d303e..7012c313044c 100644
--- a/include/vcl/opengl/OpenGLContext.hxx
+++ b/include/vcl/opengl/OpenGLContext.hxx
@@ -63,6 +63,7 @@ class OpenGLFramebuffer;
class OpenGLProgram;
class OpenGLTexture;
class SalGraphicsImpl;
+class OpenGLTests;
/// Holds the information of our new child window
struct GLWindow
@@ -166,6 +167,7 @@ struct GLWindow
class VCL_DLLPUBLIC OpenGLContext
{
+ friend class OpenGLTests;
public:
OpenGLContext();
~OpenGLContext();
diff --git a/vcl/Executable_vcldemo.mk b/vcl/Executable_vcldemo.mk
index 5fa49e608f2d..3aee6ac11dc9 100644
--- a/vcl/Executable_vcldemo.mk
+++ b/vcl/Executable_vcldemo.mk
@@ -15,7 +15,12 @@ $(eval $(call gb_Executable_use_api,vcldemo,\
udkapi \
))
-$(eval $(call gb_Executable_use_external,vcldemo,boost_headers))
+$(eval $(call gb_Executable_use_externals,vcldemo,\
+ boost_headers \
+ glew \
+ glm_headers \
+ mesa_headers \
+))
$(eval $(call gb_Executable_set_include,vcldemo,\
$$(INCLUDE) \
diff --git a/vcl/inc/opengl/framebuffer.hxx b/vcl/inc/opengl/framebuffer.hxx
index 89bf1a42215b..9b42311ff380 100644
--- a/vcl/inc/opengl/framebuffer.hxx
+++ b/vcl/inc/opengl/framebuffer.hxx
@@ -15,7 +15,7 @@
#include <opengl/texture.hxx>
-class VCL_PLUGIN_PUBLIC OpenGLFramebuffer
+class VCL_DLLPUBLIC OpenGLFramebuffer
{
private:
GLuint mnId;
diff --git a/vcl/inc/opengl/texture.hxx b/vcl/inc/opengl/texture.hxx
index 178efe531924..01dbeccb0b47 100644
--- a/vcl/inc/opengl/texture.hxx
+++ b/vcl/inc/opengl/texture.hxx
@@ -79,7 +79,7 @@ public:
int FindFreeSlot();
};
-class VCL_PLUGIN_PUBLIC OpenGLTexture
+class VCL_DLLPUBLIC OpenGLTexture
{
private:
// if the rect size doesn't match the mpImpl one, this instance
diff --git a/vcl/inc/openglgdiimpl.hxx b/vcl/inc/openglgdiimpl.hxx
index 9e95f5ec113c..1809476a41ba 100644
--- a/vcl/inc/openglgdiimpl.hxx
+++ b/vcl/inc/openglgdiimpl.hxx
@@ -34,6 +34,7 @@
class SalFrame;
class SalVirtualDevice;
+class OpenGLTests;
namespace basegfx
{
@@ -46,8 +47,9 @@ struct TextureCombo
std::unique_ptr<OpenGLTexture> mpMask;
};
-class VCL_PLUGIN_PUBLIC OpenGLSalGraphicsImpl : public SalGraphicsImpl
+class VCL_DLLPUBLIC OpenGLSalGraphicsImpl : public SalGraphicsImpl
{
+ friend class OpenGLTests;
protected:
OpenGLContext* mpContext;
diff --git a/vcl/opengl/framebuffer.cxx b/vcl/opengl/framebuffer.cxx
index 7e19981f8078..b1135fcdf940 100644
--- a/vcl/opengl/framebuffer.cxx
+++ b/vcl/opengl/framebuffer.cxx
@@ -32,8 +32,8 @@ OpenGLFramebuffer::~OpenGLFramebuffer()
void OpenGLFramebuffer::Bind()
{
- glBindFramebuffer( GL_FRAMEBUFFER, mnId );
VCL_GL_INFO( "vcl.opengl", "Binding framebuffer " << (int)mnId );
+ glBindFramebuffer( GL_FRAMEBUFFER, mnId );
CHECK_GL_ERROR();
}
diff --git a/vcl/source/opengl/OpenGLContext.cxx b/vcl/source/opengl/OpenGLContext.cxx
index 63588fd230da..4f39bef92a38 100644
--- a/vcl/source/opengl/OpenGLContext.cxx
+++ b/vcl/source/opengl/OpenGLContext.cxx
@@ -1654,6 +1654,7 @@ void OpenGLContext::ReleaseFramebuffer( OpenGLFramebuffer* pFramebuffer )
void OpenGLContext::ReleaseFramebuffer( const OpenGLTexture& rTexture )
{
OpenGLZone aZone;
+
OpenGLFramebuffer* pFramebuffer = mpLastFramebuffer;
while( pFramebuffer )
@@ -1662,6 +1663,8 @@ void OpenGLContext::ReleaseFramebuffer( const OpenGLTexture& rTexture )
{
BindFramebuffer( pFramebuffer );
pFramebuffer->DetachTexture();
+ if (mpCurrentFramebuffer == pFramebuffer)
+ BindFramebuffer( NULL );
}
pFramebuffer = pFramebuffer->mpPrevFramebuffer;
}
@@ -1670,6 +1673,7 @@ void OpenGLContext::ReleaseFramebuffer( const OpenGLTexture& rTexture )
void OpenGLContext::ReleaseFramebuffers()
{
OpenGLZone aZone;
+
OpenGLFramebuffer* pFramebuffer = mpLastFramebuffer;
while( pFramebuffer )
{
@@ -1680,6 +1684,7 @@ void OpenGLContext::ReleaseFramebuffers()
}
pFramebuffer = pFramebuffer->mpPrevFramebuffer;
}
+ BindFramebuffer( NULL );
}
OpenGLProgram* OpenGLContext::GetProgram( const OUString& rVertexShader, const OUString& rFragmentShader, const OString& preamble )
diff --git a/vcl/workben/vcldemo.cxx b/vcl/workben/vcldemo.cxx
index e0218e0e10af..0e32802492cc 100644
--- a/vcl/workben/vcldemo.cxx
+++ b/vcl/workben/vcldemo.cxx
@@ -43,6 +43,14 @@
#include <vcldemo-debug.hxx>
#include <opengl/zone.hxx>
+// internal headers for OpenGLTests class.
+#include "salgdi.hxx"
+#include "salframe.hxx"
+#include "openglgdiimpl.hxx"
+#include "opengl/texture.hxx"
+#include "opengl/framebuffer.hxx"
+#include <vcl/opengl/OpenGLHelper.hxx>
+
#include <rtl/math.hxx>
#define FIXME_SELF_INTERSECTING_WORKING 0
@@ -1627,6 +1635,71 @@ class DemoPopup : public FloatingWindow
}
};
+class OpenGLTests
+{
+ VclPtr<WorkWindow> mxWinA;
+ VclPtr<WorkWindow> mxWinB;
+ OpenGLSalGraphicsImpl *mpImplA;
+ OpenGLSalGraphicsImpl *mpImplB;
+ OpenGLContext *mpA;
+ OpenGLContext *mpB;
+
+ OpenGLSalGraphicsImpl *getImpl(const VclPtr<WorkWindow> &xWin)
+ {
+ SalGraphics *pGraphics = xWin->GetGraphics();
+ return dynamic_cast<OpenGLSalGraphicsImpl *>(pGraphics->GetImpl());
+ }
+public:
+ OpenGLTests() :
+ mxWinA(VclPtr<WorkWindow>::Create(nullptr, WB_APP | WB_STDWORK)),
+ mxWinB(VclPtr<WorkWindow>::Create(nullptr, WB_APP | WB_STDWORK))
+ {
+ if (!OpenGLHelper::isVCLOpenGLEnabled())
+ {
+ fprintf (stderr, "OpenGL is not enabled: try SAL_FORCEGL=1\n");
+ return;
+ }
+
+ mpImplA = getImpl(mxWinA);
+ mpImplB = getImpl(mxWinB);
+ assert (mpImplA && mpImplB);
+ mpA = mpImplA->GetOpenGLContext();
+ mpB = mpImplB->GetOpenGLContext();
+
+ assert (mpA && mpB);
+ }
+ ~OpenGLTests()
+ {
+ mxWinB.disposeAndClear();
+ mxWinA.disposeAndClear();
+ }
+
+ void testCurrentFramebuffer()
+ {
+ fprintf(stderr,"test OpenGLContext's framebuffer association.\n");
+ mpA->makeCurrent();
+ OpenGLFramebuffer *pBuffer;
+ {
+ OpenGLTexture aTexture(256,128);
+ pBuffer = mpA->AcquireFramebuffer(aTexture);
+ pBuffer->DetachTexture(); // TESTME - remove this line too ...
+ }
+ assert (pBuffer->IsFree());
+ mpB->makeCurrent();
+ assert (mpA->mpCurrentFramebuffer == NULL);
+ }
+
+ int execute()
+ {
+ if (!OpenGLHelper::isVCLOpenGLEnabled())
+ return 1;
+
+ testCurrentFramebuffer();
+
+ return 0;
+ }
+};
+
class DemoApp : public Application
{
static int showHelp(DemoRenderer &rRenderer)
@@ -1640,6 +1713,7 @@ class DemoApp : public Application
fprintf(stderr," --test <iterCount> - create benchmark data\n");
fprintf(stderr," --widgets - launch the widget test.\n");
fprintf(stderr," --threads - render from multiple threads.\n");
+ fprintf(stderr," --gltest - run openGL regression tests.\n");
fprintf(stderr, "\n");
return 0;
}
@@ -1651,7 +1725,8 @@ public:
{
try
{
- bool bWidgets = false, bThreads = false, bPopup = false;
+ bool bWidgets = false, bThreads = false;
+ bool bPopup = false, bGLTest = false;
DemoRenderer aRenderer;
for (sal_Int32 i = 0; i < GetCommandLineParamCount(); i++)
@@ -1678,6 +1753,8 @@ public:
bWidgets = true;
else if (aArg == "--popup")
bPopup = true;
+ else if (aArg == "--gltest")
+ bGLTest = true;
else if (aArg == "--threads")
bThreads = true;
else if (aArg.startsWith("--"))
@@ -1694,7 +1771,12 @@ public:
aMainWin->SetText("Interactive VCL demo #1");
- if (bWidgets)
+ if (bGLTest)
+ {
+ OpenGLTests aTests;
+ return aTests.execute();
+ }
+ else if (bWidgets)
xWidgets = VclPtr< DemoWidgets >::Create ();
else if (bPopup)
xPopup = VclPtrInstance< DemoPopup> ();