diff options
author | Paul Lemire <paul.lemire@kdab.com> | 2016-01-22 11:31:22 +0100 |
---|---|---|
committer | Paul Lemire <paul.lemire@kdab.com> | 2016-03-17 11:27:53 +0000 |
commit | 7ff2cc9c1f037fa9159bc24d8a47778ebac2390a (patch) | |
tree | d96af4c0415662906c1c6fa5a64601b539cb106a /src/render/backend/platformsurfacefilter_p.h | |
parent | c01bc22c287e58186a285b3f8507711fd982fd05 (diff) |
Renderer/QRenderTargetSurfaceSelector: implement proper synchronization
This is needed to avoid rendering on a surface that has been destroyed.
Change-Id: Iadc2a32e2e0113704ca4df48df6bcdd1a0d8256c
Reviewed-by: Paul Lemire <paul.lemire@kdab.com>
Diffstat (limited to 'src/render/backend/platformsurfacefilter_p.h')
-rw-r--r-- | src/render/backend/platformsurfacefilter_p.h | 34 |
1 files changed, 24 insertions, 10 deletions
diff --git a/src/render/backend/platformsurfacefilter_p.h b/src/render/backend/platformsurfacefilter_p.h index be86085de..a33c64d72 100644 --- a/src/render/backend/platformsurfacefilter_p.h +++ b/src/render/backend/platformsurfacefilter_p.h @@ -53,6 +53,7 @@ #include <QtCore/qobject.h> #include <QtGui/qsurface.h> +#include <QSemaphore> QT_BEGIN_NAMESPACE @@ -72,15 +73,11 @@ public: explicit PlatformSurfaceFilter(QObject *parent = 0); ~PlatformSurfaceFilter(); - void setWindow(QWindow *window); - void setOffscreenSurface(QOffscreenSurface *offscreen); - - void setRenderer(AbstractRenderer *renderer); - bool eventFilter(QObject *obj, QEvent *e) Q_DECL_OVERRIDE; -private: - void setRendererSurface(QSurface *surface); + static void lockSurface(); + static void releaseSurface(); + static bool isSurfaceValid(QSurface *surface); template<class T> void setSurface(T *surface) @@ -94,13 +91,30 @@ private: m_surface = surface; m_obj = surface; - if (m_obj) + if (m_obj) { m_obj->installEventFilter(this); + markSurfaceAsValid(); + } } - +private: QObject *m_obj; QSurface *m_surface; - AbstractRenderer *m_renderer; + + static QSemaphore m_surfacesSemaphore; + static QHash<QSurface *, bool> m_surfacesValidity; + void markSurfaceAsValid(); +}; + +class SurfaceLocker +{ +public: + explicit SurfaceLocker(QSurface *surface); + ~SurfaceLocker(); + bool isSurfaceValid() const +; + +private: + QSurface *m_surface; }; } // namespace Render |