summaryrefslogtreecommitdiffstats
path: root/src/render
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire@kdab.com>2020-07-15 16:17:10 +0200
committerPaul Lemire <paul.lemire@kdab.com>2020-07-29 08:03:55 +0200
commit136c016cbe99cd7b8c810c44724e5e3b1b6297e1 (patch)
tree81e05dbf0eddcc70ece85cf54292b3ba47110a59 /src/render
parentdb611272f595dbb9f381b86d23353dece35df021 (diff)
Refactor Scene3D to work with both RHI and GL Qt3D renderers
- Depending on whether we are using RHI or GL we need to either trigger the rendering after the beforeRendering or beforeRenderPassRecording have been fired -> beforeRendering The RHI command buffer is set up but nothing has been recorded yet. This is what we want for the RHI backend but we will need to make sure we don't call begin/endFrame nor use swap chains other than the one QtQuick is using. This means RenderSurfaceSelector won't be possible. -> beforeRenderPassRecording The RHI command for buffer uploads have been uploaded but the actual RenderPass draw calls have yet to be made. The screen has been cleared already, so this is the best place for the GL backend which expects the screen to have been cleared. - The GL backend can use a QOpenGLFrameBufferObject but that is not possible with the RHI backend. - The RHI backend uses a custom QRhiRenderTarget that takes care of blitting its color attachment into a QRhiTexture which is then bound to a QSGTexture The overall Scene3DItem/Scene3DRender architecture remains the same: - processChange - Render Qt3D content into Texture - Set texture on a custom QSGNode quad Change-Id: Id6c317342d0a227d5295cbfefefc3ed12da160d7 Reviewed-by: Mike Krus <mike.krus@kdab.com>
Diffstat (limited to 'src/render')
-rw-r--r--src/render/backend/abstractrenderer_p.h15
-rw-r--r--src/render/frontend/qrenderapi.h1
-rw-r--r--src/render/frontend/qrenderaspect.cpp23
-rw-r--r--src/render/frontend/qrenderaspect_p.h5
4 files changed, 16 insertions, 28 deletions
diff --git a/src/render/backend/abstractrenderer_p.h b/src/render/backend/abstractrenderer_p.h
index 6f849128a..2eec1bc1b 100644
--- a/src/render/backend/abstractrenderer_p.h
+++ b/src/render/backend/abstractrenderer_p.h
@@ -69,6 +69,9 @@ class QScreen;
class QOpenGLTexture;
class QMouseEvent;
class QKeyEvent;
+class QRhi;
+class QRhiRenderTarget;
+class QRhiCommandBuffer;
namespace Qt3DCore {
class QAbstractFrameAdvanceService;
@@ -118,9 +121,16 @@ public:
};
Q_DECLARE_FLAGS(BackendNodeDirtySet, BackendNodeDirtyFlag)
+ enum RenderDriver {
+ Qt3D,
+ Scene3D,
+ };
+
virtual void dumpInfo() const = 0;
virtual API api() const = 0;
+ virtual void setRenderDriver(RenderDriver driver) = 0;
+ virtual RenderDriver renderDriver() const = 0;
virtual qint64 time() const = 0;
virtual void setTime(qint64 time) = 0;
@@ -172,8 +182,11 @@ public:
virtual QVariant executeCommand(const QStringList &args) = 0;
- // For QtQuick rendering (Scene2D)
+ // For QtQuick rendering (Scene3D/2D)
virtual void setOpenGLContext(QOpenGLContext *ctx) = 0;
+ virtual void setRHIContext(QRhi *ctx) = 0;
+ virtual void setDefaultRHIRenderTarget(QRhiRenderTarget *defaultTarget) = 0;
+ virtual void setRHICommandBuffer(QRhiCommandBuffer *commandBuffer) = 0;
virtual void setScreen(QScreen *) {}
virtual QScreen *screen() const { return nullptr; }
virtual bool accessOpenGLTexture(Qt3DCore::QNodeId nodeId, QOpenGLTexture **texture, QMutex **lock, bool readonly) = 0;
diff --git a/src/render/frontend/qrenderapi.h b/src/render/frontend/qrenderapi.h
index fc046642a..df1a4a692 100644
--- a/src/render/frontend/qrenderapi.h
+++ b/src/render/frontend/qrenderapi.h
@@ -51,6 +51,7 @@ enum class API {
Vulkan,
DirectX,
Metal,
+ RHI,
Null
};
diff --git a/src/render/frontend/qrenderaspect.cpp b/src/render/frontend/qrenderaspect.cpp
index bd6d7d831..3c5c2c053 100644
--- a/src/render/frontend/qrenderaspect.cpp
+++ b/src/render/frontend/qrenderaspect.cpp
@@ -630,29 +630,6 @@ QRenderAspect::~QRenderAspect()
{
}
-// Called by Scene3DRenderer only
-void QRenderAspectPrivate::renderInitialize(QOpenGLContext *context)
-{
- if (m_renderer->api() == API::OpenGL)
- m_renderer->setOpenGLContext(context);
- m_renderer->initialize();
-}
-
-/*! \internal */
-void QRenderAspectPrivate::render(bool swapBuffers)
-{
- m_renderer->render(swapBuffers);
-}
-
-/*
- * \internal
- * Only called when rendering with QtQuick 2 and a Scene3D item
- */
-void QRenderAspectPrivate::renderShutdown()
-{
- m_renderer->shutdown();
-}
-
std::vector<Qt3DCore::QAspectJobPtr> QRenderAspect::jobsToExecute(qint64 time)
{
using namespace Render;
diff --git a/src/render/frontend/qrenderaspect_p.h b/src/render/frontend/qrenderaspect_p.h
index 71dcf0468..b1b7bedc3 100644
--- a/src/render/frontend/qrenderaspect_p.h
+++ b/src/render/frontend/qrenderaspect_p.h
@@ -71,7 +71,7 @@ QT_BEGIN_NAMESPACE
class QSurface;
class QScreen;
-
+class QRhi;
namespace Qt3DRender {
class QSceneImporter;
@@ -113,9 +113,6 @@ public:
void unregisterBackendTypes();
void loadSceneParsers();
void loadRenderPlugin(const QString &pluginName);
- void renderInitialize(QOpenGLContext *context);
- void render(bool swapBuffers = true);
- void renderShutdown();
void registerBackendType(const QMetaObject &, const Qt3DCore::QBackendNodeMapperPtr &functor);
std::vector<Qt3DCore::QAspectJobPtr> createGeometryRendererJobs() const;
std::vector<Qt3DCore::QAspectJobPtr> createPreRendererJobs() const;