From 4342c8d761f0995b3d12732b2fa849624cefc3c4 Mon Sep 17 00:00:00 2001 From: John Preston Date: Mon, 24 Nov 2025 09:58:37 +0400 Subject: [PATCH] Fix Live stories display without OpenGL. --- .../calls/group/calls_group_viewport.cpp | 39 +++++++++++++++---- .../calls/group/calls_group_viewport.h | 4 ++ .../group/calls_group_viewport_raster.cpp | 14 ++++--- .../media/view/media_view_overlay_raster.cpp | 3 ++ .../media/view/media_view_video_stream.cpp | 8 ++-- .../media/view/media_view_video_stream.h | 3 +- 6 files changed, 52 insertions(+), 19 deletions(-) diff --git a/Telegram/SourceFiles/calls/group/calls_group_viewport.cpp b/Telegram/SourceFiles/calls/group/calls_group_viewport.cpp index 2269d8090c..4dded7c580 100644 --- a/Telegram/SourceFiles/calls/group/calls_group_viewport.cpp +++ b/Telegram/SourceFiles/calls/group/calls_group_viewport.cpp @@ -65,14 +65,18 @@ Viewport::Viewport( } Viewport::~Viewport() { - if (_borrowed && _opengl) { - const auto w = static_cast(widget().get()); - w->makeCurrent(); - const auto context = w->context(); - const auto valid = w->isValid() - && context - && (QOpenGLContext::currentContext() == context); - ensureBorrowedCleared(valid ? context->functions() : nullptr); + if (_borrowed) { + if (_opengl) { + const auto w = static_cast(widget().get()); + w->makeCurrent(); + const auto context = w->context(); + const auto valid = w->isValid() + && context + && (QOpenGLContext::currentContext() == context); + ensureBorrowedCleared(valid ? context->functions() : nullptr); + } else { + ensureBorrowedCleared(); + } } } @@ -925,6 +929,7 @@ rpl::producer Viewport::mouseInsideValue() const { void Viewport::ensureBorrowedRenderer(QOpenGLFunctions &f) { Expects(_borrowed != nullptr); + Expects(_opengl); if (_borrowedRenderer) { return; @@ -935,6 +940,7 @@ void Viewport::ensureBorrowedRenderer(QOpenGLFunctions &f) { void Viewport::ensureBorrowedCleared(QOpenGLFunctions *f) { Expects(_borrowed != nullptr); + Expects(_opengl); if (const auto renderer = base::take(_borrowedRenderer)) { renderer->deinit(f); @@ -948,6 +954,23 @@ void Viewport::borrowedPaint(QOpenGLFunctions &f) { _borrowedRenderer->paint(static_cast(widget().get()), f); } +void Viewport::ensureBorrowedRenderer() { + Expects(_borrowed != nullptr); + Expects(!_opengl); + + if (_borrowedRenderer) { + return; + } + _borrowedRenderer = makeRenderer(); +} + +void Viewport::ensureBorrowedCleared() { + Expects(_borrowed != nullptr); + Expects(!_opengl); + + base::take(_borrowedRenderer); +} + void Viewport::borrowedPaint(Painter &p, const QRegion &clip) { Expects(_borrowedRenderer != nullptr); Expects(!_opengl); diff --git a/Telegram/SourceFiles/calls/group/calls_group_viewport.h b/Telegram/SourceFiles/calls/group/calls_group_viewport.h index 085f98458f..7024c164be 100644 --- a/Telegram/SourceFiles/calls/group/calls_group_viewport.h +++ b/Telegram/SourceFiles/calls/group/calls_group_viewport.h @@ -103,7 +103,11 @@ public: void ensureBorrowedRenderer(QOpenGLFunctions &f); void ensureBorrowedCleared(QOpenGLFunctions *f); void borrowedPaint(QOpenGLFunctions &f); + + void ensureBorrowedRenderer(); + void ensureBorrowedCleared(); void borrowedPaint(Painter &p, const QRegion &clip); + [[nodiscard]] QPoint borrowedOrigin() const; [[nodiscard]] rpl::lifetime &lifetime(); diff --git a/Telegram/SourceFiles/calls/group/calls_group_viewport_raster.cpp b/Telegram/SourceFiles/calls/group/calls_group_viewport_raster.cpp index 3743117336..4809d6dfe8 100644 --- a/Telegram/SourceFiles/calls/group/calls_group_viewport_raster.cpp +++ b/Telegram/SourceFiles/calls/group/calls_group_viewport_raster.cpp @@ -52,12 +52,14 @@ void Viewport::RendererSW::paintFallback( } paintTile(p, tile.get(), bounding, bg); } - const auto fullscreen = _owner->_fullscreen; - const auto color = fullscreen - ? QColor(0, 0, 0) - : st::groupCallBg->c; - for (const auto &rect : bg) { - p.fillRect(rect, color); + if (_owner->borrowedOrigin().isNull()) { + const auto fullscreen = _owner->_fullscreen; + const auto color = fullscreen + ? QColor(0, 0, 0) + : st::groupCallBg->c; + for (const auto &rect : bg) { + p.fillRect(rect, color); + } } for (auto i = _tileData.begin(); i != _tileData.end();) { if (i->second.stale) { diff --git a/Telegram/SourceFiles/media/view/media_view_overlay_raster.cpp b/Telegram/SourceFiles/media/view/media_view_overlay_raster.cpp index a667932aa9..3d2e668431 100644 --- a/Telegram/SourceFiles/media/view/media_view_overlay_raster.cpp +++ b/Telegram/SourceFiles/media/view/media_view_overlay_raster.cpp @@ -36,6 +36,9 @@ void OverlayWidget::RendererSW::paintFallback( p.fillRect(clip.boundingRect(), Qt::transparent); return; } + if (const auto stream = _owner->_videoStream.get()) { + stream->ensureBorrowedRenderer(); + } _p = &p; _clip = &clip; _clipOuter = clip.boundingRect(); diff --git a/Telegram/SourceFiles/media/view/media_view_video_stream.cpp b/Telegram/SourceFiles/media/view/media_view_video_stream.cpp index 09d56da697..1b6567b584 100644 --- a/Telegram/SourceFiles/media/view/media_view_video_stream.cpp +++ b/Telegram/SourceFiles/media/view/media_view_video_stream.cpp @@ -272,14 +272,14 @@ void VideoStream::ensureBorrowedRenderer(QOpenGLFunctions &f) { _viewport->ensureBorrowedRenderer(f); } -void VideoStream::ensureBorrowedCleared(QOpenGLFunctions *f) { - _viewport->ensureBorrowedCleared(f); -} - void VideoStream::borrowedPaint(QOpenGLFunctions &f) { _viewport->borrowedPaint(f); } +void VideoStream::ensureBorrowedRenderer() { + _viewport->ensureBorrowedRenderer(); +} + void VideoStream::borrowedPaint(Painter &p, const QRegion &clip) { _viewport->borrowedPaint(p, clip); } diff --git a/Telegram/SourceFiles/media/view/media_view_video_stream.h b/Telegram/SourceFiles/media/view/media_view_video_stream.h index d4ff64c1ae..af672d8b71 100644 --- a/Telegram/SourceFiles/media/view/media_view_video_stream.h +++ b/Telegram/SourceFiles/media/view/media_view_video_stream.h @@ -63,8 +63,9 @@ public: void toggleCommentsOn(rpl::producer shown); void ensureBorrowedRenderer(QOpenGLFunctions &f); - void ensureBorrowedCleared(QOpenGLFunctions *f); void borrowedPaint(QOpenGLFunctions &f); + + void ensureBorrowedRenderer(); void borrowedPaint(Painter &p, const QRegion &clip); [[nodiscard]] rpl::lifetime &lifetime();