diff options
author | Andy Shaw <andy.shaw@qt.io> | 2019-10-09 11:14:36 +0200 |
---|---|---|
committer | Andy Shaw <andy.shaw@qt.io> | 2019-10-10 15:19:49 +0200 |
commit | 93aa379ae5cf624f024aa9173ce42e90b5c58002 (patch) | |
tree | e4daef84bdd097935f8aa082f6904fff35515f16 /src/render/renderers/opengl | |
parent | e628cf90be9eef43d7a80a35067a5f4a6ef80809 (diff) |
Make sure right screen is set on QOpenGLContext and QOffscreenSurface
When the Qt3D window is on a specific screen, then it needs to ensure
that any supporting QOpenGLContexts and QOffscreenSurfaces are set to
be using that same screen or it will fail to render the content.
Change-Id: Ief4f3e88bf6f71862bc5dace0cb0bddcdf3a98b5
Reviewed-by: Tomi Korpipää <tomi.korpipaa@qt.io>
Reviewed-by: Paul Lemire <paul.lemire@kdab.com>
Diffstat (limited to 'src/render/renderers/opengl')
-rw-r--r-- | src/render/renderers/opengl/renderer/commandthread.cpp | 1 | ||||
-rw-r--r-- | src/render/renderers/opengl/renderer/renderer.cpp | 14 | ||||
-rw-r--r-- | src/render/renderers/opengl/renderer/renderer_p.h | 4 |
3 files changed, 19 insertions, 0 deletions
diff --git a/src/render/renderers/opengl/renderer/commandthread.cpp b/src/render/renderers/opengl/renderer/commandthread.cpp index dcaacadcc..70ab964d6 100644 --- a/src/render/renderers/opengl/renderer/commandthread.cpp +++ b/src/render/renderers/opengl/renderer/commandthread.cpp @@ -97,6 +97,7 @@ void CommandThread::initialize(QOpenGLContext *mainContext, OffscreenSurfaceHelp // thread the wglShareLists call is made on) m_localContext.reset(new QOpenGLContext()); m_localContext->setFormat(m_mainContext->format()); + m_localContext->setScreen(m_mainContext->screen()); m_localContext->setShareContext(m_mainContext); if (!m_localContext->create()) qWarning("CommandThread: Failed to create local context"); diff --git a/src/render/renderers/opengl/renderer/renderer.cpp b/src/render/renderers/opengl/renderer/renderer.cpp index b4a19c641..d0b1f2a5d 100644 --- a/src/render/renderers/opengl/renderer/renderer.cpp +++ b/src/render/renderers/opengl/renderer/renderer.cpp @@ -357,6 +357,16 @@ void Renderer::setOpenGLContext(QOpenGLContext *context) m_glContext = context; } +void Renderer::setScreen(QScreen *scr) +{ + m_screen = scr; +} + +QScreen *Renderer::screen() const +{ + return m_screen; +} + // Called in RenderThread context by the run method of RenderThread // RenderThread has locked the mutex already and unlocks it when this // method termintates @@ -374,6 +384,8 @@ void Renderer::initialize() // we need to create it if (!m_glContext) { ctx = new QOpenGLContext; + if (m_screen) + ctx->setScreen(m_screen); ctx->setShareContext(qt_gl_global_share_context()); // TO DO: Shouldn't we use the highest context available and trust @@ -403,6 +415,8 @@ void Renderer::initialize() if (!ctx->shareContext()) { m_shareContext = new QOpenGLContext; + if (ctx->screen()) + m_shareContext->setScreen(ctx->screen()); m_shareContext->setFormat(ctx->format()); m_shareContext->setShareContext(ctx); m_shareContext->create(); diff --git a/src/render/renderers/opengl/renderer/renderer_p.h b/src/render/renderers/opengl/renderer/renderer_p.h index 5b5f5c4f4..9376e9eda 100644 --- a/src/render/renderers/opengl/renderer/renderer_p.h +++ b/src/render/renderers/opengl/renderer/renderer_p.h @@ -106,6 +106,7 @@ QT_BEGIN_NAMESPACE class QSurface; class QMouseEvent; +class QScreen; namespace Qt3DCore { class QEntity; @@ -294,6 +295,8 @@ public: ViewSubmissionResultData submitRenderViews(const QVector<Render::RenderView *> &renderViews); RendererCache *cache() { return &m_cache; } + void setScreen(QScreen *scr) override; + QScreen *screen() const override; #ifdef QT3D_RENDER_UNIT_TESTS public: @@ -421,6 +424,7 @@ private: QMetaObject::Connection m_contextConnection; RendererCache m_cache; + QScreen *m_screen = nullptr; }; } // namespace Render |