diff options
author | Michael Meeks <michael.meeks@collabora.com> | 2015-08-29 23:15:54 +0100 |
---|---|---|
committer | Michael Meeks <michael.meeks@collabora.com> | 2015-08-31 19:48:14 +0000 |
commit | b27b9084c5b55f6cf6732fb9bdc253658ea612ea (patch) | |
tree | a7e4cad084a1e948a7c9cf1595f040edc0179e1f | |
parent | 1ba1a21aa6b77ef8d3d59b3658dfd2aa87d0dee2 (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/18132
Reviewed-by: Michael Meeks <michael.meeks@collabora.com>
Tested-by: Michael Meeks <michael.meeks@collabora.com>
-rw-r--r-- | include/vcl/opengl/OpenGLContext.hxx | 2 | ||||
-rw-r--r-- | vcl/Executable_vcldemo.mk | 7 | ||||
-rw-r--r-- | vcl/inc/opengl/framebuffer.hxx | 2 | ||||
-rw-r--r-- | vcl/inc/opengl/texture.hxx | 2 | ||||
-rw-r--r-- | vcl/inc/openglgdiimpl.hxx | 4 | ||||
-rw-r--r-- | vcl/opengl/framebuffer.cxx | 2 | ||||
-rw-r--r-- | vcl/source/opengl/OpenGLContext.cxx | 5 | ||||
-rw-r--r-- | vcl/workben/vcldemo.cxx | 86 |
8 files changed, 103 insertions, 7 deletions
diff --git a/include/vcl/opengl/OpenGLContext.hxx b/include/vcl/opengl/OpenGLContext.hxx index 96abe498fa80..cb45973395b4 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..c86c7faf2965 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 5d5e870bed3d..7acd7105d86f 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 a6117a77d810..89fc50050e8a 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 912b91768176..c95453e75aef 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 cb0535623c28..0d7e9cc8167a 100644 --- a/vcl/source/opengl/OpenGLContext.cxx +++ b/vcl/source/opengl/OpenGLContext.cxx @@ -1566,6 +1566,7 @@ void OpenGLContext::ReleaseFramebuffer( OpenGLFramebuffer* pFramebuffer ) void OpenGLContext::ReleaseFramebuffer( const OpenGLTexture& rTexture ) { OpenGLZone aZone; + OpenGLFramebuffer* pFramebuffer = mpLastFramebuffer; while( pFramebuffer ) @@ -1574,6 +1575,8 @@ void OpenGLContext::ReleaseFramebuffer( const OpenGLTexture& rTexture ) { BindFramebuffer( pFramebuffer ); pFramebuffer->DetachTexture(); + if (mpCurrentFramebuffer == pFramebuffer) + BindFramebuffer( NULL ); } pFramebuffer = pFramebuffer->mpPrevFramebuffer; } @@ -1582,6 +1585,7 @@ void OpenGLContext::ReleaseFramebuffer( const OpenGLTexture& rTexture ) void OpenGLContext::ReleaseFramebuffers() { OpenGLZone aZone; + OpenGLFramebuffer* pFramebuffer = mpLastFramebuffer; while( pFramebuffer ) { @@ -1592,6 +1596,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 9218afde7e6c..417d69fded8e 100644 --- a/vcl/workben/vcldemo.cxx +++ b/vcl/workben/vcldemo.cxx @@ -44,6 +44,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 @@ -1643,6 +1651,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) @@ -1656,6 +1729,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; } @@ -1667,7 +1741,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++) @@ -1694,6 +1769,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("--")) @@ -1710,7 +1787,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> (); |