summaryrefslogtreecommitdiffstats
path: root/src/render/backend/platformsurfacefilter_p.h
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire@kdab.com>2016-01-22 11:31:22 +0100
committerPaul Lemire <paul.lemire@kdab.com>2016-03-17 11:27:53 +0000
commit7ff2cc9c1f037fa9159bc24d8a47778ebac2390a (patch)
treed96af4c0415662906c1c6fa5a64601b539cb106a /src/render/backend/platformsurfacefilter_p.h
parentc01bc22c287e58186a285b3f8507711fd982fd05 (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.h34
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