summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire@kdab.com>2017-06-02 13:28:45 +0200
committerPaul Lemire <paul.lemire@kdab.com>2020-02-03 10:05:34 +0100
commitabf5d701ed90e3f1516821712a3018cbe7a2b7fe (patch)
tree2436321af456ad97e694616ad1ec0996f543b31a /src
parent118124ac1340efb64e8821d466f9d9c2be001bc2 (diff)
Add dedicated managers holder for GL Resources
That way NodeManagers only refers to managers holding nodes (so can be used by aspect and all renderer) and GLResourceManagers refers to renderer specific resources. Note: the Scene2D resourceaccessor was making direct access to GL resource through the managers, this has been commented and will be restored later. Change-Id: Ic32784f60eac35aab8c066d1769f078639fa25b8 Reviewed-by: Mike Krus <mike.krus@kdab.com>
Diffstat (limited to 'src')
-rw-r--r--src/render/backend/handle_types_p.h6
-rw-r--r--src/render/backend/managers_p.h24
-rw-r--r--src/render/backend/nodemanagers.cpp22
-rw-r--r--src/render/backend/nodemanagers_p.h22
-rw-r--r--src/render/backend/resourceaccessor.cpp114
-rw-r--r--src/render/backend/resourceaccessor_p.h8
-rw-r--r--src/render/frontend/qrenderaspect.cpp2
-rw-r--r--src/render/renderers/opengl/debug/imguirenderer.cpp1
-rw-r--r--src/render/renderers/opengl/graphicshelpers/graphicscontext.cpp2
-rw-r--r--src/render/renderers/opengl/graphicshelpers/graphicscontext_p.h1
-rw-r--r--src/render/renderers/opengl/graphicshelpers/submissioncontext.cpp35
-rw-r--r--src/render/renderers/opengl/io/glbuffer_p.h5
-rw-r--r--src/render/renderers/opengl/managers/gl_handle_types_p.h (renamed from src/render/renderers/opengl/textures/gltexturemanager_p.h)30
-rw-r--r--src/render/renderers/opengl/managers/glresourcemanagers.cpp70
-rw-r--r--src/render/renderers/opengl/managers/glresourcemanagers_p.h123
-rw-r--r--src/render/renderers/opengl/managers/managers.pri8
-rw-r--r--src/render/renderers/opengl/opengl.pri1
-rw-r--r--src/render/renderers/opengl/renderer/openglvertexarrayobject.cpp4
-rw-r--r--src/render/renderers/opengl/renderer/rendercommand_p.h1
-rw-r--r--src/render/renderers/opengl/renderer/renderer.cpp48
-rw-r--r--src/render/renderers/opengl/renderer/renderer_p.h4
-rw-r--r--src/render/renderers/opengl/renderer/renderview.cpp1
-rw-r--r--src/render/renderers/opengl/textures/textures.pri3
-rw-r--r--src/render/texture/qtexture.cpp2
-rw-r--r--src/render/texture/texture.cpp2
25 files changed, 343 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 1ce9f172f..35a037527 100644
--- a/src/render/frontend/qrenderaspect.cpp
+++ b/src/render/frontend/qrenderaspect.cpp
@@ -645,6 +645,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/debug/imguirenderer.cpp b/src/render/renderers/opengl/debug/imguirenderer.cpp
index f432970e4..8abe1b8c0 100644
--- a/src/render/renderers/opengl/debug/imguirenderer.cpp
+++ b/src/render/renderers/opengl/debug/imguirenderer.cpp
@@ -48,6 +48,7 @@
#include <Qt3DRender/private/renderview_p.h>
#include <Qt3DRender/private/renderer_p.h>
#include <Qt3DRender/private/geometryrenderermanager_p.h>
+#include <Qt3DRender/private/submissioncontext_p.h>
#include <QDateTime>
#include <QGuiApplication>
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 &parameterPack)
// 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 &parameterPack)
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 &parameterPack)
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 &parameterPack)
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/io/glbuffer_p.h b/src/render/renderers/opengl/io/glbuffer_p.h
index 731634b6b..676fb00d9 100644
--- a/src/render/renderers/opengl/io/glbuffer_p.h
+++ b/src/render/renderers/opengl/io/glbuffer_p.h
@@ -94,6 +94,11 @@ public:
inline bool isCreated() const { return m_isCreated; }
inline bool isBound() const { return m_bound; }
+#ifdef Q_OS_WIN
+ // To get MSVC to compile even though we don't need any cleanup
+ void cleanup() {}
+#endif
+
private:
GLuint m_bufferId;
bool m_isCreated;
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 f72f2d1a5..ad9d5c79a 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)
!integrity: include (debug/debug.pri)
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 c0549a8fd..21eeae9d8 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>
@@ -99,6 +98,8 @@
#include <Qt3DRender/private/imguirenderer_p.h>
#endif
+#include <Qt3DRender/private/glresourcemanagers_p.h>
+
#include <Qt3DRender/qcameralens.h>
#include <Qt3DCore/private/qeventfilterservice_p.h>
#include <Qt3DCore/private/qabstractaspectjobmanager_p.h>
@@ -280,6 +281,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)
, m_imGuiRenderer(nullptr)
@@ -332,6 +334,7 @@ Renderer::~Renderer()
delete m_renderQueue;
delete m_defaultRenderStateSet;
delete m_shaderCache;
+ delete m_glResourceManagers;
if (!m_ownedContext)
QObject::disconnect(m_contextConnection);
@@ -376,6 +379,7 @@ void Renderer::setJobsInLastFrame(int jobsInLastFrame)
void Renderer::setNodeManagers(NodeManagers *managers)
{
m_nodesManager = managers;
+ m_glResourceManagers = new GLResourceManagers();
m_updateShaderDataTransformJob->setManagers(m_nodesManager);
m_cleanupJob->setManagers(m_nodesManager);
@@ -561,6 +565,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;
}
/*!
@@ -599,23 +609,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();
}
@@ -1029,9 +1039,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)
@@ -1275,7 +1285,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) {
@@ -1347,7 +1357,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) {
@@ -1393,7 +1403,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
@@ -1446,7 +1456,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
@@ -1553,7 +1563,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.
@@ -2124,7 +2134,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()) {
@@ -2167,7 +2177,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()) {
@@ -2338,11 +2348,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 4b8574252..d8f95dc2b 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>
@@ -153,6 +154,7 @@ class VSyncFrameAdvanceService;
class PickEventFilter;
class NodeManagers;
class ShaderCache;
+class GLResourceManagers;
class UpdateLevelOfDetailJob;
typedef QSharedPointer<UpdateLevelOfDetailJob> UpdateLevelOfDetailJobPtr;
@@ -256,6 +258,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;
@@ -431,6 +434,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 f34015455..2a16c9bfd 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