From c12a50544eb296f054ccad1e92309f9843a4ee4c Mon Sep 17 00:00:00 2001 From: John Preston Date: Thu, 20 May 2021 16:07:53 +0400 Subject: [PATCH] Allow force-disabling OpenGL. --- Telegram/Resources/langs/lang.strings | 1 + Telegram/SourceFiles/core/core_settings.cpp | 10 ++++++ Telegram/SourceFiles/core/core_settings.h | 8 +++++ .../settings/settings_advanced.cpp | 35 +++++++++++++++++++ Telegram/lib_ui | 2 +- 5 files changed, 55 insertions(+), 1 deletion(-) diff --git a/Telegram/Resources/langs/lang.strings b/Telegram/Resources/langs/lang.strings index 581c36a0dd..104f4143b3 100644 --- a/Telegram/Resources/langs/lang.strings +++ b/Telegram/Resources/langs/lang.strings @@ -451,6 +451,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_settings_system_integration" = "System integration"; "lng_settings_performance" = "Performance"; "lng_settings_enable_animations" = "Enable animations"; +"lng_settings_enable_opengl" = "Enable OpenGL rendering for video"; "lng_settings_sensitive_title" = "Sensitive content"; "lng_settings_sensitive_disable_filtering" = "Disable filtering"; "lng_settings_sensitive_about" = "Display sensitive media in public channels on all your Telegram devices."; diff --git a/Telegram/SourceFiles/core/core_settings.cpp b/Telegram/SourceFiles/core/core_settings.cpp index b90da59175..ff75ef189c 100644 --- a/Telegram/SourceFiles/core/core_settings.cpp +++ b/Telegram/SourceFiles/core/core_settings.cpp @@ -14,6 +14,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "window/section_widget.h" #include "base/platform/base_platform_info.h" #include "webrtc/webrtc_create_adm.h" +#include "ui/gl/gl_detection.h" #include "facades.h" namespace Core { @@ -194,6 +195,7 @@ QByteArray Settings::serialize() const { for (const auto &[id, variant] : _emojiVariants) { stream << id << quint8(variant); } + stream << qint32(_disableOpenGL ? 1 : 0); } return result; } @@ -269,6 +271,7 @@ void Settings::addFromSerialized(const QByteArray &serialized) { QByteArray windowPosition; std::vector recentEmojiPreload; base::flat_map emojiVariants; + qint32 disableOpenGL = _disableOpenGL ? 1 : 0; stream >> themesAccentColors; if (!stream.atEnd()) { @@ -397,6 +400,9 @@ void Settings::addFromSerialized(const QByteArray &serialized) { } } } + if (!stream.atEnd()) { + stream >> disableOpenGL; + } if (stream.status() != QDataStream::Ok) { LOG(("App Error: " "Bad data for Core::Settings::constructFromSerialized()")); @@ -502,6 +508,10 @@ void Settings::addFromSerialized(const QByteArray &serialized) { } _recentEmojiPreload = std::move(recentEmojiPreload); _emojiVariants = std::move(emojiVariants); + _disableOpenGL = (disableOpenGL == 1); + if (!Platform::IsMac()) { + Ui::GL::ForceDisable(_disableOpenGL); + } } bool Settings::chatWide() const { diff --git a/Telegram/SourceFiles/core/core_settings.h b/Telegram/SourceFiles/core/core_settings.h index 963e64068b..3c0edd409a 100644 --- a/Telegram/SourceFiles/core/core_settings.h +++ b/Telegram/SourceFiles/core/core_settings.h @@ -532,6 +532,13 @@ public: void saveEmojiVariant(EmojiPtr emoji); void setLegacyEmojiVariants(QMap data); + [[nodiscard]] bool disableOpenGL() const { + return _disableOpenGL; + } + void setDisableOpenGL(bool value) { + _disableOpenGL = value; + } + [[nodiscard]] static bool ThirdColumnByDefault(); [[nodiscard]] static float64 DefaultDialogsWidthRatio(); [[nodiscard]] static qint32 SerializePlaybackSpeed(float64 speed) { @@ -624,6 +631,7 @@ private: rpl::variable> _systemDarkMode = std::nullopt; rpl::variable _systemDarkModeEnabled = false; WindowPosition _windowPosition; // per-window + bool _disableOpenGL = false; bool _tabbedReplacedWithInfo = false; // per-window rpl::event_stream _tabbedReplacedWithInfoValue; // per-window diff --git a/Telegram/SourceFiles/settings/settings_advanced.cpp b/Telegram/SourceFiles/settings/settings_advanced.cpp index b9c1f71057..9fabbcfaec 100644 --- a/Telegram/SourceFiles/settings/settings_advanced.cpp +++ b/Telegram/SourceFiles/settings/settings_advanced.cpp @@ -502,10 +502,45 @@ void SetupAnimations(not_null container) { }, container->lifetime()); } +void SetupOpenGL(not_null container) { + const auto toggles = container->lifetime().make_state< + rpl::event_stream + >(); + const auto button = AddButton( + container, + tr::lng_settings_enable_opengl(), + st::settingsButton + )->toggleOn( + toggles->events_starting_with_copy( + !Core::App().settings().disableOpenGL()) + ); + button->toggledValue( + ) | rpl::filter([](bool enabled) { + return (enabled == Core::App().settings().disableOpenGL()); + }) | rpl::start_with_next([=](bool enabled) { + const auto confirmed = crl::guard(button, [=] { + Core::App().settings().setDisableOpenGL(!enabled); + Local::writeSettings(); + App::restart(); + }); + const auto cancelled = crl::guard(button, [=] { + toggles->fire(!enabled); + }); + Ui::show(Box( + tr::lng_settings_need_restart(tr::now), + tr::lng_settings_restart_now(tr::now), + confirmed, + cancelled)); + }, container->lifetime()); +} + void SetupPerformance( not_null controller, not_null container) { SetupAnimations(container); + if (!Platform::IsMac()) { + SetupOpenGL(container); + } } void SetupSystemIntegration( diff --git a/Telegram/lib_ui b/Telegram/lib_ui index ca5b2e6746..5e38964fbf 160000 --- a/Telegram/lib_ui +++ b/Telegram/lib_ui @@ -1 +1 @@ -Subproject commit ca5b2e6746447e39fc1e7deb1fa97e28d518bc7f +Subproject commit 5e38964fbfed38efdcf5c1628ca65d7e3469764a