From 7478c81a48d18fb0bb088cb47ab6bd1c87f9c3dc Mon Sep 17 00:00:00 2001 From: Vlad Zahorodnii Date: Mon, 23 Oct 2023 19:41:42 +0300 Subject: [PATCH] libkwineffects: Add alpha channel option in OffscreenQuickView We want some quick views to be opaque, for example SceneEffect views. This changes adds an api allowing to specify whether the given OffscreenQuickView must be opaque or translucent. --- src/effects.cpp | 13 ++++++++--- src/libkwineffects/kwinoffscreenquickview.cpp | 23 +++++++++++++++---- src/libkwineffects/kwinoffscreenquickview.h | 8 ++++--- 3 files changed, 34 insertions(+), 10 deletions(-) diff --git a/src/effects.cpp b/src/effects.cpp index f6dbbcbb90..557b7c7c26 100644 --- a/src/effects.cpp +++ b/src/effects.cpp @@ -1497,10 +1497,17 @@ void EffectsHandlerImpl::renderOffscreenQuickView(const RenderTarget &renderTarg } shader->setColorspaceUniformsFromSRGB(renderTarget.colorDescription()); - glEnable(GL_BLEND); - glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); + const bool alphaBlending = w->hasAlphaChannel() || (a != 1.0); + if (alphaBlending) { + glEnable(GL_BLEND); + glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); + } + t->render(w->size(), viewport.scale()); - glDisable(GL_BLEND); + + if (alphaBlending) { + glDisable(GL_BLEND); + } ShaderManager::instance()->popShader(); } else if (compositingType() == QPainterCompositing) { diff --git a/src/libkwineffects/kwinoffscreenquickview.cpp b/src/libkwineffects/kwinoffscreenquickview.cpp index 3633fbf910..c4a4b97d8c 100644 --- a/src/libkwineffects/kwinoffscreenquickview.cpp +++ b/src/libkwineffects/kwinoffscreenquickview.cpp @@ -49,6 +49,7 @@ public: // Used for either software QtQuick rendering and nonGL kwin rendering bool m_useBlit = false; bool m_visible = true; + bool m_hasAlphaChannel = true; bool m_automaticRepaint = true; QList touchPoints; @@ -73,7 +74,7 @@ public: std::unique_ptr quickItem; }; -OffscreenQuickView::OffscreenQuickView(ExportMode exportMode) +OffscreenQuickView::OffscreenQuickView(ExportMode exportMode, bool alpha) : d(new OffscreenQuickView::Private) { d->m_renderControl = std::make_unique(); @@ -83,6 +84,7 @@ OffscreenQuickView::OffscreenQuickView(ExportMode exportMode) d->m_view->setFlags(Qt::FramelessWindowHint); d->m_view->setColor(Qt::transparent); + d->m_hasAlphaChannel = alpha; if (exportMode == ExportMode::Image) { d->m_useBlit = true; } @@ -98,6 +100,9 @@ OffscreenQuickView::OffscreenQuickView(ExportMode exportMode) format.setOption(QSurfaceFormat::ResetNotification); format.setDepthBufferSize(16); format.setStencilBufferSize(8); + if (alpha) { + format.setAlphaBufferSize(8); + } d->m_view->setFormat(format); @@ -211,7 +216,12 @@ void OffscreenQuickView::update() const QSize nativeSize = d->m_view->size() * d->m_view->effectiveDevicePixelRatio(); if (!d->m_fbo || d->m_fbo->size() != nativeSize) { d->m_textureExport.reset(nullptr); - d->m_fbo = std::make_unique(nativeSize, QOpenGLFramebufferObject::CombinedDepthStencil); + + QOpenGLFramebufferObjectFormat fboFormat; + fboFormat.setAttachment(QOpenGLFramebufferObject::CombinedDepthStencil); + fboFormat.setInternalTextureFormat(d->m_hasAlphaChannel ? GL_RGBA8 : GL_RGB8); + + d->m_fbo = std::make_unique(nativeSize, fboFormat); if (!d->m_fbo->isValid()) { d->m_fbo.reset(); d->m_glcontext->doneCurrent(); @@ -361,6 +371,11 @@ qreal OffscreenQuickView::opacity() const return d->m_view->opacity(); } +bool OffscreenQuickView::hasAlphaChannel() const +{ + return d->m_hasAlphaChannel; +} + QQuickItem *OffscreenQuickView::contentItem() const { return d->m_view->contentItem(); @@ -514,8 +529,8 @@ void OffscreenQuickView::Private::updateTouchState(Qt::TouchPointState state, qi } } -OffscreenQuickScene::OffscreenQuickScene(OffscreenQuickView::ExportMode exportMode) - : OffscreenQuickView(exportMode) +OffscreenQuickScene::OffscreenQuickScene(OffscreenQuickView::ExportMode exportMode, bool alpha) + : OffscreenQuickView(exportMode, alpha) , d(new OffscreenQuickScene::Private) { } diff --git a/src/libkwineffects/kwinoffscreenquickview.h b/src/libkwineffects/kwinoffscreenquickview.h index cfc47bae3f..bc6e55d081 100644 --- a/src/libkwineffects/kwinoffscreenquickview.h +++ b/src/libkwineffects/kwinoffscreenquickview.h @@ -55,9 +55,10 @@ public: }; /** - * Construct a new KWinQuickView explicitly stating an export mode + * Construct a new KWinQuickView explicitly stating an export mode. \a alpha indicates + * whether the view is translucent or not. */ - explicit OffscreenQuickView(ExportMode exportMode = ExportMode::Texture); + explicit OffscreenQuickView(ExportMode exportMode = ExportMode::Texture, bool alpha = true); /** * Note that this may change the current GL Context @@ -75,6 +76,7 @@ public: void setOpacity(qreal opacity); qreal opacity() const; + bool hasAlphaChannel() const; /** * Render the current scene graph into the FBO. @@ -156,7 +158,7 @@ private: class KWIN_EXPORT OffscreenQuickScene : public OffscreenQuickView { public: - explicit OffscreenQuickScene(ExportMode exportMode = ExportMode::Texture); + explicit OffscreenQuickScene(ExportMode exportMode = ExportMode::Texture, bool alpha = true); ~OffscreenQuickScene(); /** top level item in the given source*/