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*/