aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorLaszlo Agocs <laszlo.agocs@qt.io>2019-06-25 16:37:58 +0200
committerLaszlo Agocs <laszlo.agocs@qt.io>2019-07-04 19:49:08 +0200
commit192d4fa0af5f40f76979f195c4356b26eaed1696 (patch)
treee4df789d370b45b5a84f0b971b21ce3c2640fa2c /src
parentfc40f0738e55725d4449059578510802dbf596ec (diff)
Make openglunderqml functional with and without the rhi
It has to be written following the new split approach (beforeRendering for resource setup, beforeRenderPassRecording to issue the actual underlay draw calls), but it will then work both with and without QSG_RHI=1. Change-Id: I9b7b35434aa0caec543cae268064b2684256382d Reviewed-by: Lars Knoll <lars.knoll@qt.io>
Diffstat (limited to 'src')
-rw-r--r--src/quick/items/qquickwindow.cpp33
-rw-r--r--src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp6
-rw-r--r--src/quick/scenegraph/qsgcontext.cpp28
-rw-r--r--src/quick/scenegraph/qsgcontext_p.h23
-rw-r--r--src/quick/scenegraph/qsgdefaultrendercontext.cpp25
-rw-r--r--src/quick/scenegraph/qsgdefaultrendercontext_p.h18
6 files changed, 100 insertions, 33 deletions
diff --git a/src/quick/items/qquickwindow.cpp b/src/quick/items/qquickwindow.cpp
index 0adfbdb922..c51cfc8ac1 100644
--- a/src/quick/items/qquickwindow.cpp
+++ b/src/quick/items/qquickwindow.cpp
@@ -474,13 +474,18 @@ void QQuickWindowPrivate::renderSceneGraph(const QSize &size, const QSize &surfa
if (rhi) {
// ### no offscreen ("renderTargetId") support yet
- context->beginRhiFrame(renderer,
- swapchain->currentFrameRenderTarget(),
- rpDescForSwapchain,
- swapchain->currentFrameCommandBuffer(),
- emitBeforeRenderPassRecording,
- emitAfterRenderPassRecording,
- q);
+ context->beginNextRhiFrame(renderer,
+ swapchain->currentFrameRenderTarget(),
+ rpDescForSwapchain,
+ swapchain->currentFrameCommandBuffer(),
+ emitBeforeRenderPassRecording,
+ emitAfterRenderPassRecording,
+ q);
+ } else {
+ context->beginNextFrame(renderer,
+ emitBeforeRenderPassRecording,
+ emitAfterRenderPassRecording,
+ q);
}
animationController->advance();
@@ -528,7 +533,9 @@ void QQuickWindowPrivate::renderSceneGraph(const QSize &size, const QSize &surfa
runAndClearJobs(&afterRenderingJobs);
if (rhi)
- context->endRhiFrame(renderer);
+ context->endNextRhiFrame(renderer);
+ else
+ context->endNextFrame(renderer);
}
QQuickWindowPrivate::QQuickWindowPrivate()
@@ -4202,6 +4209,11 @@ QQmlIncubationController *QQuickWindow::incubationController() const
attached images). The native graphics objects can be queried via
QSGRendererInterface.
+ When not running with the RHI (and using OpenGL directly), the signal is
+ emitted after the renderer has cleared the render target. This makes it
+ possible to create appliations that function identically both with and
+ without the RHI.
+
\note Resource updates (uploads, copies) typically cannot be enqueued from
within a render pass. Therefore, more complex user rendering will need to
connect to both the beforeRendering() and this signals.
@@ -4228,6 +4240,11 @@ QQmlIncubationController *QQuickWindow::incubationController() const
the attached images). The native graphics objects can be queried via
QSGRendererInterface.
+ When not running with the RHI (and using OpenGL directly), the signal is
+ emitted after the renderer has finished its rendering, but before
+ afterRendering(). This makes it possible to create appliations that
+ function identically both with and without the RHI.
+
\note Resource updates (uploads, copies) typically cannot be enqueued from
within a render pass. Therefore, more complex user rendering will need to
connect to both the beforeRendering() and this signals.
diff --git a/src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp b/src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp
index eab40bb253..14ab7f9393 100644
--- a/src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp
+++ b/src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp
@@ -3984,6 +3984,9 @@ void Renderer::renderBatches()
bindable()->clear(clearMode());
+ if (m_renderPassRecordingCallbacks.start)
+ m_renderPassRecordingCallbacks.start(m_renderPassRecordingCallbacks.userData);
+
if (Q_LIKELY(renderOpaque)) {
for (int i=0; i<m_opaqueBatches.size(); ++i) {
Batch *b = m_opaqueBatches.at(i);
@@ -4020,6 +4023,9 @@ void Renderer::renderBatches()
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
glDepthMask(true);
+ if (m_renderPassRecordingCallbacks.end)
+ m_renderPassRecordingCallbacks.end(m_renderPassRecordingCallbacks.userData);
+
} else {
// RHI path
diff --git a/src/quick/scenegraph/qsgcontext.cpp b/src/quick/scenegraph/qsgcontext.cpp
index a5d9391034..97fd49e4c7 100644
--- a/src/quick/scenegraph/qsgcontext.cpp
+++ b/src/quick/scenegraph/qsgcontext.cpp
@@ -341,11 +341,27 @@ void QSGRenderContext::invalidate()
{
}
-void QSGRenderContext::beginRhiFrame(QSGRenderer *renderer, QRhiRenderTarget *rt, QRhiRenderPassDescriptor *rp,
- QRhiCommandBuffer *cb,
- RenderPassCallback mainPassRecordingStart,
- RenderPassCallback mainPassRecordingEnd,
- void *callbackUserData)
+void QSGRenderContext::beginNextFrame(QSGRenderer *renderer,
+ RenderPassCallback mainPassRecordingStart,
+ RenderPassCallback mainPassRecordingEnd,
+ void *callbackUserData)
+{
+ Q_UNUSED(renderer);
+ Q_UNUSED(mainPassRecordingStart);
+ Q_UNUSED(mainPassRecordingEnd);
+ Q_UNUSED(callbackUserData);
+}
+
+void QSGRenderContext::endNextFrame(QSGRenderer *renderer)
+{
+ Q_UNUSED(renderer);
+}
+
+void QSGRenderContext::beginNextRhiFrame(QSGRenderer *renderer,
+ QRhiRenderTarget *rt, QRhiRenderPassDescriptor *rp, QRhiCommandBuffer *cb,
+ RenderPassCallback mainPassRecordingStart,
+ RenderPassCallback mainPassRecordingEnd,
+ void *callbackUserData)
{
Q_UNUSED(renderer);
Q_UNUSED(rt);
@@ -361,7 +377,7 @@ void QSGRenderContext::renderNextRhiFrame(QSGRenderer *renderer)
Q_UNUSED(renderer);
}
-void QSGRenderContext::endRhiFrame(QSGRenderer *renderer)
+void QSGRenderContext::endNextRhiFrame(QSGRenderer *renderer)
{
Q_UNUSED(renderer);
}
diff --git a/src/quick/scenegraph/qsgcontext_p.h b/src/quick/scenegraph/qsgcontext_p.h
index c731baeb74..4e712ab7c3 100644
--- a/src/quick/scenegraph/qsgcontext_p.h
+++ b/src/quick/scenegraph/qsgcontext_p.h
@@ -171,15 +171,24 @@ public:
struct InitParams { };
virtual void initialize(const InitParams *params);
virtual void invalidate();
- virtual void renderNextFrame(QSGRenderer *renderer, uint fboId) = 0; // legacy, GL-only
+
using RenderPassCallback = void (*)(void *);
- virtual void beginRhiFrame(QSGRenderer *renderer, QRhiRenderTarget *rt, QRhiRenderPassDescriptor *rp,
- QRhiCommandBuffer *cb,
- RenderPassCallback mainPassRecordingStart,
- RenderPassCallback mainPassRecordingEnd,
- void *callbackUserData); // RHI only
+
+ virtual void beginNextFrame(QSGRenderer *renderer,
+ RenderPassCallback mainPassRecordingStart,
+ RenderPassCallback mainPassRecordingEnd,
+ void *callbackUserData);
+ virtual void renderNextFrame(QSGRenderer *renderer, uint fboId) = 0;
+ virtual void endNextFrame(QSGRenderer *renderer);
+
+ virtual void beginNextRhiFrame(QSGRenderer *renderer,
+ QRhiRenderTarget *rt, QRhiRenderPassDescriptor *rp, QRhiCommandBuffer *cb,
+ RenderPassCallback mainPassRecordingStart,
+ RenderPassCallback mainPassRecordingEnd,
+ void *callbackUserData);
virtual void renderNextRhiFrame(QSGRenderer *renderer);
- virtual void endRhiFrame(QSGRenderer *renderer); // RHI only
+ virtual void endNextRhiFrame(QSGRenderer *renderer);
+
virtual void endSync();
virtual QSGDistanceFieldGlyphCache *distanceFieldGlyphCache(const QRawFont &font);
diff --git a/src/quick/scenegraph/qsgdefaultrendercontext.cpp b/src/quick/scenegraph/qsgdefaultrendercontext.cpp
index e0f1b1b0c3..b6f35b8580 100644
--- a/src/quick/scenegraph/qsgdefaultrendercontext.cpp
+++ b/src/quick/scenegraph/qsgdefaultrendercontext.cpp
@@ -201,6 +201,14 @@ void QSGDefaultRenderContext::invalidate()
static QBasicMutex qsg_framerender_mutex;
+void QSGDefaultRenderContext::beginNextFrame(QSGRenderer *renderer,
+ RenderPassCallback mainPassRecordingStart,
+ RenderPassCallback mainPassRecordingEnd,
+ void *callbackUserData)
+{
+ renderer->setRenderPassRecordingCallbacks(mainPassRecordingStart, mainPassRecordingEnd, callbackUserData);
+}
+
void QSGDefaultRenderContext::renderNextFrame(QSGRenderer *renderer, uint fboId)
{
if (m_serializedRender)
@@ -212,11 +220,16 @@ void QSGDefaultRenderContext::renderNextFrame(QSGRenderer *renderer, uint fboId)
qsg_framerender_mutex.unlock();
}
-void QSGDefaultRenderContext::beginRhiFrame(QSGRenderer *renderer, QRhiRenderTarget *rt, QRhiRenderPassDescriptor *rp,
- QRhiCommandBuffer *cb,
- RenderPassCallback mainPassRecordingStart,
- RenderPassCallback mainPassRecordingEnd,
- void *callbackUserData)
+void QSGDefaultRenderContext::endNextFrame(QSGRenderer *renderer)
+{
+ Q_UNUSED(renderer);
+}
+
+void QSGDefaultRenderContext::beginNextRhiFrame(QSGRenderer *renderer, QRhiRenderTarget *rt, QRhiRenderPassDescriptor *rp,
+ QRhiCommandBuffer *cb,
+ RenderPassCallback mainPassRecordingStart,
+ RenderPassCallback mainPassRecordingEnd,
+ void *callbackUserData)
{
Q_ASSERT(!m_currentFrameCommandBuffer);
@@ -233,7 +246,7 @@ void QSGDefaultRenderContext::renderNextRhiFrame(QSGRenderer *renderer)
renderer->renderScene();
}
-void QSGDefaultRenderContext::endRhiFrame(QSGRenderer *renderer)
+void QSGDefaultRenderContext::endNextRhiFrame(QSGRenderer *renderer)
{
Q_UNUSED(renderer);
m_currentFrameCommandBuffer = nullptr;
diff --git a/src/quick/scenegraph/qsgdefaultrendercontext_p.h b/src/quick/scenegraph/qsgdefaultrendercontext_p.h
index 18698f51f3..79bc9dd76d 100644
--- a/src/quick/scenegraph/qsgdefaultrendercontext_p.h
+++ b/src/quick/scenegraph/qsgdefaultrendercontext_p.h
@@ -102,15 +102,21 @@ public:
void initialize(const QSGRenderContext::InitParams *params) override;
void invalidate() override;
+
+ void beginNextFrame(QSGRenderer *renderer,
+ RenderPassCallback mainPassRecordingStart,
+ RenderPassCallback mainPassRecordingEnd,
+ void *callbackUserData) override;
void renderNextFrame(QSGRenderer *renderer, uint fboId) override;
+ void endNextFrame(QSGRenderer *renderer) override;
- void beginRhiFrame(QSGRenderer *renderer, QRhiRenderTarget *rt, QRhiRenderPassDescriptor *rp,
- QRhiCommandBuffer *cb,
- RenderPassCallback mainPassRecordingStart,
- RenderPassCallback mainPassRecordingEnd,
- void *callbackUserData) override;
+ void beginNextRhiFrame(QSGRenderer *renderer,
+ QRhiRenderTarget *rt, QRhiRenderPassDescriptor *rp, QRhiCommandBuffer *cb,
+ RenderPassCallback mainPassRecordingStart,
+ RenderPassCallback mainPassRecordingEnd,
+ void *callbackUserData) override;
void renderNextRhiFrame(QSGRenderer *renderer) override;
- void endRhiFrame(QSGRenderer *renderer) override;
+ void endNextRhiFrame(QSGRenderer *renderer) override;
QSGDistanceFieldGlyphCache *distanceFieldGlyphCache(const QRawFont &font) override;