From 919664b29a874e8cdc3d74427654cbaa2b61be29 Mon Sep 17 00:00:00 2001 From: Laszlo Agocs Date: Thu, 1 Dec 2022 15:40:58 +0100 Subject: Avoid continuous texture alloc in Composition Modes example MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit There seems to be some confusion from back when the example were mass-ported to the QOpenGL stuff in Qt 5 times. Pick-to: 6.4 6.2 Fixes: QTBUG-109119 Change-Id: Ic4bcd010df3fcf82e16385ce241b379f0c351788 Reviewed-by: Christian Strømme --- examples/widgets/painting/composition/composition.cpp | 10 +++++++--- examples/widgets/painting/composition/composition.h | 1 - examples/widgets/painting/shared/fbopaintdevice.cpp | 17 +++++++++++++---- examples/widgets/painting/shared/fbopaintdevice.h | 2 ++ 4 files changed, 22 insertions(+), 8 deletions(-) (limited to 'examples') 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 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; }; -- cgit v1.2.1