diff options
author | Sean Harmer <sean.harmer@kdab.com> | 2018-02-06 11:33:27 +0000 |
---|---|---|
committer | Sean Harmer <sean.harmer@kdab.com> | 2018-02-06 11:55:15 +0000 |
commit | 037ef30a55fd6fb730954ec3f7224121c52de95d (patch) | |
tree | d54bc2013642bddac539933f40efec6f869b64f5 /src | |
parent | 0403ee45736241aa621eb3d38880a4fff571fd96 (diff) | |
parent | 13f340c92bdf725d214ab4840fc2e071d12d6e00 (diff) |
Merge remote-tracking branch 'origin/5.9' into 5.10
Change-Id: I72fdfb9a20be2f819542243e888756818b03c28e
Diffstat (limited to 'src')
-rw-r--r-- | src/quick3d/quick3dscene2d/items/scene2d.cpp | 13 | ||||
-rw-r--r-- | src/render/backend/renderer.cpp | 75 | ||||
-rw-r--r-- | src/render/backend/renderer_p.h | 1 |
3 files changed, 50 insertions, 39 deletions
diff --git a/src/quick3d/quick3dscene2d/items/scene2d.cpp b/src/quick3d/quick3dscene2d/items/scene2d.cpp index 67bb1a671..7e3334f00 100644 --- a/src/quick3d/quick3dscene2d/items/scene2d.cpp +++ b/src/quick3d/quick3dscene2d/items/scene2d.cpp @@ -123,7 +123,7 @@ Scene2D::Scene2D() , m_mouseEnabled(true) , m_renderPolicy(Qt3DRender::Quick::QScene2D::Continuous) { - renderThreadClientCount->fetchAndAddAcquire(1); + } Scene2D::~Scene2D() @@ -146,6 +146,8 @@ void Scene2D::initializeSharedObject() return; } + renderThreadClientCount->fetchAndAddAcquire(1); + renderThread->setObjectName(QStringLiteral("Scene2D::renderThread")); m_renderThread = renderThread; m_sharedObject->m_renderThread = m_renderThread; @@ -413,10 +415,11 @@ void Scene2D::cleanup() m_sharedObject->wake(); m_sharedObject = nullptr; } - - renderThreadClientCount->fetchAndSubAcquire(1); - if (renderThreadClientCount->load() == 0) - renderThread->quit(); + if (m_renderThread) { + renderThreadClientCount->fetchAndSubAcquire(1); + if (renderThreadClientCount->load() == 0) + renderThread->quit(); + } } diff --git a/src/render/backend/renderer.cpp b/src/render/backend/renderer.cpp index 092340cf1..8fa68191d 100644 --- a/src/render/backend/renderer.cpp +++ b/src/render/backend/renderer.cpp @@ -339,7 +339,11 @@ NodeManagers *Renderer::nodeManagers() const */ QOpenGLContext *Renderer::shareContext() const { - return m_shareContext ? m_shareContext : m_graphicsContext->openGLContext()->shareContext(); + QMutexLocker lock(&m_shareContextMutex); + return m_shareContext ? m_shareContext + : (m_graphicsContext->openGLContext() + ? m_graphicsContext->openGLContext()->shareContext() + : nullptr); } void Renderer::setOpenGLContext(QOpenGLContext *context) @@ -357,45 +361,48 @@ void Renderer::initialize() QOpenGLContext* ctx = m_glContext; - // If we are using our own context (not provided by QtQuick), - // we need to create it - if (!m_glContext) { - ctx = new QOpenGLContext; - ctx->setShareContext(qt_gl_global_share_context()); - - // TO DO: Shouldn't we use the highest context available and trust - // QOpenGLContext to fall back on the best lowest supported ? - const QByteArray debugLoggingMode = qgetenv("QT3DRENDER_DEBUG_LOGGING"); + { + QMutexLocker lock(&m_shareContextMutex); + // If we are using our own context (not provided by QtQuick), + // we need to create it + if (!m_glContext) { + ctx = new QOpenGLContext; + ctx->setShareContext(qt_gl_global_share_context()); + + // TO DO: Shouldn't we use the highest context available and trust + // QOpenGLContext to fall back on the best lowest supported ? + const QByteArray debugLoggingMode = qgetenv("QT3DRENDER_DEBUG_LOGGING"); + + if (!debugLoggingMode.isEmpty()) { + QSurfaceFormat sf = ctx->format(); + sf.setOption(QSurfaceFormat::DebugContext); + ctx->setFormat(sf); + } - if (!debugLoggingMode.isEmpty()) { - QSurfaceFormat sf = ctx->format(); - sf.setOption(QSurfaceFormat::DebugContext); - ctx->setFormat(sf); + // Create OpenGL context + if (ctx->create()) + qCDebug(Backend) << "OpenGL context created with actual format" << ctx->format(); + else + qCWarning(Backend) << Q_FUNC_INFO << "OpenGL context creation failed"; + m_ownedContext = true; + } else { + // Context is not owned by us, so we need to know if it gets destroyed + m_contextConnection = QObject::connect(m_glContext, &QOpenGLContext::aboutToBeDestroyed, + [this] { releaseGraphicsResources(); }); } - // Create OpenGL context - if (ctx->create()) - qCDebug(Backend) << "OpenGL context created with actual format" << ctx->format(); - else - qCWarning(Backend) << Q_FUNC_INFO << "OpenGL context creation failed"; - m_ownedContext = true; - } else { - // Context is not owned by us, so we need to know if it gets destroyed - m_contextConnection = QObject::connect(m_glContext, &QOpenGLContext::aboutToBeDestroyed, - [this] { releaseGraphicsResources(); }); - } + if (!ctx->shareContext()) { + m_shareContext = new QOpenGLContext; + m_shareContext->setFormat(ctx->format()); + m_shareContext->setShareContext(ctx); + m_shareContext->create(); + } - if (!ctx->shareContext()) { - m_shareContext = new QOpenGLContext; - m_shareContext->setFormat(ctx->format()); - m_shareContext->setShareContext(ctx); - m_shareContext->create(); + // Note: we don't have a surface at this point + // The context will be made current later on (at render time) + m_graphicsContext->setOpenGLContext(ctx); } - // Note: we don't have a surface at this point - // The context will be made current later on (at render time) - m_graphicsContext->setOpenGLContext(ctx); - // Store the format used by the context and queue up creating an // offscreen surface in the main thread so that it is available // for use when we want to shutdown the renderer. We need to create diff --git a/src/render/backend/renderer_p.h b/src/render/backend/renderer_p.h index b5c8d2c4c..adda6dff1 100644 --- a/src/render/backend/renderer_p.h +++ b/src/render/backend/renderer_p.h @@ -330,6 +330,7 @@ private: QAtomicInt m_lastFrameCorrect; QOpenGLContext *m_glContext; QOpenGLContext *m_shareContext; + mutable QMutex m_shareContextMutex; PickBoundingVolumeJobPtr m_pickBoundingVolumeJob; qint64 m_time; |