diff options
author | Paul Lemire <paul.lemire@kdab.com> | 2020-07-15 16:17:10 +0200 |
---|---|---|
committer | Paul Lemire <paul.lemire@kdab.com> | 2020-07-29 08:03:55 +0200 |
commit | 136c016cbe99cd7b8c810c44724e5e3b1b6297e1 (patch) | |
tree | 81e05dbf0eddcc70ece85cf54292b3ba47110a59 /tests | |
parent | db611272f595dbb9f381b86d23353dece35df021 (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 'tests')
-rw-r--r-- | tests/auto/render/commons/testrenderer.h | 5 | ||||
-rw-r--r-- | tests/manual/manual-renderloop/main.cpp | 11 |
2 files changed, 12 insertions, 4 deletions
diff --git a/tests/auto/render/commons/testrenderer.h b/tests/auto/render/commons/testrenderer.h index 11be92153..5c1ac71d2 100644 --- a/tests/auto/render/commons/testrenderer.h +++ b/tests/auto/render/commons/testrenderer.h @@ -42,6 +42,8 @@ public: void dumpInfo() const override {} Qt3DRender::API api() const override { return Qt3DRender::API::OpenGL; } + void setRenderDriver(AbstractRenderer::RenderDriver) override {}; + AbstractRenderer::RenderDriver renderDriver() const override { return Qt3D; } qint64 time() const override { return 0; } void setTime(qint64 time) override { Q_UNUSED(time); } void setAspect(Qt3DRender::QRenderAspect *aspect) override { m_aspect = aspect; } @@ -91,6 +93,9 @@ public: QSurfaceFormat format() override; void setOpenGLContext(QOpenGLContext *) override {} + void setRHIContext(QRhi *) override {} + void setDefaultRHIRenderTarget(QRhiRenderTarget *) override {}; + void setRHICommandBuffer(QRhiCommandBuffer *) override {}; bool accessOpenGLTexture(Qt3DCore::QNodeId, QOpenGLTexture **, QMutex **, bool) override { return false; } QSharedPointer<Qt3DRender::Render::RenderBackendResourceAccessor> resourceAccessor() const override { return m_resourceAccessor; } diff --git a/tests/manual/manual-renderloop/main.cpp b/tests/manual/manual-renderloop/main.cpp index 7c7d525a4..b8382fde2 100644 --- a/tests/manual/manual-renderloop/main.cpp +++ b/tests/manual/manual-renderloop/main.cpp @@ -61,6 +61,7 @@ #include <Qt3DRender/QRenderSettings> #include <Qt3DRender/QRenderSurfaceSelector> #include <Qt3DRender/private/qrenderaspect_p.h> +#include <Qt3DRender/private/abstractrenderer_p.h> class ManualRenderer @@ -69,6 +70,7 @@ public: ManualRenderer() : m_aspectEngine(new Qt3DCore::QAspectEngine()) , m_renderAspect(new Qt3DRender::QRenderAspect(Qt3DRender::QRenderAspect::Manual)) + , m_renderer(nullptr) { } @@ -86,7 +88,9 @@ public: Qt3DRender::QRenderAspectPrivate *dRenderAspect = static_cast<decltype(dRenderAspect)> (Qt3DRender::QRenderAspectPrivate::get(m_renderAspect)); - dRenderAspect->renderInitialize(glCtx); + m_renderer = dRenderAspect->m_renderer; + m_renderer->setOpenGLContext(glCtx); + m_renderer->initialize(); m_rootEntity.reset(createSceneTree(window)); m_aspectEngine->setRootEntity(m_rootEntity); @@ -100,9 +104,7 @@ public: m_aspectEngine->processFrame(); qDebug() << Q_FUNC_INFO << "Rendering Frame"; // Submit Render Queues - Qt3DRender::QRenderAspectPrivate *dRenderAspect = static_cast<decltype(dRenderAspect)> - (Qt3DRender::QRenderAspectPrivate::get(m_renderAspect)); - dRenderAspect->render(true); + m_renderer->render(true); } private: @@ -167,6 +169,7 @@ private: Qt3DCore::QEntityPtr m_rootEntity; Qt3DCore::QAspectEngine *m_aspectEngine; Qt3DRender::QRenderAspect *m_renderAspect; + Qt3DRender::Render::AbstractRenderer *m_renderer; }; int main(int ac, char **av) |