diff options
Diffstat (limited to 'src/render')
23 files changed, 337 insertions, 196 deletions
diff --git a/src/render/backend/handle_types_p.h b/src/render/backend/handle_types_p.h index 195fc2cc6..73b4df341 100644 --- a/src/render/backend/handle_types_p.h +++ b/src/render/backend/handle_types_p.h @@ -89,12 +89,9 @@ class GeometryRenderer; class ObjectPicker; class RayCaster; class BoundingVolumeDebug; -class OpenGLVertexArrayObject; class Light; class EnvironmentLight; class ComputeCommand; -class GLBuffer; -class GLTexture; class RenderStateNode; class Armature; class Skeleton; @@ -111,7 +108,6 @@ typedef Qt3DCore::QHandle<Layer> HLayer; typedef Qt3DCore::QHandle<LevelOfDetail> HLevelOfDetail; typedef Qt3DCore::QHandle<Material> HMaterial; typedef Qt3DCore::QHandle<Matrix4x4> HMatrix; -typedef Qt3DCore::QHandle<OpenGLVertexArrayObject> HVao; typedef Qt3DCore::QHandle<Shader> HShader; typedef Qt3DCore::QHandle<ShaderBuilder> HShaderBuilder; typedef Qt3DCore::QHandle<Technique> HTechnique; @@ -133,8 +129,6 @@ typedef Qt3DCore::QHandle<BoundingVolumeDebug> HBoundingVolumeDebug; typedef Qt3DCore::QHandle<Light> HLight; typedef Qt3DCore::QHandle<EnvironmentLight> HEnvironmentLight; typedef Qt3DCore::QHandle<ComputeCommand> HComputeCommand; -typedef Qt3DCore::QHandle<GLBuffer> HGLBuffer; -typedef Qt3DCore::QHandle<GLTexture> HGLTexture; typedef Qt3DCore::QHandle<RenderStateNode> HRenderState; typedef Qt3DCore::QHandle<Armature> HArmature; typedef Qt3DCore::QHandle<Skeleton> HSkeleton; diff --git a/src/render/backend/managers_p.h b/src/render/backend/managers_p.h index 759c16f64..024059a30 100644 --- a/src/render/backend/managers_p.h +++ b/src/render/backend/managers_p.h @@ -71,15 +71,12 @@ #include <Qt3DRender/private/parameter_p.h> #include <Qt3DRender/private/shaderdata_p.h> #include <Qt3DRender/private/handle_types_p.h> -#include <Qt3DRender/private/glbuffer_p.h> -#include <Qt3DRender/private/glfence_p.h> #include <Qt3DRender/private/textureimage_p.h> #include <Qt3DRender/private/attribute_p.h> #include <Qt3DRender/private/geometry_p.h> #include <Qt3DRender/private/objectpicker_p.h> #include <Qt3DRender/private/raycaster_p.h> #include <Qt3DRender/private/boundingvolumedebug_p.h> -#include <Qt3DRender/private/openglvertexarrayobject_p.h> #include <Qt3DRender/private/light_p.h> #include <Qt3DRender/private/environmentlight_p.h> #include <Qt3DRender/private/computecommand_p.h> @@ -266,15 +263,6 @@ public: TransformManager() {} }; -class VAOManager : public Qt3DCore::QResourceManager< - OpenGLVertexArrayObject, - VAOIdentifier, - Qt3DCore::NonLockingPolicy> -{ -public: - VAOManager() {} -}; - class RenderTargetManager : public Qt3DCore::QResourceManager< RenderTarget, Qt3DCore::QNodeId, @@ -321,17 +309,6 @@ public: ShaderDataManager() {} }; -class GLBufferManager : public Qt3DCore::QResourceManager< - GLBuffer, - Qt3DCore::QNodeId, - Qt3DCore::NonLockingPolicy> -{ -}; - -class GLFenceManager : public QHash<Qt3DCore::QNodeId, GLFence> -{ -}; - class TextureImageManager : public Qt3DCore::QResourceManager< TextureImage, Qt3DCore::QNodeId, @@ -471,7 +448,6 @@ Q_DECLARE_RESOURCE_INFO(Qt3DRender::Render::BoundingVolumeDebug, Q_REQUIRES_CLEA Q_DECLARE_RESOURCE_INFO(Qt3DRender::Render::ComputeCommand, Q_REQUIRES_CLEANUP) Q_DECLARE_RESOURCE_INFO(Qt3DRender::Render::Parameter, Q_REQUIRES_CLEANUP) Q_DECLARE_RESOURCE_INFO(Qt3DRender::Render::Transform, Q_REQUIRES_CLEANUP) -Q_DECLARE_RESOURCE_INFO(Qt3DRender::Render::OpenGLVertexArrayObject, Q_REQUIRES_CLEANUP) Q_DECLARE_RESOURCE_INFO(Qt3DRender::Render::Armature, Q_REQUIRES_CLEANUP) Q_DECLARE_RESOURCE_INFO(Qt3DRender::Render::Skeleton, Q_REQUIRES_CLEANUP) Q_DECLARE_RESOURCE_INFO(Qt3DRender::Render::Joint, Q_REQUIRES_CLEANUP) diff --git a/src/render/backend/nodemanagers.cpp b/src/render/backend/nodemanagers.cpp index 5e452f886..8603d4fb9 100644 --- a/src/render/backend/nodemanagers.cpp +++ b/src/render/backend/nodemanagers.cpp @@ -42,14 +42,12 @@ #include <Qt3DRender/private/managers_p.h> #include <Qt3DRender/private/scenemanager_p.h> #include <Qt3DRender/private/buffermanager_p.h> -#include <Qt3DRender/private/gltexturemanager_p.h> #include <Qt3DRender/private/geometryrenderermanager_p.h> #include <Qt3DRender/private/techniquemanager_p.h> #include <Qt3DRender/private/armature_p.h> #include <Qt3DRender/private/skeleton_p.h> #include <private/resourceaccessor_p.h> -#include <QOpenGLVertexArrayObject> QT_BEGIN_NAMESPACE @@ -62,7 +60,6 @@ NodeManagers::NodeManagers() , m_renderNodesManager(new EntityManager()) , m_materialManager(new MaterialManager()) , m_worldMatrixManager(new MatrixManager()) - , m_vaoManager(new VAOManager()) , m_shaderManager(new ShaderManager()) , m_shaderBuilderManager(new ShaderBuilderManager()) , m_techniqueManager(new TechniqueManager()) @@ -70,7 +67,6 @@ NodeManagers::NodeManagers() , m_renderPassManager(new RenderPassManager()) , m_textureManager(new TextureManager()) , m_textureImageManager(new TextureImageManager()) - , m_glTextureManager(new GLTextureManager()) , m_layerManager(new LayerManager()) , m_levelOfDetailManager(new LevelOfDetailManager()) , m_filterKeyManager(new FilterKeyManager()) @@ -81,8 +77,6 @@ NodeManagers::NodeManagers() , m_attachmentManager(new AttachmentManager()) , m_parameterManager(new ParameterManager()) , m_shaderDataManager(new ShaderDataManager()) - , m_glBufferManager(new GLBufferManager()) - , m_glFenceManager(new GLFenceManager()) , m_bufferManager(new BufferManager()) , m_attributeManager(new AttributeManager()) , m_geometryManager(new GeometryManager()) @@ -107,13 +101,11 @@ NodeManagers::~NodeManagers() delete m_cameraManager; delete m_materialManager; delete m_worldMatrixManager; - delete m_vaoManager; delete m_shaderManager; delete m_shaderBuilderManager; delete m_techniqueManager; delete m_effectManager; delete m_renderPassManager; - delete m_glTextureManager; delete m_textureManager; delete m_layerManager; delete m_levelOfDetailManager; @@ -124,8 +116,6 @@ NodeManagers::~NodeManagers() delete m_attachmentManager; delete m_parameterManager; delete m_shaderDataManager; - delete m_glBufferManager; - delete m_glFenceManager; delete m_textureImageManager; delete m_bufferManager; delete m_attributeManager; @@ -179,12 +169,6 @@ MatrixManager *NodeManagers::manager<Matrix4x4>() const noexcept } template<> -VAOManager *NodeManagers::manager<OpenGLVertexArrayObject>() const noexcept -{ - return m_vaoManager; -} - -template<> ShaderManager *NodeManagers::manager<Shader>() const noexcept { return m_shaderManager; @@ -281,12 +265,6 @@ ShaderDataManager *NodeManagers::manager<ShaderData>() const noexcept } template<> -GLBufferManager *NodeManagers::manager<GLBuffer>() const noexcept -{ - return m_glBufferManager; -} - -template<> TextureImageManager *NodeManagers::manager<TextureImage>() const noexcept { return m_textureImageManager; diff --git a/src/render/backend/nodemanagers_p.h b/src/render/backend/nodemanagers_p.h index 8dda4e8ad..62a73b510 100644 --- a/src/render/backend/nodemanagers_p.h +++ b/src/render/backend/nodemanagers_p.h @@ -75,7 +75,6 @@ class RayCasterManager; class BoundingVolumeDebugManager; class MaterialManager; class MatrixManager; -class VAOManager; class ShaderManager; class ShaderBuilderManager; class TechniqueManager; @@ -86,13 +85,10 @@ class SceneManager; class AttachmentManager; class ParameterManager; class ShaderDataManager; -class GLBufferManager; -class GLFenceManager; class TextureImageManager; class FilterKeyManager; class FrameGraphManager; class TransformManager; -class GLTextureManager; class TextureManager; class TextureDataManager; class TextureImageDataManager; @@ -127,7 +123,6 @@ class RenderTargetOutput; class RenderTarget; class ShaderData; class Parameter; -class GLBuffer; class TextureImage; class Buffer; class Attribute; @@ -143,7 +138,6 @@ class RenderStateNode; class Armature; class Skeleton; class Joint; -class OpenGLVertexArrayObject; class ShaderImage; class ResourceAccessor; @@ -192,13 +186,11 @@ public: inline EntityManager *renderNodesManager() const noexcept { return m_renderNodesManager; } inline MaterialManager *materialManager() const noexcept { return m_materialManager; } inline MatrixManager *worldMatrixManager() const noexcept { return m_worldMatrixManager; } - inline VAOManager *vaoManager() const noexcept { return m_vaoManager; } inline ShaderManager *shaderManager() const noexcept { return m_shaderManager; } inline ShaderBuilderManager *shaderBuilderManager() const noexcept { return m_shaderBuilderManager; } inline TechniqueManager *techniqueManager() const noexcept { return m_techniqueManager; } inline EffectManager *effectManager() const noexcept { return m_effectManager; } inline RenderPassManager *renderPassManager() const noexcept { return m_renderPassManager; } - inline GLTextureManager *glTextureManager() const noexcept { return m_glTextureManager; } inline TextureManager *textureManager() const noexcept { return m_textureManager; } inline LayerManager *layerManager() const noexcept { return m_layerManager; } inline LevelOfDetailManager *levelOfDetailManager() const noexcept { return m_levelOfDetailManager; } @@ -210,8 +202,6 @@ public: inline AttachmentManager *attachmentManager() const noexcept { return m_attachmentManager; } inline ParameterManager *parameterManager() const noexcept { return m_parameterManager; } inline ShaderDataManager *shaderDataManager() const noexcept { return m_shaderDataManager; } - inline GLBufferManager *glBufferManager() const noexcept { return m_glBufferManager; } - inline GLFenceManager *glFenceManager() const noexcept { return m_glFenceManager; } inline TextureImageManager *textureImageManager() const noexcept { return m_textureImageManager; } inline BufferManager *bufferManager() const noexcept { return m_bufferManager; } inline AttributeManager *attributeManager() const noexcept { return m_attributeManager; } @@ -236,7 +226,6 @@ private: EntityManager *m_renderNodesManager; MaterialManager *m_materialManager; MatrixManager *m_worldMatrixManager; - VAOManager *m_vaoManager; ShaderManager *m_shaderManager; ShaderBuilderManager *m_shaderBuilderManager; TechniqueManager *m_techniqueManager; @@ -244,7 +233,6 @@ private: RenderPassManager *m_renderPassManager; TextureManager *m_textureManager; TextureImageManager *m_textureImageManager; - GLTextureManager *m_glTextureManager; LayerManager *m_layerManager; LevelOfDetailManager *m_levelOfDetailManager; FilterKeyManager *m_filterKeyManager; @@ -255,8 +243,6 @@ private: AttachmentManager *m_attachmentManager; ParameterManager *m_parameterManager; ShaderDataManager *m_shaderDataManager; - GLBufferManager *m_glBufferManager; - GLFenceManager *m_glFenceManager; BufferManager *m_bufferManager; AttributeManager *m_attributeManager; GeometryManager *m_geometryManager; @@ -291,9 +277,6 @@ template<> Q_3DRENDERSHARED_PRIVATE_EXPORT MatrixManager *NodeManagers::manager<QMatrix4x4*>() const noexcept; template<> -Q_3DRENDERSHARED_PRIVATE_EXPORT VAOManager *NodeManagers::manager<OpenGLVertexArrayObject>() const noexcept; - -template<> Q_3DRENDERSHARED_PRIVATE_EXPORT ShaderManager *NodeManagers::manager<Shader>() const noexcept; template<> @@ -342,15 +325,12 @@ template<> Q_3DRENDERSHARED_PRIVATE_EXPORT ShaderDataManager *NodeManagers::manager<ShaderData>() const noexcept; template<> -Q_3DRENDERSHARED_PRIVATE_EXPORT GLBufferManager *NodeManagers::manager<GLBuffer>() const noexcept; +Q_3DRENDERSHARED_PRIVATE_EXPORT BufferManager *NodeManagers::manager<Buffer>() const noexcept; template<> Q_3DRENDERSHARED_PRIVATE_EXPORT TextureImageManager *NodeManagers::manager<TextureImage>() const noexcept; template<> -Q_3DRENDERSHARED_PRIVATE_EXPORT BufferManager *NodeManagers::manager<Buffer>() const noexcept; - -template<> Q_3DRENDERSHARED_PRIVATE_EXPORT AttributeManager *NodeManagers::manager<Attribute>() const noexcept; template<> diff --git a/src/render/backend/resourceaccessor.cpp b/src/render/backend/resourceaccessor.cpp index 4f70df436..af19546b7 100644 --- a/src/render/backend/resourceaccessor.cpp +++ b/src/render/backend/resourceaccessor.cpp @@ -42,9 +42,7 @@ #include <private/nodemanagers_p.h> #include <private/texture_p.h> #include <private/rendertargetoutput_p.h> -#include <private/gltexturemanager_p.h> #include <private/managers_p.h> -#include <private/gltexture_p.h> #include <QtCore/qmutex.h> @@ -59,10 +57,10 @@ RenderBackendResourceAccessor::~RenderBackendResourceAccessor() } ResourceAccessor::ResourceAccessor(NodeManagers *mgr) - : m_glTextureManager(mgr->glTextureManager()) - , m_textureManager(mgr->textureManager()) - , m_attachmentManager(mgr->attachmentManager()) - , m_entityManager(mgr->renderNodesManager()) +// : m_glTextureManager(mgr->glTextureManager()) +// , m_textureManager(mgr->textureManager()) +// , m_attachmentManager(mgr->attachmentManager()) +// , m_entityManager(mgr->renderNodesManager()) { } @@ -70,58 +68,58 @@ ResourceAccessor::ResourceAccessor(NodeManagers *mgr) // called by render plugins from arbitrary thread bool ResourceAccessor::accessResource(ResourceType type, Qt3DCore::QNodeId nodeId, void **handle, QMutex **lock) { - switch (type) { - - case RenderBackendResourceAccessor::OGLTextureWrite: - Q_FALLTHROUGH(); - case RenderBackendResourceAccessor::OGLTextureRead: - { - Texture *tex = m_textureManager->lookupResource(nodeId); - if (!tex) - return false; - - GLTexture *glTex = m_glTextureManager->lookupResource(tex->peerId()); - if (!glTex) - return false; - - if (glTex->isDirty()) - return false; - - if (type == RenderBackendResourceAccessor::OGLTextureWrite) - glTex->setExternalRenderingEnabled(true); - - QOpenGLTexture **glTextureHandle = reinterpret_cast<QOpenGLTexture **>(handle); - *glTextureHandle = glTex->getGLTexture(); - - if (type == RenderBackendResourceAccessor::OGLTextureWrite) - *lock = glTex->externalRenderingLock(); - - return true; - } - - case RenderBackendResourceAccessor::OutputAttachment: { - RenderTargetOutput *output = m_attachmentManager->lookupResource(nodeId); - if (output) { - Attachment **attachmentData = reinterpret_cast<Attachment **>(handle); - *attachmentData = output->attachment(); - return true; - } - break; - } - - case RenderBackendResourceAccessor::EntityHandle: { - Entity *entity = m_entityManager->lookupResource(nodeId); - if (entity) { - Entity **pEntity = reinterpret_cast<Entity **>(handle); - *pEntity = entity; - return true; - } - break; - } - - default: - break; - } +// switch (type) { + +// case RenderBackendResourceAccessor::OGLTextureWrite: +// Q_FALLTHROUGH(); +// case RenderBackendResourceAccessor::OGLTextureRead: +// { +// Texture *tex = m_textureManager->lookupResource(nodeId); +// if (!tex) +// return false; + +// GLTexture *glTex = m_glTextureManager->lookupResource(tex->peerId()); +// if (!glTex) +// return false; + +// if (glTex->isDirty()) +// return false; + +// if (type == RenderBackendResourceAccessor::OGLTextureWrite) +// glTex->setExternalRenderingEnabled(true); + +// QOpenGLTexture **glTextureHandle = reinterpret_cast<QOpenGLTexture **>(handle); +// *glTextureHandle = glTex->getGLTexture(); + +// if (type == RenderBackendResourceAccessor::OGLTextureWrite) +// *lock = glTex->externalRenderingLock(); + +// return true; +// } + +// case RenderBackendResourceAccessor::OutputAttachment: { +// RenderTargetOutput *output = m_attachmentManager->lookupResource(nodeId); +// if (output) { +// Attachment **attachmentData = reinterpret_cast<Attachment **>(handle); +// *attachmentData = output->attachment(); +// return true; +// } +// break; +// } + +// case RenderBackendResourceAccessor::EntityHandle: { +// Entity *entity = m_entityManager->lookupResource(nodeId); +// if (entity) { +// Entity **pEntity = reinterpret_cast<Entity **>(handle); +// *pEntity = entity; +// return true; +// } +// break; +// } + +// default: +// break; +// } return false; } diff --git a/src/render/backend/resourceaccessor_p.h b/src/render/backend/resourceaccessor_p.h index ec53a04a2..6ceb8677b 100644 --- a/src/render/backend/resourceaccessor_p.h +++ b/src/render/backend/resourceaccessor_p.h @@ -89,10 +89,10 @@ public: ResourceAccessor(NodeManagers *mgr); bool accessResource(ResourceType type, Qt3DCore::QNodeId nodeId, void **handle, QMutex **lock) final; private: - GLTextureManager *m_glTextureManager; - TextureManager *m_textureManager; - AttachmentManager *m_attachmentManager; - EntityManager *m_entityManager; +// GLTextureManager *m_glTextureManager; +// TextureManager *m_textureManager; +// AttachmentManager *m_attachmentManager; +// EntityManager *m_entityManager; }; } // namespace Render diff --git a/src/render/frontend/qrenderaspect.cpp b/src/render/frontend/qrenderaspect.cpp index 7a51fa0e7..f25c080a0 100644 --- a/src/render/frontend/qrenderaspect.cpp +++ b/src/render/frontend/qrenderaspect.cpp @@ -618,6 +618,8 @@ void QRenderAspect::onUnregistered() d->unregisterBackendTypes(); + d->m_renderer->releaseGraphicsResources(); + delete d->m_nodeManagers; d->m_nodeManagers = nullptr; 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 - - diff --git a/src/render/texture/qtexture.cpp b/src/render/texture/qtexture.cpp index 84a228428..7f662dfc5 100644 --- a/src/render/texture/qtexture.cpp +++ b/src/render/texture/qtexture.cpp @@ -57,7 +57,7 @@ #include <Qt3DRender/private/managers_p.h> #include <Qt3DRender/private/texture_p.h> #include <Qt3DRender/private/qurlhelper_p.h> -#include <Qt3DRender/private/gltexturemanager_p.h> +#include <Qt3DRender/private/glresourcemanagers_p.h> QT_BEGIN_NAMESPACE diff --git a/src/render/texture/texture.cpp b/src/render/texture/texture.cpp index 1414cd337..795c5844e 100644 --- a/src/render/texture/texture.cpp +++ b/src/render/texture/texture.cpp @@ -47,7 +47,7 @@ #include <Qt3DCore/qpropertynoderemovedchange.h> #include <Qt3DRender/private/texture_p.h> -#include <Qt3DRender/private/gltexturemanager_p.h> +#include <Qt3DRender/private/glresourcemanagers_p.h> #include <Qt3DRender/private/managers_p.h> QT_BEGIN_NAMESPACE |