diff --git a/src/declarative/scenegraph/util/qsgpainternode.cpp b/src/declarative/scenegraph/util/qsgpainternode.cpp index 9a02d8bedda03e62fd9c00b3481534676393003b..90d66c094e34a9a03a8db97b4e97b38c75ce0d71 100644 --- a/src/declarative/scenegraph/util/qsgpainternode.cpp +++ b/src/declarative/scenegraph/util/qsgpainternode.cpp @@ -45,6 +45,7 @@ #include <private/qsgcontext_p.h> #include <qopenglframebufferobject.h> #include <qopenglfunctions.h> +#include <qopenglpaintdevice.h> #include <qmath.h> #include <qpainter.h> @@ -111,6 +112,7 @@ QSGPainterNode::QSGPainterNode(QSGPaintedItem *item) , m_multisampledFbo(0) , m_geometry(QSGGeometry::defaultAttributes_TexturedPoint2D(), 4) , m_texture(0) + , m_gl_device(0) , m_size(1, 1) , m_dirtyContents(false) , m_opaquePainting(false) @@ -135,6 +137,7 @@ QSGPainterNode::~QSGPainterNode() delete m_texture; delete m_fbo; delete m_multisampledFbo; + delete m_gl_device; } void QSGPainterNode::paint() @@ -144,10 +147,17 @@ void QSGPainterNode::paint() QPainter painter; if (m_actualRenderTarget == QSGPaintedItem::Image) painter.begin(&m_image); - else if (m_multisampledFbo) - painter.begin(m_multisampledFbo); - else - painter.begin(m_fbo); + else { + if (!m_gl_device) + m_gl_device = new QOpenGLPaintDevice(m_fboSize); + + if (m_multisampledFbo) + m_multisampledFbo->bind(); + else + m_fbo->bind(); + + painter.begin(m_gl_device); + } if (m_smoothPainting) { painter.setRenderHints(QPainter::Antialiasing | QPainter::HighQualityAntialiasing @@ -178,6 +188,11 @@ void QSGPainterNode::paint() QOpenGLFramebufferObject::blitFramebuffer(m_fbo, dirtyRect, m_multisampledFbo, dirtyRect); } + if (m_multisampledFbo) + m_multisampledFbo->release(); + else if (m_fbo) + m_fbo->release(); + m_dirtyRect = QRect(); } diff --git a/src/declarative/scenegraph/util/qsgpainternode_p.h b/src/declarative/scenegraph/util/qsgpainternode_p.h index c14e7701fb83ac06fa7454983dae0757bcb448e6..435e86e0d2dc6a5b0d29d9e3e3df2b0134777d29 100644 --- a/src/declarative/scenegraph/util/qsgpainternode_p.h +++ b/src/declarative/scenegraph/util/qsgpainternode_p.h @@ -56,6 +56,7 @@ QT_BEGIN_NAMESPACE QT_MODULE(Declarative) class QOpenGLFramebufferObject; +class QOpenGLPaintDevice; class Q_DECLARATIVE_EXPORT QSGPainterTexture : public QSGPlainTexture { @@ -125,6 +126,7 @@ private: QSGTextureMaterial m_materialO; QSGGeometry m_geometry; QSGPainterTexture *m_texture; + QOpenGLPaintDevice *m_gl_device; QSize m_size; QSize m_fboSize;