MythTV master
mythvrr.cpp
Go to the documentation of this file.
1// libmythbase
2#include "libmythbase/mythconfig.h"
4
5// libmythui
6#include "mythvrr.h"
7#if CONFIG_DRM
10#endif
11#if CONFIG_X11
13#endif
14#include "mythdisplay.h"
15
16// Qt
17#include <QObject>
18
19#define LOC QString("VRR: ")
20
46MythVRR::MythVRR(bool Controllable, VRRType Type, bool Enabled, MythVRRRange Range)
47 : m_controllable(Controllable),
48 m_type(Type),
49 m_enabled(Enabled),
50 m_range(std::move(Range))
51{
52}
53
57{
58 if (!MDisplay)
59 return nullptr;
60
61 MythVRRPtr result = nullptr;
62
63#if CONFIG_X11 || CONFIG_DRM
64 const auto range = MDisplay->GetEDID().GetVRRRange();
65
66#if CONFIG_X11
67 // GSync is only available with X11 over Display Port
68 if (result == nullptr)
69 result = MythGSync::CreateGSync(range);
70#endif
71
72#if CONFIG_DRM
73 // FreeSync is only currently *controllable* via DRM with an AMD GPU/APU and Display Port
74 if (!result)
75 {
76 if (auto * display = dynamic_cast<MythDisplayDRM*>(MDisplay); display && display->GetDevice())
77 if (auto freesync = MythDRMVRR::CreateFreeSync(display->GetDevice(), range); freesync)
78 result = freesync;
79 }
80
81 // If we don't have support for controlling FreeSync then DRM may still be able to
82 // tell us if it is available/enabled - which is still useful
83 if (!result)
84 {
85 if (auto drm = MythDRMDevice::Create(MDisplay->GetCurrentScreen(), DRM_QUIET); drm)
86 if (auto freesync = MythDRMVRR::CreateFreeSync(drm, range); freesync)
87 result = freesync;
88 }
89#endif
90#endif
91
92 if (!result)
93 {
94 LOG(VB_GENERAL, LOG_INFO, LOC + "No variable refresh rate support detected");
95 }
96 else
97 {
98 LOG(VB_GENERAL, LOG_INFO, LOC + QString("VRR type '%1': Enabled: %2 Controllable: %3 %4")
99 .arg(result->TypeToString()).arg(result->Enabled()).arg(result->IsControllable())
100 .arg(result->RangeDescription()));
101 }
102 return result;
103}
104
106{
107 return m_enabled;
108}
109
111{
112 return m_range;
113}
114
116{
117 return m_controllable;
118}
119
121{
122 switch (m_type)
123 {
124 case FreeSync: return QObject::tr("FreeSync");
125 case GSync: return QObject::tr("GSync");
126 case GSyncCompat: return QObject::tr("GSync Compatible");
127 default: break;
128 }
129 return QObject::tr("None");
130}
131
133{
134 if (std::get<0>(m_range) > 0 && std::get<1>(m_range) > 0)
135 {
136 return QObject::tr("Range: %1-%2%3")
137 .arg(std::get<0>(m_range)).arg(std::get<1>(m_range))
138 .arg(std::get<2>(m_range) ? "" : " (Estimated)");
139 }
140 return {};
141}
142
static MythDRMPtr Create(QScreen *qScreen, const QString &Device=QString(), bool NeedPlanes=true)
Create a MythDRMDevice instance.
static MythVRRPtr CreateFreeSync(const MythDRMPtr &Device, MythVRRRange Range)
Definition: mythdrmvrr.cpp:58
MythDRMPtr GetDevice()
MythEDID & GetEDID()
QScreen * GetCurrentScreen()
Return a pointer to the screen to use.
MythVRRRange GetVRRRange() const
Return the range of supported refresh rates.
Definition: mythedid.cpp:113
static MythVRRPtr CreateGSync(MythVRRRange Range)
MythVRRRange m_range
Definition: mythvrr.h:41
bool m_enabled
Definition: mythvrr.h:40
MythVRR(bool Controllable, VRRType Type, bool Enabled, MythVRRRange Range)
Definition: mythvrr.cpp:46
VRRType
Definition: mythvrr.h:19
@ FreeSync
Definition: mythvrr.h:21
@ GSyncCompat
Definition: mythvrr.h:23
@ GSync
Definition: mythvrr.h:22
MythVRRRange GetRange() const
Definition: mythvrr.cpp:110
bool Enabled() const
Definition: mythvrr.cpp:105
static MythVRRPtr Create(class MythDisplay *MDisplay)
Create a concrete implementation of MythVRR suitable for the given Display.
Definition: mythvrr.cpp:56
bool m_controllable
Definition: mythvrr.h:38
QString RangeDescription() const
Definition: mythvrr.cpp:132
VRRType m_type
Definition: mythvrr.h:39
QString TypeToString() const
Definition: mythvrr.cpp:120
bool IsControllable() const
Definition: mythvrr.cpp:115
static constexpr const char * DRM_QUIET
Definition: mythdrmdevice.h:23
std::tuple< int, int, bool > MythVRRRange
Definition: mythedid.h:19
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
Definition: mythlogging.h:39
#define LOC
Definition: mythvrr.cpp:19
std::shared_ptr< class MythVRR > MythVRRPtr
Definition: mythvrr.h:12
STL namespace.