diff options
Diffstat (limited to 'src/runtime/dragon/dragonrenderer.cpp')
-rw-r--r-- | src/runtime/dragon/dragonrenderer.cpp | 57 |
1 files changed, 39 insertions, 18 deletions
diff --git a/src/runtime/dragon/dragonrenderer.cpp b/src/runtime/dragon/dragonrenderer.cpp index afd0089..175534c 100644 --- a/src/runtime/dragon/dragonrenderer.cpp +++ b/src/runtime/dragon/dragonrenderer.cpp @@ -132,10 +132,11 @@ a Renderer for each backend. */ -Renderer::Renderer() +Renderer::Renderer(RenderType renderType) : nextFrameSemaphore(1) - , m_renderThread(new RenderThread(this)) + , m_renderThread(renderType == Threaded ? new RenderThread(this) : nullptr) , m_running(1) + , m_renderType(renderType) { if (m_renderThread) m_renderThread->waitForStart(); @@ -160,20 +161,31 @@ Renderer::~Renderer() m_renderThread->wait(); } m_offscreenHelper->deleteLater(); + if (m_ownedContext) + m_glContext->deleteLater(); } -void Renderer::initialize() +/*! + * \internal + * \brief Renderer::initialize + * + * If a context is provided to this function, it will be used for rendering, + * which is the case for Studio3D and Scene3D items. + */ +void Renderer::initialize(QOpenGLContext *context) { - // TODO don't forget to delete this - m_glContext = new QOpenGLContext; - m_glContext->setShareContext(qt_gl_global_share_context()); - m_glContext->create(); - // if (m_glContext->create()) - // qCDebug(Render::Backend) << "OpenGL context created with actual format" - // << m_glContext->format(); - // else - // qCWarning(Render::Backend) << Q_FUNC_INFO << "OpenGL context creation failed"; - m_ownedContext = true; + if (context != nullptr) { + m_glContext = context; + } else { + m_glContext = new QOpenGLContext; + m_glContext->setShareContext(qt_gl_global_share_context()); + + if (!m_glContext->create()) + qWarning() << Q_FUNC_INFO << "OpenGL context creation failed"; + + m_ownedContext = true; + } + if (!m_glContext->shareContext()) { // TODO don't forget to delete this m_shareContext = new QOpenGLContext; @@ -367,6 +379,8 @@ Renderer::Frame Renderer::doRender(Renderer::Frame frame) continue; } + const GLuint fboBeforeRender = activeSurface.glHelper()->boundFrameBufferObject(); + // We only need to do preparations such as uploading textures for one surface if (!preparationsComplete) { { @@ -483,6 +497,12 @@ Renderer::Frame Renderer::doRender(Renderer::Frame frame) } } + { + GLRenderTarget renderTarget; + renderTarget.frameBufferObjectId = fboBeforeRender; + frame.createdRenderTargets[QNodeId()] = renderTarget; + } + // Create render target if (!view->renderTargetId.isNull()) { auto defaultFBO = m_glContext->defaultFramebufferObject(); @@ -491,7 +511,8 @@ Renderer::Frame Renderer::doRender(Renderer::Frame frame) auto lastBoundFBOId = activeSurface.glHelper()->boundFrameBufferObject(); const auto &renderTargetNodeId = view->renderTargetId; const auto &attachments = view->attachmentPack; - if (!frame.createdRenderTargets.contains(view->renderTargetId)) { + + if (!frame.createdRenderTargets.contains(renderTargetNodeId)) { GLRenderTarget renderTarget; if (defaultFBO != 0 && lastBoundFBOId == defaultFBO) { // this is the default fbo that some platforms create (iOS), @@ -558,7 +579,9 @@ Renderer::Frame Renderer::doRender(Renderer::Frame frame) if (!preparationsComplete) return frame; - DrawContext drawContext = activeSurface.beginDrawing(); + // TODO might be better to just have to call swapBuffers manually + bool autoSwapBuffers = m_renderType == RenderType::Threaded; + DrawContext drawContext = activeSurface.beginDrawing(autoSwapBuffers); // TODO consider what m_ownCurrent was used for in SubmissionContext @@ -592,9 +615,7 @@ Renderer::Frame Renderer::doRender(Renderer::Frame frame) // TODO handle render state set // TODO consider having this function return a render target that is passed to the following functions - activeSurface.activateRenderTarget(frame.createdRenderTargets[view->renderTargetId] - .frameBufferObjectId, - view->attachmentPack); + activeSurface.activateRenderTarget(frame.createdRenderTargets[view->renderTargetId].frameBufferObjectId, view->attachmentPack); activeSurface.clearBackBuffer(view->clearBackBufferInfo); // TODO make it return a viewport, used by other functions that need one |