diff options
Diffstat (limited to 'src/render/renderers/opengl')
14 files changed, 272 insertions, 59 deletions
diff --git a/src/render/renderers/opengl/graphicshelpers/graphicscontext.cpp b/src/render/renderers/opengl/graphicshelpers/graphicscontext.cpp index 71edc1c74..9e5b3e158 100644 --- a/src/render/renderers/opengl/graphicshelpers/graphicscontext.cpp +++ b/src/render/renderers/opengl/graphicshelpers/graphicscontext.cpp @@ -56,7 +56,7 @@ #include <Qt3DRender/private/nodemanagers_p.h> #include <Qt3DRender/private/buffermanager_p.h> #include <Qt3DRender/private/managers_p.h> -#include <Qt3DRender/private/gltexturemanager_p.h> +#include <Qt3DRender/private/glresourcemanagers_p.h> #include <Qt3DRender/private/attachmentpack_p.h> #include <Qt3DRender/private/qbuffer_p.h> #include <Qt3DRender/private/renderbuffer_p.h> diff --git a/src/render/renderers/opengl/graphicshelpers/graphicscontext_p.h b/src/render/renderers/opengl/graphicshelpers/graphicscontext_p.h index 2f4df2e22..b4f589e71 100644 --- a/src/render/renderers/opengl/graphicshelpers/graphicscontext_p.h +++ b/src/render/renderers/opengl/graphicshelpers/graphicscontext_p.h @@ -72,6 +72,7 @@ #include <Qt3DRender/private/uniform_p.h> #include <Qt3DRender/private/graphicshelperinterface_p.h> #include <Qt3DRender/private/qblitframebuffer_p.h> +#include <Qt3DRender/private/gl_handle_types_p.h> #include <qmath.h> QT_BEGIN_NAMESPACE diff --git a/src/render/renderers/opengl/graphicshelpers/submissioncontext.cpp b/src/render/renderers/opengl/graphicshelpers/submissioncontext.cpp index 47779dded..3a619f361 100644 --- a/src/render/renderers/opengl/graphicshelpers/submissioncontext.cpp +++ b/src/render/renderers/opengl/graphicshelpers/submissioncontext.cpp @@ -54,14 +54,15 @@ #include <Qt3DRender/private/rendertarget_p.h> #include <Qt3DRender/private/graphicshelperinterface_p.h> #include <Qt3DRender/private/renderer_p.h> +#include <Qt3DRender/private/glresourcemanagers_p.h> #include <Qt3DRender/private/nodemanagers_p.h> #include <Qt3DRender/private/buffermanager_p.h> #include <Qt3DRender/private/managers_p.h> -#include <Qt3DRender/private/gltexturemanager_p.h> #include <Qt3DRender/private/attachmentpack_p.h> #include <Qt3DRender/private/qbuffer_p.h> #include <Qt3DRender/private/renderbuffer_p.h> #include <Qt3DRender/private/stringtoint_p.h> +#include <Qt3DRender/private/openglvertexarrayobject_p.h> #include <QOpenGLShaderProgram> #if !defined(QT_OPENGL_ES_2) @@ -530,7 +531,7 @@ GLuint SubmissionContext::updateRenderTarget(Qt3DCore::QNodeId renderTargetNodeI bool needsResize = !m_renderTargetsSize.contains(fboId); // not even initialized yet? if (!needsResize) { // render target exists, has attachment been resized? - GLTextureManager *glTextureManager = m_renderer->nodeManagers()->glTextureManager(); + GLTextureManager *glTextureManager = m_renderer->glResourceManagers()->glTextureManager(); const QSize s = m_renderTargetsSize[fboId]; const auto attachments_ = attachments.attachments(); for (const Attachment &attachment : attachments_) { @@ -814,7 +815,7 @@ void SubmissionContext::bindFrameBufferAttachmentHelper(GLuint fboId, const Atta // stencil before 3.1 with the appropriate extension). QSize fboSize; - GLTextureManager *glTextureManager = m_renderer->nodeManagers()->glTextureManager(); + GLTextureManager *glTextureManager = m_renderer->glResourceManagers()->glTextureManager(); const auto attachments_ = attachments.attachments(); for (const Attachment &attachment : attachments_) { GLTexture *rTex = glTextureManager->lookupResource(attachment.m_textureUuid); @@ -1157,8 +1158,6 @@ bool SubmissionContext::setParameters(ShaderParameterPack ¶meterPack) // Set the pinned texture of the previous material texture // to pinable so that we should easily find an available texture unit - NodeManagers *manager = m_renderer->nodeManagers(); - m_textureContext.deactivateTexturesWithScope(TextureSubmissionContext::TextureScopeMaterial); // Update the uniforms with the correct texture unit id's PackUniformHash &uniformValues = parameterPack.uniforms(); @@ -1169,7 +1168,7 @@ bool SubmissionContext::setParameters(ShaderParameterPack ¶meterPack) const ShaderParameterPack::NamedResource &namedTex = parameterPack.textures().at(i); // Given a Texture QNodeId, we retrieve the associated shared GLTexture if (uniformValues.contains(namedTex.glslNameId)) { - GLTexture *t = manager->glTextureManager()->lookupResource(namedTex.nodeId); + GLTexture *t = m_renderer->glResourceManagers()->glTextureManager()->lookupResource(namedTex.nodeId); if (t != nullptr) { UniformValue &texUniform = uniformValues.value(namedTex.glslNameId); if (texUniform.valueType() == UniformValue::TextureValue) { @@ -1194,9 +1193,9 @@ bool SubmissionContext::setParameters(ShaderParameterPack ¶meterPack) const ShaderParameterPack::NamedResource &namedTex = parameterPack.images().at(i); // Given a Texture QNodeId, we retrieve the associated shared GLTexture if (uniformValues.contains(namedTex.glslNameId)) { - ShaderImage *img = manager->shaderImageManager()->lookupResource(namedTex.nodeId); + ShaderImage *img = m_renderer->nodeManagers()->shaderImageManager()->lookupResource(namedTex.nodeId); if (img != nullptr) { - GLTexture *t = manager->glTextureManager()->lookupResource(img->textureId()); + GLTexture *t = m_renderer->glResourceManagers()->glTextureManager()->lookupResource(img->textureId()); if (t == nullptr) { qCWarning(Backend) << "Shader Image referencing invalid texture"; continue; @@ -1277,7 +1276,7 @@ bool SubmissionContext::setParameters(ShaderParameterPack ¶meterPack) void SubmissionContext::enableAttribute(const VAOVertexAttribute &attr) { // Bind buffer within the current VAO - GLBuffer *buf = m_renderer->nodeManagers()->glBufferManager()->data(attr.bufferHandle); + GLBuffer *buf = m_renderer->glResourceManagers()->glBufferManager()->data(attr.bufferHandle); Q_ASSERT(buf); bindGLBuffer(buf, attr.attributeType); @@ -1316,7 +1315,7 @@ void SubmissionContext::specifyAttribute(const Attribute *attribute, } const GLint attributeDataType = glDataTypeFromAttributeDataType(attribute->vertexBaseType()); - const HGLBuffer glBufferHandle = m_renderer->nodeManagers()->glBufferManager()->lookupHandle(buffer->peerId()); + const HGLBuffer glBufferHandle = m_renderer->glResourceManagers()->glBufferManager()->lookupHandle(buffer->peerId()); Q_ASSERT(!glBufferHandle.isNull()); const GLBuffer::Type attributeType = attributeTypeToGLBufferType(attribute->attributeType()); @@ -1365,21 +1364,21 @@ void SubmissionContext::specifyIndices(Buffer *buffer) // bound within the current VAO // Save this in the current emulated VAO if (m_currentVAO) - m_currentVAO->saveIndexAttribute(m_renderer->nodeManagers()->glBufferManager()->lookupHandle(buffer->peerId())); + m_currentVAO->saveIndexAttribute(m_renderer->glResourceManagers()->glBufferManager()->lookupHandle(buffer->peerId())); } void SubmissionContext::updateBuffer(Buffer *buffer) { const QHash<Qt3DCore::QNodeId, HGLBuffer>::iterator it = m_renderBufferHash.find(buffer->peerId()); if (it != m_renderBufferHash.end()) - uploadDataToGLBuffer(buffer, m_renderer->nodeManagers()->glBufferManager()->data(it.value())); + uploadDataToGLBuffer(buffer, m_renderer->glResourceManagers()->glBufferManager()->data(it.value())); } QByteArray SubmissionContext::downloadBufferContent(Buffer *buffer) { const QHash<Qt3DCore::QNodeId, HGLBuffer>::iterator it = m_renderBufferHash.find(buffer->peerId()); if (it != m_renderBufferHash.end()) - return downloadDataFromGLBuffer(buffer, m_renderer->nodeManagers()->glBufferManager()->data(it.value())); + return downloadDataFromGLBuffer(buffer, m_renderer->glResourceManagers()->glBufferManager()->data(it.value())); return QByteArray(); } @@ -1388,13 +1387,13 @@ void SubmissionContext::releaseBuffer(Qt3DCore::QNodeId bufferId) auto it = m_renderBufferHash.find(bufferId); if (it != m_renderBufferHash.end()) { HGLBuffer glBuffHandle = it.value(); - GLBuffer *glBuff = m_renderer->nodeManagers()->glBufferManager()->data(glBuffHandle); + GLBuffer *glBuff = m_renderer->glResourceManagers()->glBufferManager()->data(glBuffHandle); Q_ASSERT(glBuff); // Destroy the GPU resource glBuff->destroy(this); // Destroy the GLBuffer instance - m_renderer->nodeManagers()->glBufferManager()->releaseResource(bufferId); + m_renderer->glResourceManagers()->glBufferManager()->releaseResource(bufferId); // Remove Id - HGLBuffer entry m_renderBufferHash.erase(it); } @@ -1410,12 +1409,12 @@ GLBuffer *SubmissionContext::glBufferForRenderBuffer(Buffer *buf, GLBuffer::Type { if (!m_renderBufferHash.contains(buf->peerId())) m_renderBufferHash.insert(buf->peerId(), createGLBufferFor(buf, type)); - return m_renderer->nodeManagers()->glBufferManager()->data(m_renderBufferHash.value(buf->peerId())); + return m_renderer->glResourceManagers()->glBufferManager()->data(m_renderBufferHash.value(buf->peerId())); } HGLBuffer SubmissionContext::createGLBufferFor(Buffer *buffer, GLBuffer::Type type) { - GLBuffer *b = m_renderer->nodeManagers()->glBufferManager()->getOrCreateResource(buffer->peerId()); + GLBuffer *b = m_renderer->glResourceManagers()->glBufferManager()->getOrCreateResource(buffer->peerId()); // b.setUsagePattern(static_cast<QOpenGLBuffer::UsagePattern>(buffer->usage())); Q_ASSERT(b); if (!b->create(this)) @@ -1424,7 +1423,7 @@ HGLBuffer SubmissionContext::createGLBufferFor(Buffer *buffer, GLBuffer::Type ty if (!bindGLBuffer(b, type)) qCWarning(Render::Io) << Q_FUNC_INFO << "buffer binding failed"; - return m_renderer->nodeManagers()->glBufferManager()->lookupHandle(buffer->peerId()); + return m_renderer->glResourceManagers()->glBufferManager()->lookupHandle(buffer->peerId()); } bool SubmissionContext::bindGLBuffer(GLBuffer *buffer, GLBuffer::Type type) diff --git a/src/render/renderers/opengl/textures/gltexturemanager_p.h b/src/render/renderers/opengl/managers/gl_handle_types_p.h index 335af136c..eb25bab7f 100644 --- a/src/render/renderers/opengl/textures/gltexturemanager_p.h +++ b/src/render/renderers/opengl/managers/gl_handle_types_p.h @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2016 Klaralvdalens Datakonsult AB (KDAB). +** Copyright (C) 2018 Klaralvdalens Datakonsult AB (KDAB). ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the Qt3D module of the Qt Toolkit. @@ -37,8 +37,8 @@ ** ****************************************************************************/ -#ifndef QT3DRENDER_RENDER_GLTEXTUREMANAGER_H -#define QT3DRENDER_RENDER_GLTEXTUREMANAGER_H +#ifndef QT3DRENDER_RENDER_OPENGL_HANDLE_TYPES_P_H +#define QT3DRENDER_RENDER_OPENGL_HANDLE_TYPES_P_H // // W A R N I N G @@ -51,28 +51,26 @@ // We mean it. // -#include <Qt3DCore/private/qresourcemanager_p.h> -#include <Qt3DRender/private/gltexture_p.h> +#include <Qt3DCore/private/qhandle_p.h> QT_BEGIN_NAMESPACE namespace Qt3DRender { + namespace Render { -class Q_AUTOTEST_EXPORT GLTextureManager : public Qt3DCore::QResourceManager< - GLTexture, - Qt3DCore::QNodeId, - Qt3DCore::NonLockingPolicy> -{ -public: - QHash<GLTexture *, Qt3DCore::QNodeId> texNodeIdForGLTexture; -}; +class GLBuffer; +class GLTexture; +class OpenGLVertexArrayObject; + +typedef Qt3DCore::QHandle<GLBuffer> HGLBuffer; +typedef Qt3DCore::QHandle<OpenGLVertexArrayObject> HVao; +typedef Qt3DCore::QHandle<GLTexture> HGLTexture; } // namespace Render -} // namespace Qt3DRender -Q_DECLARE_RESOURCE_INFO(Qt3DRender::Render::GLTexture, Q_REQUIRES_CLEANUP) +} // namespace Qt3DRender QT_END_NAMESPACE -#endif // QT3DRENDER_RENDER_GLTEXTUREMANAGER_H +#endif // QT3DRENDER_RENDER_OPENGL_HANDLE_TYPES_P_H diff --git a/src/render/renderers/opengl/managers/glresourcemanagers.cpp b/src/render/renderers/opengl/managers/glresourcemanagers.cpp new file mode 100644 index 000000000..e3be4c7af --- /dev/null +++ b/src/render/renderers/opengl/managers/glresourcemanagers.cpp @@ -0,0 +1,70 @@ +/**************************************************************************** +** +** Copyright (C) 2017 Klaralvdalens Datakonsult AB (KDAB). +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt3D module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "glresourcemanagers_p.h" +#include <QOpenGLVertexArrayObject> + +QT_BEGIN_NAMESPACE + +namespace Qt3DRender { + +namespace Render { + + +GLResourceManagers::GLResourceManagers() + : m_glBufferManager(new GLBufferManager()) + , m_glTextureManager(new GLTextureManager()) + , m_glFenceManager(new GLFenceManager()) + , m_vaoManager(new VAOManager()) +{ +} + +GLResourceManagers::~GLResourceManagers() +{ + delete m_vaoManager; + delete m_glFenceManager; + delete m_glTextureManager; + delete m_glBufferManager; +} + +} // Render + +} // Qt3DRender + +QT_END_NAMESPACE diff --git a/src/render/renderers/opengl/managers/glresourcemanagers_p.h b/src/render/renderers/opengl/managers/glresourcemanagers_p.h new file mode 100644 index 000000000..a2db09316 --- /dev/null +++ b/src/render/renderers/opengl/managers/glresourcemanagers_p.h @@ -0,0 +1,123 @@ +/**************************************************************************** +** +** Copyright (C) 2017 Klaralvdalens Datakonsult AB (KDAB). +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt3D module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QT3DRENDER_RENDER_GLRESOURCEMANAGERS_P_H +#define QT3DRENDER_RENDER_GLRESOURCEMANAGERS_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists for the convenience +// of other Qt classes. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include <Qt3DRender/private/qt3drender_global_p.h> +#include <Qt3DCore/private/qresourcemanager_p.h> +#include <Qt3DRender/private/gltexture_p.h> +#include <Qt3DRender/private/glbuffer_p.h> +#include <Qt3DRender/private/glfence_p.h> +#include <Qt3DRender/private/openglvertexarrayobject_p.h> + +QT_BEGIN_NAMESPACE + +namespace Qt3DRender { + +namespace Render { + +class Q_AUTOTEST_EXPORT GLFenceManager : public QHash<Qt3DCore::QNodeId, GLFence> +{ +}; + +class Q_AUTOTEST_EXPORT VAOManager : public Qt3DCore::QResourceManager< + OpenGLVertexArrayObject, + VAOIdentifier, + Qt3DCore::NonLockingPolicy> +{ +public: + VAOManager() {} +}; + +class Q_AUTOTEST_EXPORT GLBufferManager : public Qt3DCore::QResourceManager< + GLBuffer, + Qt3DCore::QNodeId, + Qt3DCore::NonLockingPolicy> +{ +}; + +class Q_AUTOTEST_EXPORT GLTextureManager : public Qt3DCore::QResourceManager< + GLTexture, + Qt3DCore::QNodeId, + Qt3DCore::NonLockingPolicy> +{ +public: + QHash<GLTexture *, Qt3DCore::QNodeId> texNodeIdForGLTexture; +}; + + +class Q_AUTOTEST_EXPORT GLResourceManagers +{ +public: + GLResourceManagers(); + ~GLResourceManagers(); + + inline VAOManager *vaoManager() const noexcept { return m_vaoManager; } + inline GLTextureManager *glTextureManager() const noexcept { return m_glTextureManager; } + inline GLBufferManager *glBufferManager() const noexcept { return m_glBufferManager; } + inline GLFenceManager *glFenceManager() const noexcept { return m_glFenceManager; } + +private: + GLBufferManager *m_glBufferManager; + GLTextureManager *m_glTextureManager; + GLFenceManager *m_glFenceManager; + VAOManager *m_vaoManager; +}; + +} // Render + +} // Qt3DRender + +Q_DECLARE_RESOURCE_INFO(Qt3DRender::Render::OpenGLVertexArrayObject, Q_REQUIRES_CLEANUP) + +QT_END_NAMESPACE + +#endif // QT3DRENDER_RENDER_GLRESOURCEMANAGERS_P_H diff --git a/src/render/renderers/opengl/managers/managers.pri b/src/render/renderers/opengl/managers/managers.pri new file mode 100644 index 000000000..97a4c2c45 --- /dev/null +++ b/src/render/renderers/opengl/managers/managers.pri @@ -0,0 +1,8 @@ +INCLUDEPATH += $$PWD + +HEADERS += \ + $$PWD/gl_handle_types_p.h \ + $$PWD/glresourcemanagers_p.h + +SOURCES += \ + $$PWD/glresourcemanagers.cpp diff --git a/src/render/renderers/opengl/opengl.pri b/src/render/renderers/opengl/opengl.pri index 908c23c80..c647be906 100644 --- a/src/render/renderers/opengl/opengl.pri +++ b/src/render/renderers/opengl/opengl.pri @@ -5,6 +5,7 @@ include (io/io.pri) include (textures/textures.pri) include (graphicshelpers/graphicshelpers.pri) include (renderstates/renderstates.pri) +include (managers/managers.pri) gcov { QMAKE_CXXFLAGS += -fprofile-arcs -ftest-coverage diff --git a/src/render/renderers/opengl/renderer/openglvertexarrayobject.cpp b/src/render/renderers/opengl/renderer/openglvertexarrayobject.cpp index f5d0a64f5..58ce70c28 100644 --- a/src/render/renderers/opengl/renderer/openglvertexarrayobject.cpp +++ b/src/render/renderers/opengl/renderer/openglvertexarrayobject.cpp @@ -40,7 +40,7 @@ #include "openglvertexarrayobject_p.h" #include <Qt3DRender/private/submissioncontext_p.h> #include <Qt3DRender/private/renderer_p.h> -#include <Qt3DRender/private/nodemanagers_p.h> +#include <Qt3DRender/private/glresourcemanagers_p.h> #include <Qt3DRender/private/managers_p.h> QT_BEGIN_NAMESPACE @@ -71,7 +71,7 @@ void OpenGLVertexArrayObject::bind() for (const SubmissionContext::VAOVertexAttribute &attr : qAsConst(m_vertexAttributes)) m_ctx->enableAttribute(attr); if (!m_indexAttribute.isNull()) - m_ctx->bindGLBuffer(m_ctx->m_renderer->nodeManagers()->glBufferManager()->data(m_indexAttribute), + m_ctx->bindGLBuffer(m_ctx->m_renderer->glResourceManagers()->glBufferManager()->data(m_indexAttribute), GLBuffer::IndexBuffer); } } diff --git a/src/render/renderers/opengl/renderer/rendercommand_p.h b/src/render/renderers/opengl/renderer/rendercommand_p.h index be00fb753..e1cf7a4e0 100644 --- a/src/render/renderers/opengl/renderer/rendercommand_p.h +++ b/src/render/renderers/opengl/renderer/rendercommand_p.h @@ -56,6 +56,7 @@ #include <Qt3DRender/private/shaderparameterpack_p.h> #include <Qt3DRender/private/handle_types_p.h> #include <Qt3DRender/private/renderviewjobutils_p.h> +#include <Qt3DRender/private/gl_handle_types_p.h> #include <Qt3DRender/qgeometryrenderer.h> #include <QOpenGLShaderProgram> #include <QOpenGLTexture> diff --git a/src/render/renderers/opengl/renderer/renderer.cpp b/src/render/renderers/opengl/renderer/renderer.cpp index ddf57f4fe..3957894e5 100644 --- a/src/render/renderers/opengl/renderer/renderer.cpp +++ b/src/render/renderers/opengl/renderer/renderer.cpp @@ -77,7 +77,6 @@ #include <Qt3DRender/private/managers_p.h> #include <Qt3DRender/private/buffermanager_p.h> #include <Qt3DRender/private/nodemanagers_p.h> -#include <Qt3DRender/private/gltexturemanager_p.h> #include <Qt3DRender/private/gltexture_p.h> #include <Qt3DRender/private/geometryrenderermanager_p.h> #include <Qt3DRender/private/techniquemanager_p.h> @@ -96,6 +95,8 @@ #include <Qt3DRender/private/filterentitybycomponentjob_p.h> #include <Qt3DRender/private/commandexecuter_p.h> +#include <Qt3DRender/private/glresourcemanagers_p.h> + #include <Qt3DRender/qcameralens.h> #include <Qt3DCore/private/qeventfilterservice_p.h> #include <Qt3DCore/private/qabstractaspectjobmanager_p.h> @@ -277,6 +278,7 @@ Renderer::Renderer(QRenderAspect::RenderType type) JobTypes::EntityComponentTypeFiltering)) , m_ownedContext(false) , m_offscreenHelper(nullptr) + , m_glResourceManagers(nullptr) , m_commandExecuter(new Qt3DRender::Debug::CommandExecuter(this)) , m_shouldSwapBuffers(true) { @@ -327,6 +329,7 @@ Renderer::~Renderer() delete m_renderQueue; delete m_defaultRenderStateSet; delete m_shaderCache; + delete m_glResourceManagers; if (!m_ownedContext) QObject::disconnect(m_contextConnection); @@ -362,6 +365,7 @@ void Renderer::setTime(qint64 time) void Renderer::setNodeManagers(NodeManagers *managers) { m_nodesManager = managers; + m_glResourceManagers = new GLResourceManagers(); m_updateShaderDataTransformJob->setManagers(m_nodesManager); m_cleanupJob->setManagers(m_nodesManager); @@ -544,6 +548,12 @@ void Renderer::shutdown() m_submitRenderViewsSemaphore.release(1); m_renderThread->wait(); } + + // Destroy internal managers + // This needs to be done before the nodeManager is destroy + // as the internal resources might somehow rely on nodeManager resources + delete m_glResourceManagers; + m_glResourceManagers = nullptr; } /*! @@ -582,23 +592,23 @@ void Renderer::releaseGraphicsResources() if (context->thread() == QThread::currentThread() && context->makeCurrent(offscreenSurface)) { // Clean up the graphics context and any resources - const QVector<HGLTexture> activeTexturesHandles = m_nodesManager->glTextureManager()->activeHandles(); + const QVector<HGLTexture> activeTexturesHandles = m_glResourceManagers->glTextureManager()->activeHandles(); for (const HGLTexture &textureHandle : activeTexturesHandles) { - GLTexture *tex = m_nodesManager->glTextureManager()->data(textureHandle); + GLTexture *tex = m_glResourceManagers->glTextureManager()->data(textureHandle); tex->destroy(); } // Do the same thing with buffers - const QVector<HGLBuffer> activeBuffers = m_nodesManager->glBufferManager()->activeHandles(); + const QVector<HGLBuffer> activeBuffers = m_glResourceManagers->glBufferManager()->activeHandles(); for (const HGLBuffer &bufferHandle : activeBuffers) { - GLBuffer *buffer = m_nodesManager->glBufferManager()->data(bufferHandle); + GLBuffer *buffer = m_glResourceManagers->glBufferManager()->data(bufferHandle); buffer->destroy(m_submissionContext.data()); } // Do the same thing with VAOs - const QVector<HVao> activeVaos = m_nodesManager->vaoManager()->activeHandles(); + const QVector<HVao> activeVaos = m_glResourceManagers->vaoManager()->activeHandles(); for (const HVao &vaoHandle : activeVaos) { - OpenGLVertexArrayObject *vao = m_nodesManager->vaoManager()->data(vaoHandle); + OpenGLVertexArrayObject *vao = m_glResourceManagers->vaoManager()->data(vaoHandle); vao->destroy(); } @@ -996,9 +1006,9 @@ void Renderer::prepareCommandsSubmission(const QVector<RenderView *> &renderView // Executed in a job void Renderer::lookForAbandonedVaos() { - const QVector<HVao> activeVaos = m_nodesManager->vaoManager()->activeHandles(); - for (const HVao &handle : activeVaos) { - OpenGLVertexArrayObject *vao = m_nodesManager->vaoManager()->data(handle); + const QVector<HVao> activeVaos = m_glResourceManagers->vaoManager()->activeHandles(); + for (HVao handle : activeVaos) { + OpenGLVertexArrayObject *vao = m_glResourceManagers->vaoManager()->data(handle); // Make sure to only mark VAOs for deletion that were already created // (ignore those that might be currently under construction in the render thread) @@ -1242,7 +1252,7 @@ void Renderer::updateGLResources() { // Update active fence objects: // - Destroy fences that have reached their signaled state - GLFenceManager *fenceManager = m_nodesManager->glFenceManager(); + GLFenceManager *fenceManager = m_glResourceManagers->glFenceManager(); const auto end = fenceManager->end(); auto it = fenceManager->begin(); while (it != end) { @@ -1314,7 +1324,7 @@ void Renderer::updateGLResources() // AspectThread are locked ensuring no races between Texture/TextureImage and // GLTexture if (m_submissionContext != nullptr) { - GLTextureManager *glTextureManager = m_nodesManager->glTextureManager(); + GLTextureManager *glTextureManager = m_glResourceManagers->glTextureManager(); const QVector<HGLTexture> glTextureHandles = glTextureManager->activeHandles(); // Upload texture data for (const HGLTexture &glTextureHandle : glTextureHandles) { @@ -1360,7 +1370,7 @@ void Renderer::updateTexture(Texture *texture) // this will create 2 identical GLTextures, no sharing will take place // Try to find the associated GLTexture for the backend Texture - GLTextureManager *glTextureManager = m_nodesManager->glTextureManager(); + GLTextureManager *glTextureManager = m_glResourceManagers->glTextureManager(); GLTexture *glTexture = glTextureManager->lookupResource(texture->peerId()); // No GLTexture associated yet -> create it @@ -1413,7 +1423,7 @@ void Renderer::updateTexture(Texture *texture) // Render Thread void Renderer::cleanupTexture(Qt3DCore::QNodeId cleanedUpTextureId) { - GLTextureManager *glTextureManager = m_nodesManager->glTextureManager(); + GLTextureManager *glTextureManager = m_glResourceManagers->glTextureManager(); GLTexture *glTexture = glTextureManager->lookupResource(cleanedUpTextureId); // Destroying the GLTexture implicitely also destroy the GL resources @@ -1519,7 +1529,7 @@ Renderer::ViewSubmissionResultData Renderer::submitRenderViews(const QVector<Ren // Insert Fence into command stream if needed const Qt3DCore::QNodeIdVector insertFenceIds = renderView->insertFenceIds(); - GLFenceManager *fenceManager = m_nodesManager->glFenceManager(); + GLFenceManager *fenceManager = m_glResourceManagers->glFenceManager(); for (const Qt3DCore::QNodeId insertFenceId : insertFenceIds) { // If the fence is not in the manager, then it hasn't been inserted // into the command stream yet. @@ -2069,7 +2079,7 @@ void Renderer::createOrUpdateVAO(RenderCommand *command, { const VAOIdentifier vaoKey(command->m_geometry, command->m_shader); - VAOManager *vaoManager = m_nodesManager->vaoManager(); + VAOManager *vaoManager = m_glResourceManagers->vaoManager(); command->m_vao = vaoManager->lookupHandle(vaoKey); if (command->m_vao.isNull()) { @@ -2112,7 +2122,7 @@ bool Renderer::executeCommandsSubmission(const RenderView *rv) continue; } - vao = m_nodesManager->vaoManager()->data(command.m_vao); + vao = m_glResourceManagers->vaoManager()->data(command.m_vao); // something may have went wrong when initializing the VAO if (!vao->isSpecified()) { @@ -2283,11 +2293,11 @@ void Renderer::cleanGraphicsResources() for (const HVao &vaoHandle : abandonedVaos) { // might have already been destroyed last frame, but added by the cleanup job before, so // check if the VAO is really still existent - OpenGLVertexArrayObject *vao = m_nodesManager->vaoManager()->data(vaoHandle); + OpenGLVertexArrayObject *vao = m_glResourceManagers->vaoManager()->data(vaoHandle); if (vao) { vao->destroy(); // We remove VAO from manager using its VAOIdentifier - m_nodesManager->vaoManager()->releaseResource(vao->key()); + m_glResourceManagers->vaoManager()->release(vaoHandle); } } } diff --git a/src/render/renderers/opengl/renderer/renderer_p.h b/src/render/renderers/opengl/renderer/renderer_p.h index e770b8280..96d251712 100644 --- a/src/render/renderers/opengl/renderer/renderer_p.h +++ b/src/render/renderers/opengl/renderer/renderer_p.h @@ -56,6 +56,7 @@ #include <Qt3DRender/qtechnique.h> #include <Qt3DRender/private/shaderparameterpack_p.h> #include <Qt3DRender/private/handle_types_p.h> +#include <Qt3DRender/private/gl_handle_types_p.h> #include <Qt3DRender/private/abstractrenderer_p.h> #include <Qt3DCore/qaspectjob.h> #include <Qt3DRender/private/qt3drender_global_p.h> @@ -149,6 +150,7 @@ class VSyncFrameAdvanceService; class PickEventFilter; class NodeManagers; class ShaderCache; +class GLResourceManagers; class UpdateLevelOfDetailJob; typedef QSharedPointer<UpdateLevelOfDetailJob> UpdateLevelOfDetailJobPtr; @@ -247,6 +249,7 @@ public: RenderSettings *settings() const override; QOpenGLContext *shareContext() const override; + inline GLResourceManagers *glResourceManagers() const { return m_glResourceManagers; } // Executed in secondary GL thread void loadShader(Shader *shader, Qt3DRender::Render::HShader shaderHandle) override; @@ -424,6 +427,7 @@ private: bool m_ownedContext; OffscreenSurfaceHelper *m_offscreenHelper; + GLResourceManagers *m_glResourceManagers; QMutex m_offscreenSurfaceMutex; QScopedPointer<Qt3DRender::Debug::CommandExecuter> m_commandExecuter; diff --git a/src/render/renderers/opengl/renderer/renderview.cpp b/src/render/renderers/opengl/renderer/renderview.cpp index c00a92629..37d417fb6 100644 --- a/src/render/renderers/opengl/renderer/renderview.cpp +++ b/src/render/renderers/opengl/renderer/renderview.cpp @@ -68,6 +68,7 @@ #include <Qt3DRender/private/rendercapture_p.h> #include <Qt3DRender/private/buffercapture_p.h> #include <Qt3DRender/private/stringtoint_p.h> +#include <Qt3DRender/private/submissioncontext_p.h> #include <Qt3DCore/qentity.h> #include <QtGui/qsurface.h> #include <algorithm> diff --git a/src/render/renderers/opengl/textures/textures.pri b/src/render/renderers/opengl/textures/textures.pri index 42ffff7eb..e17abfbb3 100644 --- a/src/render/renderers/opengl/textures/textures.pri +++ b/src/render/renderers/opengl/textures/textures.pri @@ -5,8 +5,5 @@ SOURCES += \ $$PWD/renderbuffer.cpp HEADERS += \ - $$PWD/gltexturemanager_p.h \ $$PWD/gltexture_p.h \ $$PWD/renderbuffer_p.h - - |