summaryrefslogtreecommitdiffstats
path: root/examples/widgets
diff options
context:
space:
mode:
authorLaszlo Agocs <laszlo.agocs@qt.io>2022-12-01 15:40:58 +0100
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2022-12-02 19:53:12 +0000
commitd2f3e3949f10aaba2085fc4b969313c738811744 (patch)
treea90026ede70e6bf96443bad440b0ad3cffa17a94 /examples/widgets
parent6453d17a0ab77d18c2f69a11bf6415840c3b24ca (diff)
Avoid continuous texture alloc in Composition Modes example
There seems to be some confusion from back when the example were mass-ported to the QOpenGL stuff in Qt 5 times. Fixes: QTBUG-109119 Change-Id: Ic4bcd010df3fcf82e16385ce241b379f0c351788 Reviewed-by: Christian Strømme <christian.stromme@qt.io> (cherry picked from commit 919664b29a874e8cdc3d74427654cbaa2b61be29) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
Diffstat (limited to 'examples/widgets')
-rw-r--r--examples/widgets/painting/composition/composition.cpp10
-rw-r--r--examples/widgets/painting/composition/composition.h1
-rw-r--r--examples/widgets/painting/shared/fbopaintdevice.cpp17
-rw-r--r--examples/widgets/painting/shared/fbopaintdevice.h2
4 files changed, 22 insertions, 8 deletions
diff --git a/examples/widgets/painting/composition/composition.cpp b/examples/widgets/painting/composition/composition.cpp
index 93ca5259aa..b902498b2d 100644
--- a/examples/widgets/painting/composition/composition.cpp
+++ b/examples/widgets/painting/composition/composition.cpp
@@ -219,6 +219,7 @@ CompositionRenderer::CompositionRenderer(QWidget *parent)
setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
#if QT_CONFIG(opengl)
m_pbuffer_size = 1024;
+ m_base_tex = 0;
#endif
}
@@ -314,6 +315,7 @@ void CompositionRenderer::paint(QPainter *painter)
{
#if QT_CONFIG(opengl)
if (usesOpenGL() && glWindow()->isValid()) {
+ auto *funcs = QOpenGLContext::currentContext()->functions();
if (!m_blitter.isCreated())
m_blitter.create();
@@ -338,10 +340,13 @@ void CompositionRenderer::paint(QPainter *painter)
p.setCompositionMode(QPainter::CompositionMode_SourceOver);
drawBase(p);
p.end();
+ if (m_base_tex)
+ funcs->glDeleteTextures(1, &m_base_tex);
m_base_tex = m_fbo->takeTexture();
}
painter->beginNativePainting();
+ uint compositingTex;
{
QPainter p(m_fbo.get());
p.beginNativePainting();
@@ -353,19 +358,18 @@ void CompositionRenderer::paint(QPainter *painter)
p.endNativePainting();
drawSource(p);
p.end();
- m_compositing_tex = m_fbo->takeTexture();
+ compositingTex = m_fbo->texture();
}
painter->endNativePainting();
painter->beginNativePainting();
- auto *funcs = QOpenGLContext::currentContext()->functions();
funcs->glEnable(GL_BLEND);
funcs->glBlendEquation(GL_FUNC_ADD);
funcs->glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
m_blitter.bind();
const QRect targetRect(QPoint(0, 0), m_fbo->size());
const QMatrix4x4 target = QOpenGLTextureBlitter::targetTransform(targetRect, QRect(QPoint(0, 0), size()));
- m_blitter.blit(m_compositing_tex, target, QOpenGLTextureBlitter::OriginBottomLeft);
+ m_blitter.blit(compositingTex, target, QOpenGLTextureBlitter::OriginBottomLeft);
m_blitter.release();
painter->endNativePainting();
} else
diff --git a/examples/widgets/painting/composition/composition.h b/examples/widgets/painting/composition/composition.h
index b2fa2c5bb1..0745eb41b9 100644
--- a/examples/widgets/painting/composition/composition.h
+++ b/examples/widgets/painting/composition/composition.h
@@ -148,7 +148,6 @@ private:
std::unique_ptr<QFboPaintDevice> m_fbo;
int m_pbuffer_size; // width==height==size of pbuffer
uint m_base_tex;
- uint m_compositing_tex;
QSize m_previous_size;
QOpenGLTextureBlitter m_blitter;
#endif
diff --git a/examples/widgets/painting/shared/fbopaintdevice.cpp b/examples/widgets/painting/shared/fbopaintdevice.cpp
index 305f4f2c2c..5875e6574b 100644
--- a/examples/widgets/painting/shared/fbopaintdevice.cpp
+++ b/examples/widgets/painting/shared/fbopaintdevice.cpp
@@ -24,11 +24,13 @@ QFboPaintDevice::QFboPaintDevice(const QSize &size, bool flipped, bool clearOnIn
context()->functions()->glClearColor(0, 0, 0, 0);
context()->functions()->glClear(GL_COLOR_BUFFER_BIT);
}
+ m_resolvedFbo = new QOpenGLFramebufferObject(m_framebufferObject->size(), m_framebufferObject->attachment());
}
QFboPaintDevice::~QFboPaintDevice()
{
delete m_framebufferObject;
+ delete m_resolvedFbo;
delete m_surface;
}
@@ -40,12 +42,19 @@ void QFboPaintDevice::ensureActiveTarget()
m_framebufferObject->bind();
}
+GLuint QFboPaintDevice::texture()
+{
+ m_resolvedFbo->bind(); // to get the backing texture recreated if it was taken (in takeTexture) previously
+ QOpenGLFramebufferObject::blitFramebuffer(m_resolvedFbo, m_framebufferObject);
+ return m_resolvedFbo->texture();
+}
+
GLuint QFboPaintDevice::takeTexture()
{
- // We have multisamples so we can't just forward takeTexture().
- QOpenGLFramebufferObject resolvedFbo(m_framebufferObject->size(), m_framebufferObject->attachment());
- QOpenGLFramebufferObject::blitFramebuffer(&resolvedFbo, m_framebufferObject);
- return resolvedFbo.takeTexture();
+ m_resolvedFbo->bind(); // to get the backing texture recreated if it was taken (in takeTexture) previously
+ // We have multisamples so we can't just forward takeTexture(), have to resolve first.
+ QOpenGLFramebufferObject::blitFramebuffer(m_resolvedFbo, m_framebufferObject);
+ return m_resolvedFbo->takeTexture();
}
QImage QFboPaintDevice::toImage() const
diff --git a/examples/widgets/painting/shared/fbopaintdevice.h b/examples/widgets/painting/shared/fbopaintdevice.h
index a46166217b..b2e77a228a 100644
--- a/examples/widgets/painting/shared/fbopaintdevice.h
+++ b/examples/widgets/painting/shared/fbopaintdevice.h
@@ -22,6 +22,7 @@ public:
bool isValid() const { return m_framebufferObject->isValid(); }
GLuint handle() const { return m_framebufferObject->handle(); }
+ GLuint texture();
GLuint takeTexture();
QImage toImage() const;
@@ -36,6 +37,7 @@ public:
private:
QOpenGLFramebufferObject *m_framebufferObject;
+ QOpenGLFramebufferObject *m_resolvedFbo;
QSurface *m_surface;
};