Commit 18262946 authored by Gunnar Sletta's avatar Gunnar Sletta Committed by Qt by Nokia
Browse files

Added QQuickCanvas::setRenderTarget(uint fbo, const QSize &size)


This allows to hook in non-QOpenGLFrameBufferObject FBO's also

Change-Id: I8a2f8f7f15d5a92262bdbb0507b232d7c11fdf25
Reviewed-by: default avatarJani Hautakangas <jani.hautakangas@nokia.com>
parent f5a43c09
dev 5.10 5.11 5.12 5.12.1 5.12.10 5.12.11 5.12.12 5.12.2 5.12.3 5.12.4 5.12.5 5.12.6 5.12.7 5.12.8 5.12.9 5.13 5.13.0 5.13.1 5.13.2 5.14 5.14.0 5.14.1 5.14.2 5.15 5.15.0 5.15.1 5.15.2 5.3 5.4 5.5 5.6 5.7 5.8 5.9 5.9.8 6.0 6.0.0 6.1 6.1.0 6.1.1 6.1.2 6.1.3 6.2 6.2.0 6.2.1 6.2.2 old/5.0 old/5.1 old/5.2 wip/cmake wip/dbus wip/gc wip/itemviews wip/nacl wip/new-backend wip/pointerhandler wip/propertycache-refactor wip/qquickdeliveryagent wip/scenegraphng wip/tizen wip/webassembly v5.15.0-alpha1 v5.14.1 v5.14.0 v5.14.0-rc2 v5.14.0-rc1 v5.14.0-beta3 v5.14.0-beta2 v5.14.0-beta1 v5.14.0-alpha1 v5.13.2 v5.13.1 v5.13.0 v5.13.0-rc3 v5.13.0-rc2 v5.13.0-rc1 v5.13.0-beta4 v5.13.0-beta3 v5.13.0-beta2 v5.13.0-beta1 v5.13.0-alpha1 v5.12.7 v5.12.6 v5.12.5 v5.12.4 v5.12.3 v5.12.2 v5.12.1 v5.12.0 v5.12.0-rc2 v5.12.0-rc1 v5.12.0-beta4 v5.12.0-beta3 v5.12.0-beta2 v5.12.0-beta1 v5.12.0-alpha1 v5.11.3 v5.11.2 v5.11.1 v5.11.0 v5.11.0-rc2 v5.11.0-rc1 v5.11.0-beta4 v5.11.0-beta3 v5.11.0-beta2 v5.11.0-beta1 v5.11.0-alpha1 v5.10.1 v5.10.0 v5.10.0-rc3 v5.10.0-rc2 v5.10.0-rc1 v5.10.0-beta4 v5.10.0-beta3 v5.10.0-beta2 v5.10.0-beta1 v5.10.0-alpha1 v5.9.9 v5.9.8 v5.9.7 v5.9.6 v5.9.5 v5.9.4 v5.9.3 v5.9.2 v5.9.1 v5.9.0 v5.9.0-rc2 v5.9.0-rc1 v5.9.0-beta4 v5.9.0-beta3 v5.9.0-beta2 v5.9.0-beta1 v5.9.0-alpha1 v5.8.0 v5.8.0-rc1 v5.8.0-beta1 v5.8.0-alpha1 v5.7.1 v5.7.0 v5.7.0-rc1 v5.7.0-beta1 v5.7.0-alpha1 v5.6.3 v5.6.2 v5.6.1 v5.6.1-1 v5.6.0 v5.6.0-rc1 v5.6.0-beta1 v5.6.0-alpha1 v5.5.1 v5.5.0 v5.5.0-rc1 v5.5.0-beta1 v5.5.0-alpha1 v5.4.2 v5.4.1 v5.4.0 v5.4.0-rc1 v5.4.0-beta1 v5.4.0-alpha1 v5.3.2 v5.3.1 v5.3.0 v5.3.0-rc1 v5.3.0-beta1 v5.3.0-alpha1 v5.2.1 v5.2.0 v5.2.0-rc1 v5.2.0-beta1 v5.2.0-alpha1 v5.1.1 v5.1.0 v5.1.0-rc2 v5.1.0-rc1 v5.1.0-beta1 v5.1.0-alpha1 v5.0.2 v5.0.1 v5.0.0 v5.0.0-rc2 v5.0.0-rc1 v5.0.0-beta2 v5.0.0-beta1 qt-v5.0.0-alpha1
No related merge requests found
Showing with 85 additions and 7 deletions
...@@ -264,12 +264,18 @@ void QQuickCanvasPrivate::syncSceneGraph() ...@@ -264,12 +264,18 @@ void QQuickCanvasPrivate::syncSceneGraph()
void QQuickCanvasPrivate::renderSceneGraph(const QSize &size) void QQuickCanvasPrivate::renderSceneGraph(const QSize &size)
{ {
Q_Q(QQuickCanvas); Q_Q(QQuickCanvas);
emit q->beforeRendering();
int fboId = 0;
renderer->setDeviceRect(QRect(QPoint(0, 0), size)); renderer->setDeviceRect(QRect(QPoint(0, 0), size));
renderer->setViewportRect(QRect(QPoint(0, 0), renderTarget ? renderTarget->size() : size)); if (renderTargetId) {
fboId = renderTargetId;
renderer->setViewportRect(QRect(QPoint(0, 0), renderTargetSize));
} else {
renderer->setViewportRect(QRect(QPoint(0, 0), size));
}
renderer->setProjectionMatrixToDeviceRect(); renderer->setProjectionMatrixToDeviceRect();
emit q->beforeRendering(); context->renderNextFrame(renderer, fboId);
context->renderNextFrame(renderer, renderTarget);
emit q->afterRendering(); emit q->afterRendering();
} }
...@@ -285,6 +291,7 @@ QQuickCanvasPrivate::QQuickCanvasPrivate() ...@@ -285,6 +291,7 @@ QQuickCanvasPrivate::QQuickCanvasPrivate()
, clearColor(Qt::white) , clearColor(Qt::white)
, clearBeforeRendering(true) , clearBeforeRendering(true)
, renderTarget(0) , renderTarget(0)
, renderTargetId(0)
, incubationController(0) , incubationController(0)
{ {
} }
...@@ -1818,8 +1825,53 @@ void QQuickCanvas::setRenderTarget(QOpenGLFramebufferObject *fbo) ...@@ -1818,8 +1825,53 @@ void QQuickCanvas::setRenderTarget(QOpenGLFramebufferObject *fbo)
} }
d->renderTarget = fbo; d->renderTarget = fbo;
if (fbo) {
d->renderTargetId = fbo->handle();
d->renderTargetSize = fbo->size();
} else {
d->renderTargetId = 0;
d->renderTargetSize = QSize();
}
}
/*!
\overload
*/
void QQuickCanvas::setRenderTarget(uint fboId, const QSize &size)
{
Q_D(QQuickCanvas);
if (d->context && d->context && QThread::currentThread() != d->context->thread()) {
qWarning("QQuickCanvas::setRenderThread: Cannot set render target from outside the rendering thread");
return;
}
d->renderTargetId = fboId;
d->renderTargetSize = size;
// Unset any previously set instance...
d->renderTarget = 0;
}
/*!
Returns the FBO id of the render target when set; otherwise returns 0.
*/
uint QQuickCanvas::renderTargetId() const
{
Q_D(const QQuickCanvas);
return d->renderTargetId;
} }
/*!
Returns the size of the currently set render target; otherwise returns an enpty size.
*/
QSize QQuickCanvas::renderTargetSize() const
{
Q_D(const QQuickCanvas);
return d->renderTargetSize;
}
/*! /*!
......
...@@ -96,6 +96,10 @@ public: ...@@ -96,6 +96,10 @@ public:
void setRenderTarget(QOpenGLFramebufferObject *fbo); void setRenderTarget(QOpenGLFramebufferObject *fbo);
QOpenGLFramebufferObject *renderTarget() const; QOpenGLFramebufferObject *renderTarget() const;
void setRenderTarget(uint fboId, const QSize &size);
uint renderTargetId() const;
QSize renderTargetSize() const;
QDeclarativeIncubationController *incubationController() const; QDeclarativeIncubationController *incubationController() const;
virtual QAccessibleInterface *accessibleRoot() const; virtual QAccessibleInterface *accessibleRoot() const;
......
...@@ -182,6 +182,8 @@ public: ...@@ -182,6 +182,8 @@ public:
uint clearBeforeRendering : 1; uint clearBeforeRendering : 1;
QOpenGLFramebufferObject *renderTarget; QOpenGLFramebufferObject *renderTarget;
uint renderTargetId;
QSize renderTargetSize;
QHash<int, QQuickItem *> itemForTouchPointId; QHash<int, QQuickItem *> itemForTouchPointId;
......
...@@ -93,6 +93,17 @@ void QSGBindableFbo::bind() const ...@@ -93,6 +93,17 @@ void QSGBindableFbo::bind() const
m_fbo->bind(); m_fbo->bind();
} }
QSGBindableFboId::QSGBindableFboId(GLuint id)
: m_id(id)
{
}
void QSGBindableFboId::bind() const
{
QOpenGLContext::currentContext()->functions()->glBindFramebuffer(GL_FRAMEBUFFER, m_id);
}
/*! /*!
\class QSGRenderer \class QSGRenderer
\brief The renderer class is the abstract baseclass use for rendering the \brief The renderer class is the abstract baseclass use for rendering the
......
...@@ -199,6 +199,15 @@ private: ...@@ -199,6 +199,15 @@ private:
QOpenGLFramebufferObject *m_fbo; QOpenGLFramebufferObject *m_fbo;
}; };
class QSGBindableFboId : public QSGBindable
{
public:
QSGBindableFboId(GLuint);
virtual void bind() const;
private:
GLuint m_id;
};
QSGMaterialShader::RenderState QSGRenderer::state(QSGMaterialShader::RenderState::DirtyStates dirty) const QSGMaterialShader::RenderState QSGRenderer::state(QSGMaterialShader::RenderState::DirtyStates dirty) const
......
...@@ -221,10 +221,10 @@ bool QSGContext::isReady() const ...@@ -221,10 +221,10 @@ bool QSGContext::isReady() const
} }
void QSGContext::renderNextFrame(QSGRenderer *renderer, QOpenGLFramebufferObject *fbo) void QSGContext::renderNextFrame(QSGRenderer *renderer, GLuint fboId)
{ {
if (fbo) { if (fboId) {
QSGBindableFbo bindable(fbo); QSGBindableFboId bindable(fboId);
renderer->renderScene(bindable); renderer->renderScene(bindable);
} else { } else {
renderer->renderScene(); renderer->renderScene();
......
...@@ -92,7 +92,7 @@ public: ...@@ -92,7 +92,7 @@ public:
QSGMaterialShader *prepareMaterial(QSGMaterial *material); QSGMaterialShader *prepareMaterial(QSGMaterial *material);
virtual void renderNextFrame(QSGRenderer *renderer, QOpenGLFramebufferObject *fbo = 0); virtual void renderNextFrame(QSGRenderer *renderer, GLuint fboId);
virtual QSGDistanceFieldGlyphCache *createDistanceFieldGlyphCache(const QRawFont &font); virtual QSGDistanceFieldGlyphCache *createDistanceFieldGlyphCache(const QRawFont &font);
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment