summaryrefslogtreecommitdiffstats
path: root/src/runtime/dragon/dragonrenderer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/runtime/dragon/dragonrenderer.cpp')
-rw-r--r--src/runtime/dragon/dragonrenderer.cpp57
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