From c5a46d9d1b2ef6640f91c10aacbe68fb3c39c499 Mon Sep 17 00:00:00 2001 From: John Preston Date: Tue, 8 Jun 2021 15:51:52 +0400 Subject: [PATCH] For surface with parent backend should be fixed. --- Telegram/SourceFiles/calls/calls_panel.cpp | 46 ++++++++++++------- Telegram/SourceFiles/calls/calls_panel.h | 8 ++-- .../calls/group/calls_group_members.cpp | 6 ++- .../calls/group/calls_group_members.h | 6 ++- .../calls/group/calls_group_panel.cpp | 27 +++++++++-- .../calls/group/calls_group_panel.h | 5 ++ .../calls/group/calls_group_viewport.cpp | 36 +++++---------- .../calls/group/calls_group_viewport.h | 8 +++- .../media/view/media_view_overlay_widget.cpp | 1 - .../SourceFiles/media/view/media_view_pip.cpp | 1 - Telegram/lib_ui | 2 +- 11 files changed, 91 insertions(+), 55 deletions(-) diff --git a/Telegram/SourceFiles/calls/calls_panel.cpp b/Telegram/SourceFiles/calls/calls_panel.cpp index 343d520660..fdb7211ca2 100644 --- a/Telegram/SourceFiles/calls/calls_panel.cpp +++ b/Telegram/SourceFiles/calls/calls_panel.cpp @@ -56,7 +56,8 @@ class Panel::Incoming final { public: Incoming( not_null parent, - not_null track); + not_null track, + Ui::GL::Backend backend); [[nodiscard]] not_null widget() const; [[nodiscard]] not_null rp() const; @@ -69,7 +70,7 @@ private: void fillBottomShadow(QPainter &p); [[nodiscard]] Ui::GL::ChosenRenderer chooseRenderer( - Ui::GL::Capabilities capabilities); + Ui::GL::Backend backend); const std::unique_ptr _surface; const not_null _track; @@ -79,12 +80,9 @@ private: Panel::Incoming::Incoming( not_null parent, - not_null track) -: _surface(Ui::GL::CreateSurface( - parent, - [=](Ui::GL::Capabilities capabilities) { - return chooseRenderer(capabilities); - })) + not_null track, + Ui::GL::Backend backend) +: _surface(Ui::GL::CreateSurface(parent, chooseRenderer(backend))) , _track(track) { initBottomShadow(); widget()->setAttribute(Qt::WA_OpaquePaintEvent); @@ -100,7 +98,7 @@ not_null Panel::Incoming::rp() const { } Ui::GL::ChosenRenderer Panel::Incoming::chooseRenderer( - Ui::GL::Capabilities capabilities) { + Ui::GL::Backend backend) { class Renderer : public Ui::GL::Renderer { public: Renderer(not_null owner) : _owner(owner) { @@ -121,15 +119,9 @@ Ui::GL::ChosenRenderer Panel::Incoming::chooseRenderer( }; - const auto use = Platform::IsMac() - ? true - : Platform::IsWindows() - ? capabilities.supported - : capabilities.transparency; - LOG(("OpenGL: %1 (Incoming)").arg(Logs::b(use))); return { .renderer = std::make_unique(this), - .backend = (use ? Ui::GL::Backend::OpenGL : Ui::GL::Backend::Raster), + .backend = backend, }; } @@ -258,6 +250,25 @@ Panel::Panel(not_null call) Panel::~Panel() = default; +std::unique_ptr Panel::createWindow() { + auto result = std::make_unique(); + const auto capabilities = Ui::GL::CheckCapabilities(result.get()); + const auto use = Platform::IsMac() + ? true + : Platform::IsWindows() + ? capabilities.supported + : capabilities.transparency; + LOG(("OpenGL: %1 (Incoming)").arg(Logs::b(use))); + _backend = use ? Ui::GL::Backend::OpenGL : Ui::GL::Backend::Raster; + + if (use) { + return result; + } + + // We have to create a new window, if OpenGL initialization failed. + return std::make_unique(); +} + bool Panel::isActive() const { return _window->isActiveWindow() && _window->isVisible() @@ -491,7 +502,8 @@ void Panel::reinitWithCall(Call *call) { _call->videoOutgoing()); _incoming = std::make_unique( widget(), - _call->videoIncoming()); + _call->videoIncoming(), + _backend); _incoming->widget()->hide(); _call->mutedValue( diff --git a/Telegram/SourceFiles/calls/calls_panel.h b/Telegram/SourceFiles/calls/calls_panel.h index 4c6e13b819..f6d378ccad 100644 --- a/Telegram/SourceFiles/calls/calls_panel.h +++ b/Telegram/SourceFiles/calls/calls_panel.h @@ -30,6 +30,9 @@ class FadeWrap; template class PaddingWrap; class Window; +namespace GL { +enum class Backend; +} // namespace GL namespace Platform { class TitleControls; } // namespace Platform @@ -67,6 +70,7 @@ private: Redial, }; + std::unique_ptr createWindow(); [[nodiscard]] not_null widget() const; void paint(QRect clip); @@ -80,9 +84,6 @@ private: void handleClose(); - QRect signalBarsRect() const; - void paintSignalBarsBg(Painter &p); - void updateControlsGeometry(); void updateHangupGeometry(); void updateStatusGeometry(); @@ -105,6 +106,7 @@ private: Call *_call = nullptr; not_null _user; + Ui::GL::Backend _backend = Ui::GL::Backend(); const std::unique_ptr _window; std::unique_ptr _incoming; diff --git a/Telegram/SourceFiles/calls/group/calls_group_members.cpp b/Telegram/SourceFiles/calls/group/calls_group_members.cpp index 49b5aa0052..7fa12fa57c 100644 --- a/Telegram/SourceFiles/calls/group/calls_group_members.cpp +++ b/Telegram/SourceFiles/calls/group/calls_group_members.cpp @@ -1461,7 +1461,8 @@ std::unique_ptr Members::Controller::createInvitedRow( Members::Members( not_null parent, not_null call, - PanelMode mode) + PanelMode mode, + Ui::GL::Backend backend) : RpWidget(parent) , _call(call) , _mode(mode) @@ -1473,7 +1474,8 @@ Members::Members( , _viewport( std::make_unique( _videoWrap.get(), - PanelMode::Default)) { + PanelMode::Default, + backend)) { setupList(); setupAddMember(call); setContent(_list); diff --git a/Telegram/SourceFiles/calls/group/calls_group_members.h b/Telegram/SourceFiles/calls/group/calls_group_members.h index c6c7d3f55a..f828d79105 100644 --- a/Telegram/SourceFiles/calls/group/calls_group_members.h +++ b/Telegram/SourceFiles/calls/group/calls_group_members.h @@ -14,6 +14,9 @@ class RpWidget; class ScrollArea; class VerticalLayout; class SettingsButton; +namespace GL { +enum class Backend; +} // namespace GL } // namespace Ui namespace Data { @@ -39,7 +42,8 @@ public: Members( not_null parent, not_null call, - PanelMode mode); + PanelMode mode, + Ui::GL::Backend backend); ~Members(); [[nodiscard]] not_null viewport() const; diff --git a/Telegram/SourceFiles/calls/group/calls_group_panel.cpp b/Telegram/SourceFiles/calls/group/calls_group_panel.cpp index 2672a2e24c..3974850b2a 100644 --- a/Telegram/SourceFiles/calls/group/calls_group_panel.cpp +++ b/Telegram/SourceFiles/calls/group/calls_group_panel.cpp @@ -26,6 +26,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "ui/widgets/dropdown_menu.h" #include "ui/widgets/input_fields.h" #include "ui/widgets/tooltip.h" +#include "ui/gl/gl_detection.h" #include "ui/chat/group_call_bar.h" #include "ui/layers/layer_manager.h" #include "ui/layers/generic_box.h" @@ -46,6 +47,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "main/main_session.h" #include "base/event_filter.h" #include "base/unixtime.h" +#include "base/platform/base_platform_info.h" #include "base/qt_signal_producer.h" #include "base/timer_rpl.h" #include "app.h" @@ -85,14 +87,14 @@ struct Panel::ControlsBackgroundNarrow { Panel::Panel(not_null call) : _call(call) , _peer(call->peer()) -, _window(std::make_unique()) +, _window(createWindow()) , _layerBg(std::make_unique(_window->body())) #ifndef Q_OS_MAC , _controls(std::make_unique( _window->body(), st::groupCallTitle)) #endif // !Q_OS_MAC -, _viewport(std::make_unique(widget(), PanelMode::Wide)) +, _viewport(std::make_unique(widget(), PanelMode::Wide, _backend)) , _mute(std::make_unique( widget(), st::callMuteButton, @@ -137,6 +139,25 @@ Panel::~Panel() { _viewport = nullptr; } +std::unique_ptr Panel::createWindow() { + auto result = std::make_unique(); + const auto capabilities = Ui::GL::CheckCapabilities(result.get()); + const auto use = Platform::IsMac() + ? true + : Platform::IsWindows() + ? capabilities.supported + : capabilities.transparency; + LOG(("OpenGL: %1 (Calls::Group::Viewport)").arg(Logs::b(use))); + _backend = use ? Ui::GL::Backend::OpenGL : Ui::GL::Backend::Raster; + + if (use) { + return result; + } + + // We have to create a new window, if OpenGL initialization failed. + return std::make_unique(); +} + void Panel::setupRealCallViewers() { _call->real( ) | rpl::start_with_next([=](not_null real) { @@ -679,7 +700,7 @@ void Panel::setupMembers() { _countdown.destroy(); _startsWhen.destroy(); - _members.create(widget(), _call, mode()); + _members.create(widget(), _call, mode(), _backend); setupVideo(_viewport.get()); setupVideo(_members->viewport()); diff --git a/Telegram/SourceFiles/calls/group/calls_group_panel.h b/Telegram/SourceFiles/calls/group/calls_group_panel.h index 2ba1a608b7..1ef0359095 100644 --- a/Telegram/SourceFiles/calls/group/calls_group_panel.h +++ b/Telegram/SourceFiles/calls/group/calls_group_panel.h @@ -42,6 +42,9 @@ class ScrollArea; class GenericBox; class LayerManager; class GroupCallScheduledLeft; +namespace GL { +enum class Backend; +} // namespace GL namespace Toast { class Instance; } // namespace Toast @@ -81,6 +84,7 @@ private: using State = GroupCall::State; struct ControlsBackgroundNarrow; + std::unique_ptr createWindow(); [[nodiscard]] not_null widget() const; [[nodiscard]] PanelMode mode() const; @@ -151,6 +155,7 @@ private: const not_null _call; not_null _peer; + Ui::GL::Backend _backend = Ui::GL::Backend(); const std::unique_ptr _window; const std::unique_ptr _layerBg; rpl::variable _mode; diff --git a/Telegram/SourceFiles/calls/group/calls_group_viewport.cpp b/Telegram/SourceFiles/calls/group/calls_group_viewport.cpp index c2df3f7110..ce09d47dd1 100644 --- a/Telegram/SourceFiles/calls/group/calls_group_viewport.cpp +++ b/Telegram/SourceFiles/calls/group/calls_group_viewport.cpp @@ -47,13 +47,12 @@ namespace { } // namespace -Viewport::Viewport(not_null parent, PanelMode mode) +Viewport::Viewport( + not_null parent, + PanelMode mode, + Ui::GL::Backend backend) : _mode(mode) -, _content(Ui::GL::CreateSurface( - parent, - [=](Ui::GL::Capabilities capabilities) { - return chooseRenderer(capabilities); - })) { +, _content(Ui::GL::CreateSurface(parent, chooseRenderer(backend))) { setup(); } @@ -796,25 +795,14 @@ void Viewport::setPressed(Selection value) { _pressed = value; } -Ui::GL::ChosenRenderer Viewport::chooseRenderer( - Ui::GL::Capabilities capabilities) { - const auto use = Platform::IsMac() - ? true - : Platform::IsWindows() - ? capabilities.supported - : capabilities.transparency; - LOG(("OpenGL: %1 (Calls::Group::Viewport)").arg(Logs::b(use))); - if (use) { - auto renderer = std::make_unique(this); - _opengl = true; - return { - .renderer = std::move(renderer), - .backend = Ui::GL::Backend::OpenGL, - }; - } +Ui::GL::ChosenRenderer Viewport::chooseRenderer(Ui::GL::Backend backend) { + _opengl = (backend == Ui::GL::Backend::OpenGL); return { - .renderer = std::make_unique(this), - .backend = Ui::GL::Backend::Raster, + .renderer = (_opengl + ? std::unique_ptr( + std::make_unique(this)) + : std::make_unique(this)), + .backend = backend, }; } diff --git a/Telegram/SourceFiles/calls/group/calls_group_viewport.h b/Telegram/SourceFiles/calls/group/calls_group_viewport.h index 3d15bf1beb..b7c8c80803 100644 --- a/Telegram/SourceFiles/calls/group/calls_group_viewport.h +++ b/Telegram/SourceFiles/calls/group/calls_group_viewport.h @@ -14,6 +14,7 @@ namespace Ui { class AbstractButton; class RpWidgetWrap; namespace GL { +enum class Backend; struct Capabilities; struct ChosenRenderer; } // namespace GL @@ -58,7 +59,10 @@ struct VideoTileTrack { class Viewport final { public: - Viewport(not_null parent, PanelMode mode); + Viewport( + not_null parent, + PanelMode mode, + Ui::GL::Backend backend); ~Viewport(); [[nodiscard]] not_null widget() const; @@ -159,7 +163,7 @@ private: void updateSelected(); [[nodiscard]] Ui::GL::ChosenRenderer chooseRenderer( - Ui::GL::Capabilities capabilities); + Ui::GL::Backend backend); PanelMode _mode = PanelMode(); bool _opengl = false; diff --git a/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp b/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp index 4ba714e5b6..e7d59d4df3 100644 --- a/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp +++ b/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp @@ -289,7 +289,6 @@ OverlayWidget::PipWrap::PipWrap( OverlayWidget::OverlayWidget() : _surface(Ui::GL::CreateSurface( - nullptr, // No parent for the window in Qt parent-child sense. [=](Ui::GL::Capabilities capabilities) { return chooseRenderer(capabilities); })) diff --git a/Telegram/SourceFiles/media/view/media_view_pip.cpp b/Telegram/SourceFiles/media/view/media_view_pip.cpp index de19cb887d..3759be411b 100644 --- a/Telegram/SourceFiles/media/view/media_view_pip.cpp +++ b/Telegram/SourceFiles/media/view/media_view_pip.cpp @@ -375,7 +375,6 @@ PipPanel::PipPanel( QWidget *parent, Fn paint) : _content(Ui::GL::CreateSurface( - nullptr, // No parent for the window in Qt parent-child sense. [=](Ui::GL::Capabilities capabilities) { return chooseRenderer(capabilities); })) diff --git a/Telegram/lib_ui b/Telegram/lib_ui index cbb65009ff..7bc9e12614 160000 --- a/Telegram/lib_ui +++ b/Telegram/lib_ui @@ -1 +1 @@ -Subproject commit cbb65009ffc443bc88137f2758228c1b185d8d20 +Subproject commit 7bc9e1261498af07475f4bac0d8bcd8721202177