MythTV  master
mythpainterwindow.cpp
Go to the documentation of this file.
1 // Qt
2 #include <QWindow>
3 #include <QGuiApplication>
4 
5 // MythTV
7 #include "libmythbase/mythdb.h"
9 #include "mythmainwindow.h"
10 #include "mythpainter_qt.h"
11 #include "mythpainterwindowqt.h"
12 #include "mythpainterwindow.h"
13 
14 #ifdef USING_OPENGL
17 #endif
18 
19 #ifdef USING_VULKAN
22 #endif
23 
24 #ifdef USING_WAYLANDEXTRAS
26 #endif
27 
28 #define MYTH_PAINTER_QT QString("Qt")
29 
31 
33 {
34 #ifdef USING_OPENGL
35  return MYTH_PAINTER_OPENGL;
36 #elif USING_VULKAN
37  return MYTH_PAINTER_VULKAN;
38 #else
39  return MYTH_PAINTER_QT;
40 #endif
41 }
42 
44 {
45  QStringList result;
46 #ifdef USING_OPENGL
47  result.append(MYTH_PAINTER_OPENGL);
48 #endif
49 #ifdef USING_VULKAN
50  result.append(MYTH_PAINTER_VULKAN);
51 #endif
52  return result;
53 }
54 
56  MythPainterWindow *&PaintWin,
57  MythPainter *&Paint)
58 {
59  bool warn = false;
60  QString painter = GetMythDB()->GetSetting("PaintEngine", GetDefaultPainter());
61 
62  // build a prioritised list of painters to try
63  QVector<TryPainter> painterstotry;
64 
65 #ifdef USING_OPENGL
66  auto TryOpenGL = [](MythMainWindow *MainWindow, MythPainterWindow *&PaintWindow,
67  MythPainter *&Painter, bool& /*unused*/)
68  {
69  auto* glwindow = new MythPainterWindowOpenGL(MainWindow);
70  if (glwindow && glwindow->IsValid())
71  {
72  PaintWindow = glwindow;
73  auto *render = dynamic_cast<MythRenderOpenGL*>(glwindow->GetRenderDevice());
74  Painter = new MythOpenGLPainter(render, MainWindow);
75  return true;
76  }
77  delete glwindow;
78  return false;
79  };
80 
81  if (painter.contains(MYTH_PAINTER_OPENGL, Qt::CaseInsensitive))
82  painterstotry.prepend(TryOpenGL);
83  else
84  painterstotry.append(TryOpenGL);
85 #endif
86 
87 #ifdef USING_VULKAN
88  auto TryVulkan = [](MythMainWindow *MainWindow, MythPainterWindow *&PaintWindow,
89  MythPainter *&Painter, bool& /*unused*/)
90  {
91  auto *vulkan = new MythPainterWindowVulkan(MainWindow);
92  if (vulkan && vulkan->IsValid())
93  {
94  PaintWindow = vulkan;
95  auto *render = dynamic_cast<MythRenderVulkan*>(vulkan->GetRenderDevice());
96  Painter = new MythPainterVulkan(render, MainWindow);
97  return true;
98  }
99  delete vulkan;
100  return false;
101  };
102 
103  if (painter.contains(MYTH_PAINTER_VULKAN, Qt::CaseInsensitive))
104  painterstotry.prepend(TryVulkan);
105  else
106  painterstotry.append(TryVulkan);
107 #endif
108 
109  // Fallback to Qt painter as the last resort.
110  auto TryQt = [](MythMainWindow *MainWindow, MythPainterWindow *&PaintWindow,
111  MythPainter *&Painter, bool& Warn)
112  {
113  LOG(VB_GENERAL, LOG_INFO, "Using the Qt painter. Video playback will not work!");
114  Painter = new MythQtPainter();
115  PaintWindow = new MythPainterWindowQt(MainWindow);
116  Warn = QCoreApplication::applicationName() == MYTH_APPNAME_MYTHFRONTEND;
117  return true;
118  };
119 
120  // N.B. this won't be selectable as a painter in the UI but can be forced
121  // from the command line again (-O ThemePainter=Qt)
122  if (painter.contains(MYTH_PAINTER_QT, Qt::CaseInsensitive))
123  painterstotry.prepend(TryQt);
124  else
125  painterstotry.append(TryQt);
126 
127  for (auto & trypainter : painterstotry)
128  if (trypainter(MainWin, PaintWin, Paint, warn))
129  break;
130 
131  return warn ? tr("Warning: No GPU acceleration") : QString();
132 }
133 
135 {
136  delete Painter;
137  delete PaintWin;
138  Painter = nullptr;
139  PaintWin = nullptr;
140 }
141 
143  : QWidget(MainWin)
144 {
145 #ifdef USING_WAYLANDEXTRAS
146  if (QGuiApplication::platformName().toLower().contains("wayland"))
147  m_waylandDev = new MythWaylandDevice(MainWin);
148 #endif
149 }
150 
151 // NOLINTNEXTLINE(modernize-use-equals-default)
153 {
154 #ifdef USING_WAYLANDEXTRAS
155  delete m_waylandDev;
156 #endif
157 }
158 
160 {
161  return m_render;
162 }
163 
165 {
166  return m_render && m_render->IsShared();
167 }
168 
169 #if defined(DEBUG_PAINTERWIN_EVENTS)
170 bool MythPainterWindow::event(QEvent *Event)
171 {
172  qInfo() << Event;
173  return QWidget::event(Event);
174 }
175 #endif
176 
177 void MythPainterWindow::resizeEvent(QResizeEvent* /*ResizeEvent*/)
178 {
179 #ifdef USING_WAYLANDEXTRAS
180  if (m_waylandDev)
181  m_waylandDev->SetOpaqueRegion(rect());
182 #endif
183 }
mythwaylandextras.h
MythPainterWindow::DestroyPainters
static void DestroyPainters(MythPainterWindow *&PaintWin, MythPainter *&Painter)
Definition: mythpainterwindow.cpp:134
MythOpenGLPainter
Definition: mythpainteropengl.h:26
bool
bool
Definition: pxsup2dast.c:30
MYTH_APPNAME_MYTHFRONTEND
static constexpr const char * MYTH_APPNAME_MYTHFRONTEND
Definition: mythappname.h:6
mythdb.h
mythpainter_qt.h
MythQtPainter
Definition: mythpainter_qt.h:13
mythpainterwindowqt.h
MythPainterWindow::~MythPainterWindow
~MythPainterWindow() override
Definition: mythpainterwindow.cpp:152
MythPainterWindow
Definition: mythpainterwindow.h:34
MythPainterWindowOpenGL
Definition: mythpainterwindowopengl.h:12
MYTH_PAINTER_QT
#define MYTH_PAINTER_QT
Definition: mythpainterwindow.cpp:28
LOG
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
Definition: mythlogging.h:39
MythPainterWindow::CreatePainters
static QString CreatePainters(MythMainWindow *MainWin, MythPainterWindow *&PaintWin, MythPainter *&Paint)
Definition: mythpainterwindow.cpp:55
MythPainterWindow::GetDefaultPainter
static MUI_PUBLIC QString GetDefaultPainter()
Definition: mythpainterwindow.cpp:32
GetMythDB
MythDB * GetMythDB(void)
Definition: mythdb.cpp:51
mythpaintervulkan.h
MythPainterWindowQt
Definition: mythpainterwindowqt.h:7
mythpainterwindow.h
mythlogging.h
MythWaylandDevice
A simple wrapper to retrieve the major Wayland objects from the Qt Wayland native interface.
Definition: mythwaylandextras.h:27
MythPainterVulkan
Definition: mythpaintervulkan.h:19
Event
Event details.
Definition: zmdefines.h:27
MythPainterWindow::m_render
MythRender * m_render
Definition: mythpainterwindow.h:58
MythPainterWindow::GetRenderDevice
MythRender * GetRenderDevice()
Definition: mythpainterwindow.cpp:159
TryPainter
bool(*)(MythMainWindow *, MythPainterWindow *&, MythPainter *&, bool &) TryPainter
Definition: mythpainterwindow.cpp:30
mythappname.h
mythpainteropengl.h
MythRenderOpenGL
Definition: mythrenderopengl.h:95
MYTH_PAINTER_VULKAN
#define MYTH_PAINTER_VULKAN
Definition: mythpainterwindowvulkan.h:10
MythPainterWindowVulkan
Definition: mythpainterwindowvulkan.h:12
MythRender
Definition: mythrender_base.h:23
MythPainter
Definition: mythpainter.h:34
MythPainterWindow::GetPainters
static MUI_PUBLIC QStringList GetPainters()
Definition: mythpainterwindow.cpp:43
MythRender::IsShared
bool IsShared(void) const
Warning: The reference count can be decremented between the call to this function and the use of it's...
Definition: mythrender.cpp:11
MythPainterWindow::MythPainterWindow
MythPainterWindow(MythMainWindow *MainWin)
Definition: mythpainterwindow.cpp:142
MythRenderVulkan
Definition: mythrendervulkan.h:57
MythPainterWindow::RenderIsShared
bool RenderIsShared()
Definition: mythpainterwindow.cpp:164
MYTH_PAINTER_OPENGL
#define MYTH_PAINTER_OPENGL
Definition: mythpainterwindowopengl.h:10
mythmainwindow.h
MythPainterWindow::resizeEvent
void resizeEvent(QResizeEvent *) override
Definition: mythpainterwindow.cpp:177
MythMainWindow
Definition: mythmainwindow.h:28
mythpainterwindowvulkan.h
mythpainterwindowopengl.h