diff options
author | Paul Lemire <paul.lemire@kdab.com> | 2017-06-02 13:28:45 +0200 |
---|---|---|
committer | Paul Lemire <paul.lemire@kdab.com> | 2020-02-03 10:05:34 +0100 |
commit | abf5d701ed90e3f1516821712a3018cbe7a2b7fe (patch) | |
tree | 2436321af456ad97e694616ad1ec0996f543b31a /src/render/renderers/opengl/renderer/renderer.cpp | |
parent | 118124ac1340efb64e8821d466f9d9c2be001bc2 (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/render/renderers/opengl/renderer/renderer.cpp')
-rw-r--r-- | src/render/renderers/opengl/renderer/renderer.cpp | 48 |
1 files changed, 29 insertions, 19 deletions
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); } } } |