aboutsummaryrefslogtreecommitdiffstats
path: root/examples
diff options
context:
space:
mode:
authorLaszlo Agocs <laszlo.agocs@theqtcompany.com>2014-12-16 12:49:08 +0100
committerLaszlo Agocs <laszlo.agocs@theqtcompany.com>2015-01-07 13:21:00 +0100
commitfae16f9d2fca773276eba150d0414fb2f303d179 (patch)
tree7d657c46028f1e0e0c220414f15a4e01fab425f3 /examples
parent5352f67ffa5ee257f2856deb8f5f8cd69108e278 (diff)
Prevent windows outside the gui thread in rendercontrol example
In the multithreaded case we attempted to create QWindows outside the gui thread on platforms where QOffscreenSurface is backed by the hidden QWindow in the absence of a better solution. This has to be avoided. Therefore, pass a suitable surface from the gui thread instead. This will avoid "Attempting to create QWindow-based QOffscreenSurface outside the gui thread." type of warnings when running on OS X with --threaded. Change-Id: Ie3ebeeeaa9e6bdf83e763e40213e2940fbfde667 Reviewed-by: Gabriel de Dietrich <gabriel.dedietrich@theqtcompany.com> Reviewed-by: Jørgen Lind <jorgen.lind@theqtcompany.com>
Diffstat (limited to 'examples')
-rw-r--r--examples/quick/rendercontrol/cuberenderer.cpp10
-rw-r--r--examples/quick/rendercontrol/cuberenderer.h4
-rw-r--r--examples/quick/rendercontrol/window_multithreaded.cpp6
-rw-r--r--examples/quick/rendercontrol/window_singlethreaded.cpp6
4 files changed, 15 insertions, 11 deletions
diff --git a/examples/quick/rendercontrol/cuberenderer.cpp b/examples/quick/rendercontrol/cuberenderer.cpp
index c385d46533..02d925b148 100644
--- a/examples/quick/rendercontrol/cuberenderer.cpp
+++ b/examples/quick/rendercontrol/cuberenderer.cpp
@@ -48,8 +48,9 @@
#include <QOffscreenSurface>
#include <QWindow>
-CubeRenderer::CubeRenderer()
- : m_context(0),
+CubeRenderer::CubeRenderer(QOffscreenSurface *offscreenSurface)
+ : m_offscreenSurface(offscreenSurface),
+ m_context(0),
m_program(0),
m_vbo(0)
{
@@ -59,10 +60,7 @@ CubeRenderer::~CubeRenderer()
{
// Use a temporary offscreen surface to do the cleanup.
// There may not be a native window surface available anymore at this stage.
- QScopedPointer<QOffscreenSurface> offscreenSurface(new QOffscreenSurface);
- offscreenSurface->setFormat(m_context->format());
- offscreenSurface->create();
- m_context->makeCurrent(offscreenSurface.data());
+ m_context->makeCurrent(m_offscreenSurface);
delete m_program;
delete m_vbo;
diff --git a/examples/quick/rendercontrol/cuberenderer.h b/examples/quick/rendercontrol/cuberenderer.h
index 8f98376fdf..1d5400ade2 100644
--- a/examples/quick/rendercontrol/cuberenderer.h
+++ b/examples/quick/rendercontrol/cuberenderer.h
@@ -48,11 +48,12 @@ QT_FORWARD_DECLARE_CLASS(QOpenGLShaderProgram)
QT_FORWARD_DECLARE_CLASS(QOpenGLBuffer)
QT_FORWARD_DECLARE_CLASS(QOpenGLVertexArrayObject)
QT_FORWARD_DECLARE_CLASS(QWindow)
+QT_FORWARD_DECLARE_CLASS(QOffscreenSurface)
class CubeRenderer
{
public:
- CubeRenderer();
+ CubeRenderer(QOffscreenSurface *offscreenSurface);
~CubeRenderer();
void resize(int w, int h);
@@ -62,6 +63,7 @@ private:
void init(QWindow *w, QOpenGLContext *share);
void setupVertexAttribs();
+ QOffscreenSurface *m_offscreenSurface;
QOpenGLContext *m_context;
QOpenGLShaderProgram *m_program;
QOpenGLBuffer *m_vbo;
diff --git a/examples/quick/rendercontrol/window_multithreaded.cpp b/examples/quick/rendercontrol/window_multithreaded.cpp
index ad261848bf..2248105e9b 100644
--- a/examples/quick/rendercontrol/window_multithreaded.cpp
+++ b/examples/quick/rendercontrol/window_multithreaded.cpp
@@ -130,7 +130,11 @@ void QuickRenderer::init()
{
m_context->makeCurrent(m_surface);
- m_cubeRenderer = new CubeRenderer;
+ // Pass our offscreen surface to the cube renderer just so that it will
+ // have something is can make current during cleanup. QOffscreenSurface,
+ // just like QWindow, must always be created on the gui thread (as it might
+ // be backed by an actual QWindow).
+ m_cubeRenderer = new CubeRenderer(m_surface);
m_cubeRenderer->resize(m_window->width(), m_window->height());
m_renderControl->initialize(m_context);
diff --git a/examples/quick/rendercontrol/window_singlethreaded.cpp b/examples/quick/rendercontrol/window_singlethreaded.cpp
index 454b06f425..8ed3f5555c 100644
--- a/examples/quick/rendercontrol/window_singlethreaded.cpp
+++ b/examples/quick/rendercontrol/window_singlethreaded.cpp
@@ -81,7 +81,7 @@ WindowSingleThreaded::WindowSingleThreaded()
m_offscreenSurface->setFormat(m_context->format());
m_offscreenSurface->create();
- m_cubeRenderer = new CubeRenderer;
+ m_cubeRenderer = new CubeRenderer(m_offscreenSurface);
m_renderControl = new QQuickRenderControl(this);
@@ -129,10 +129,10 @@ WindowSingleThreaded::~WindowSingleThreaded()
m_context->doneCurrent();
+ delete m_cubeRenderer;
+
delete m_offscreenSurface;
delete m_context;
-
- delete m_cubeRenderer;
}
void WindowSingleThreaded::createFbo()