summaryrefslogtreecommitdiffstats
path: root/src/render/renderers/opengl/renderer/renderer.cpp
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/render/renderers/opengl/renderer/renderer.cpp
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/render/renderers/opengl/renderer/renderer.cpp')
-rw-r--r--src/render/renderers/opengl/renderer/renderer.cpp48
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);
}
}
}