diff options
-rw-r--r-- | src/quick3d/quick3drender/quick3drender.pro | 1 | ||||
-rw-r--r-- | src/quick3d/quick3drender/scene2d/scene2d.pri | 5 | ||||
-rw-r--r-- | src/render/backend/abstractrenderer_p.h | 3 | ||||
-rw-r--r-- | src/render/backend/attachmentpack.cpp | 2 | ||||
-rw-r--r-- | src/render/backend/backendnode.cpp | 5 | ||||
-rw-r--r-- | src/render/backend/backendnode_p.h | 1 | ||||
-rw-r--r-- | src/render/backend/renderer.cpp | 18 | ||||
-rw-r--r-- | src/render/backend/renderer_p.h | 2 | ||||
-rw-r--r-- | src/render/backend/rendertargetoutput.cpp | 9 | ||||
-rw-r--r-- | src/render/backend/rendertargetoutput_p.h | 3 | ||||
-rw-r--r-- | src/render/texture/gltexture_p.h | 10 | ||||
-rw-r--r-- | tests/auto/render/commons/testrenderer.cpp | 5 | ||||
-rw-r--r-- | tests/auto/render/commons/testrenderer.h | 1 |
13 files changed, 61 insertions, 4 deletions
diff --git a/src/quick3d/quick3drender/quick3drender.pro b/src/quick3d/quick3drender/quick3drender.pro index 88d7a9556..989f5615b 100644 --- a/src/quick3d/quick3drender/quick3drender.pro +++ b/src/quick3d/quick3drender/quick3drender.pro @@ -25,5 +25,6 @@ HEADERS += \ win32-g++*:QMAKE_CXXFLAGS_CXX11 = -std=gnu++0x include(./items/items.pri) +include(./scene2d/scene2d.pri) load(qt_module) diff --git a/src/quick3d/quick3drender/scene2d/scene2d.pri b/src/quick3d/quick3drender/scene2d/scene2d.pri new file mode 100644 index 000000000..05ab6b83f --- /dev/null +++ b/src/quick3d/quick3drender/scene2d/scene2d.pri @@ -0,0 +1,5 @@ +HEADERS += \ + +SOURCES += \ + +INCLUDEPATH += $$PWD diff --git a/src/render/backend/abstractrenderer_p.h b/src/render/backend/abstractrenderer_p.h index 8b17cbf45..f8d9850e7 100644 --- a/src/render/backend/abstractrenderer_p.h +++ b/src/render/backend/abstractrenderer_p.h @@ -56,6 +56,8 @@ #include <Qt3DCore/qnodeid.h> #include <QtGui/qsurfaceformat.h> +#include <QtGui/qopenglcontext.h> + QT_BEGIN_NAMESPACE class QSurface; @@ -153,6 +155,7 @@ public: virtual void setOffscreenSurfaceHelper(OffscreenSurfaceHelper *helper) = 0; virtual QSurfaceFormat format() = 0; + virtual QOpenGLContext *shareContext() const = 0; }; Q_DECLARE_OPERATORS_FOR_FLAGS(AbstractRenderer::BackendNodeDirtySet) diff --git a/src/render/backend/attachmentpack.cpp b/src/render/backend/attachmentpack.cpp index d2bb5ee9a..6dee7587b 100644 --- a/src/render/backend/attachmentpack.cpp +++ b/src/render/backend/attachmentpack.cpp @@ -60,7 +60,7 @@ AttachmentPack::AttachmentPack(const RenderTargetSelector *selector, const Rende for (Qt3DCore::QNodeId outputId : outputIds) { const RenderTargetOutput *output = attachmentManager->lookupResource(outputId); if (output) - m_attachments.append(output->attachment()); + m_attachments.append(*output->attachment()); } // Create actual DrawBuffers list that is used for glDrawBuffers diff --git a/src/render/backend/backendnode.cpp b/src/render/backend/backendnode.cpp index 7054db6a4..606016092 100644 --- a/src/render/backend/backendnode.cpp +++ b/src/render/backend/backendnode.cpp @@ -61,6 +61,11 @@ void BackendNode::setRenderer(AbstractRenderer *renderer) m_renderer = renderer; } +AbstractRenderer *BackendNode::renderer() const +{ + return m_renderer; +} + void BackendNode::markDirty(AbstractRenderer::BackendNodeDirtySet changes) { Q_ASSERT(m_renderer); diff --git a/src/render/backend/backendnode_p.h b/src/render/backend/backendnode_p.h index 5688c2412..1273144a4 100644 --- a/src/render/backend/backendnode_p.h +++ b/src/render/backend/backendnode_p.h @@ -68,6 +68,7 @@ public: ~BackendNode(); void setRenderer(AbstractRenderer *renderer); + AbstractRenderer *renderer() const; protected: void markDirty(AbstractRenderer::BackendNodeDirtySet changes); diff --git a/src/render/backend/renderer.cpp b/src/render/backend/renderer.cpp index e1b1ee873..191e70392 100644 --- a/src/render/backend/renderer.cpp +++ b/src/render/backend/renderer.cpp @@ -153,6 +153,7 @@ Renderer::Renderer(QRenderAspect::RenderType type) , m_waitForInitializationToBeCompleted(0) , m_pickEventFilter(new PickEventFilter()) , m_exposed(0) + , m_shareContext(nullptr) , m_changeSet(0) , m_lastFrameCorrect(0) , m_glContext(nullptr) @@ -261,6 +262,17 @@ NodeManagers *Renderer::nodeManagers() const return m_nodesManager; } +/*! + \internal + + Return context which can be used to share resources safely + with qt3d main render context. +*/ +QOpenGLContext *Renderer::shareContext() const +{ + return m_shareContext ? m_shareContext : m_graphicsContext->openGLContext(); +} + void Renderer::setOpenGLContext(QOpenGLContext *context) { m_glContext = context; @@ -302,6 +314,10 @@ void Renderer::initialize() // 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(); }); + m_shareContext = new QOpenGLContext; + m_shareContext->setFormat(m_glContext->format()); + m_shareContext->setShareContext(m_glContext); + m_shareContext->create(); } // Note: we don't have a surface at this point @@ -400,6 +416,8 @@ void Renderer::releaseGraphicsResources() if (m_ownedContext) delete context; + if (m_shareContext) + delete m_shareContext; m_graphicsContext.reset(nullptr); qCDebug(Backend) << Q_FUNC_INFO << "Renderer properly shutdown"; diff --git a/src/render/backend/renderer_p.h b/src/render/backend/renderer_p.h index c7c8e247a..344565173 100644 --- a/src/render/backend/renderer_p.h +++ b/src/render/backend/renderer_p.h @@ -205,6 +205,7 @@ public: virtual void setSettings(RenderSettings *settings) Q_DECL_OVERRIDE; virtual RenderSettings *settings() const Q_DECL_OVERRIDE; + QOpenGLContext *shareContext() const Q_DECL_OVERRIDE; void updateGLResources(); void updateTexture(Texture *texture); @@ -296,6 +297,7 @@ private: BackendNodeDirtySet m_changeSet; QAtomicInt m_lastFrameCorrect; QOpenGLContext *m_glContext; + QOpenGLContext *m_shareContext; PickBoundingVolumeJobPtr m_pickBoundingVolumeJob; qint64 m_time; diff --git a/src/render/backend/rendertargetoutput.cpp b/src/render/backend/rendertargetoutput.cpp index faebfacb6..cba92596d 100644 --- a/src/render/backend/rendertargetoutput.cpp +++ b/src/render/backend/rendertargetoutput.cpp @@ -121,9 +121,14 @@ void RenderTargetOutput::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) BackendNode::sceneChangeEvent(e); } -Attachment RenderTargetOutput::attachment() const +Qt3DRender::Render::Attachment *RenderTargetOutput::attachment() { - return m_attachmentData; + return &m_attachmentData; +} + +const Attachment *RenderTargetOutput::attachment() const +{ + return &m_attachmentData; } } // namespace Render diff --git a/src/render/backend/rendertargetoutput_p.h b/src/render/backend/rendertargetoutput_p.h index 14daa84e9..b7867c2cb 100644 --- a/src/render/backend/rendertargetoutput_p.h +++ b/src/render/backend/rendertargetoutput_p.h @@ -77,7 +77,8 @@ public: QAbstractTexture::CubeMapFace face() const; QRenderTargetOutput::AttachmentPoint point() const; void sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) Q_DECL_OVERRIDE; - Attachment attachment() const; + Attachment *attachment(); + const Attachment *attachment() const; private: void initializeFromPeer(const Qt3DCore::QNodeCreatedChangeBasePtr &change) Q_DECL_FINAL; diff --git a/src/render/texture/gltexture_p.h b/src/render/texture/gltexture_p.h index 424e77854..d9ce32a9f 100644 --- a/src/render/texture/gltexture_p.h +++ b/src/render/texture/gltexture_p.h @@ -148,6 +148,16 @@ public: m_dirty |= TextureData; } + bool isDirty() + { + QMutexLocker locker(&m_dirtyFlagMutex); + return m_dirty == 0 ? false : true; + } + + QMutex *textureLock() + { + return &m_dirtyFlagMutex; + } protected: template<class APITexture, class APITextureImage> diff --git a/tests/auto/render/commons/testrenderer.cpp b/tests/auto/render/commons/testrenderer.cpp index 87e60a263..f318797ca 100644 --- a/tests/auto/render/commons/testrenderer.cpp +++ b/tests/auto/render/commons/testrenderer.cpp @@ -76,4 +76,9 @@ QSurfaceFormat TestRenderer::format() return QSurfaceFormat(); } +QOpenGLContext *TestRenderer::shareContext() const +{ + return nullptr; +} + QT_END_NAMESPACE diff --git a/tests/auto/render/commons/testrenderer.h b/tests/auto/render/commons/testrenderer.h index 2e572582e..ecbec4aa3 100644 --- a/tests/auto/render/commons/testrenderer.h +++ b/tests/auto/render/commons/testrenderer.h @@ -74,6 +74,7 @@ public: void resetDirty(); QVariant executeCommand(const QStringList &args) Q_DECL_OVERRIDE; + QOpenGLContext *shareContext() const Q_DECL_OVERRIDE; void setOffscreenSurfaceHelper(Qt3DRender::Render::OffscreenSurfaceHelper *helper) Q_DECL_OVERRIDE; QSurfaceFormat format() Q_DECL_OVERRIDE; |