diff options
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() |