diff options
author | Laszlo Agocs <laszlo.agocs@theqtcompany.com> | 2014-12-16 12:49:08 +0100 |
---|---|---|
committer | Laszlo Agocs <laszlo.agocs@theqtcompany.com> | 2015-01-07 13:21:00 +0100 |
commit | fae16f9d2fca773276eba150d0414fb2f303d179 (patch) | |
tree | 7d657c46028f1e0e0c220414f15a4e01fab425f3 /examples/quick/rendercontrol | |
parent | 5352f67ffa5ee257f2856deb8f5f8cd69108e278 (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/quick/rendercontrol')
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() |