MythTV master
mythegl.cpp
Go to the documentation of this file.
1// MythTV
2#include "libmythbase/mythconfig.h"
4#include "mythrenderopengl.h"
5#include "mythegl.h"
6
7#define LOC QString("EGL: ")
8
9#if CONFIG_EGL
10#include <EGL/egl.h>
11#include <EGL/eglext.h>
12#endif
13
14#ifndef EGL_EXT_platform_device
15#define EGL_PLATFORM_DEVICE_EXT 0x313F
16#endif
17
18#ifndef EGL_EXT_platform_wayland
19#define EGL_PLATFORM_WAYLAND_EXT 0x31D8
20#endif
21
22#ifndef EGL_EXT_platform_x11
23#define EGL_PLATFORM_X11_EXT 0x31D5
24#endif
25
27 : m_context(Context)
28{
29}
30
32{
33 return InitEGL();
34}
35
37{
38 // N.B. Strictly speaking this reports both whether EGL is in use and whether
39 // EGL_KHR_image functionality is present - which is currently the only thing
40 // we are interested in.
41#if CONFIG_EGL
43 return true;
44
45 if (!m_context)
46 return false;
47
48 OpenGLLocker locker(m_context);
49 m_eglDisplay = eglGetCurrentDisplay();
50 if (!m_eglDisplay)
51 return false;
52
53 m_eglImageTargetTexture2DOES = reinterpret_cast<MYTH_EGLIMAGETARGET>(eglGetProcAddress("glEGLImageTargetTexture2DOES"));
54 m_eglCreateImageKHR = reinterpret_cast<MYTH_EGLCREATEIMAGE>(eglGetProcAddress("eglCreateImageKHR"));
55 m_eglDestroyImageKHR = reinterpret_cast<MYTH_EGLDESTROYIMAGE>(eglGetProcAddress("eglDestroyImageKHR"));
56
58 return true;
59
60 LOG(VB_GENERAL, LOG_ERR, LOC + "Failed to resolve EGL functions");
61#endif
62 return false;
63}
64
65bool MythEGL::HasEGLExtension([[maybe_unused]] QString Extension)
66{
67#if CONFIG_EGL
68 OpenGLLocker locker(m_context);
69 if (m_eglDisplay)
70 {
71 QByteArray extensions = QByteArray(eglQueryString(m_eglDisplay, EGL_EXTENSIONS));
72 return extensions.contains(Extension.data()->toLatin1());
73 }
74#endif
75 return false;
76}
77
79{
80 return m_eglDisplay;
81}
82
84{
85#if CONFIG_EGL
86 auto CheckDisplay = [](EGLDisplay EglDisplay)
87 {
88 if (EglDisplay == EGL_NO_DISPLAY)
89 return QString();
90 int major = 1;
91 int minor = 4;
92 if (!eglInitialize(EglDisplay, &major, &minor))
93 return QString();
94 QString vendor = eglQueryString(EglDisplay, EGL_VENDOR);
95 QString apis = eglQueryString(EglDisplay, EGL_CLIENT_APIS);
96 QString version = eglQueryString(EglDisplay, EGL_VERSION);
97 eglTerminate(EglDisplay);
98 if (!apis.contains("opengl", Qt::CaseInsensitive) || (major < 1 || minor < 2))
99 return QString();
100 return QString("%1, %2").arg(vendor, version);
101 };
102
103 QString extensions = eglQueryString(EGL_NO_DISPLAY, EGL_EXTENSIONS);
104 if (extensions.contains("EGL_EXT_platform_base"))
105 {
106 QString vendor;
107 auto getdisp =
108 reinterpret_cast<MYTH_EGLGETPLATFORMDISPLAY>(eglGetProcAddress("eglGetPlatformDisplay"));
109 if (getdisp && extensions.contains("platform_x11"))
110 {
111 vendor = CheckDisplay(getdisp(EGL_PLATFORM_X11_EXT, EGL_DEFAULT_DISPLAY, nullptr));
112 if (!vendor.isEmpty())
113 return vendor;
114 }
115 if (getdisp && extensions.contains("platform_wayland"))
116 {
117 vendor = CheckDisplay(getdisp(EGL_PLATFORM_WAYLAND_EXT, EGL_DEFAULT_DISPLAY, nullptr));
118 if (!vendor.isEmpty())
119 return vendor;
120 }
121 if (getdisp && extensions.contains("platform_device"))
122 {
123 vendor = CheckDisplay(getdisp(EGL_PLATFORM_DEVICE_EXT, EGL_DEFAULT_DISPLAY, nullptr));
124 if (!vendor.isEmpty())
125 return vendor;
126 }
127 }
128
129 return CheckDisplay(eglGetDisplay(EGL_DEFAULT_DISPLAY));
130#else
131 return QString();
132#endif
133}
134
136{
137#if CONFIG_EGL
138 return static_cast<qint32>(eglGetError());
139#else
140 return 0; // EGL_FALSE
141#endif
142}
143
144void MythEGL::eglImageTargetTexture2DOES(GLenum Target, void *Image)
145{
147 m_eglImageTargetTexture2DOES(Target, Image);
148}
149
150void* MythEGL::eglCreateImageKHR(void *Disp, void *Context, unsigned int Target,
151 void *Buffer, const int32_t *Attributes)
152{
154 return m_eglCreateImageKHR(Disp, Context, Target, Buffer, Attributes);
155 return nullptr;
156}
157
158void MythEGL::eglDestroyImageKHR(void *Disp, void *Image)
159{
161 m_eglDestroyImageKHR(Disp, Image);
162}
void * GetEGLDisplay(void)
Definition: mythegl.cpp:78
void eglImageTargetTexture2DOES(GLenum Target, void *Image)
Definition: mythegl.cpp:144
static QString GetEGLVendor(void)
Definition: mythegl.cpp:83
bool IsEGL(void)
Definition: mythegl.cpp:31
bool HasEGLExtension(QString Extension)
Definition: mythegl.cpp:65
MythEGL(MythRenderOpenGL *Context)
Definition: mythegl.cpp:26
bool InitEGL(void)
Definition: mythegl.cpp:36
void eglDestroyImageKHR(void *Disp, void *Image)
Definition: mythegl.cpp:158
MYTH_EGLDESTROYIMAGE m_eglDestroyImageKHR
Definition: mythegl.h:45
void * m_eglDisplay
Definition: mythegl.h:42
static qint32 GetEGLError(void)
Definition: mythegl.cpp:135
MYTH_EGLIMAGETARGET m_eglImageTargetTexture2DOES
Definition: mythegl.h:43
void * eglCreateImageKHR(void *Disp, void *Context, unsigned int Target, void *Buffer, const int32_t *Attributes)
Definition: mythegl.cpp:150
MYTH_EGLCREATEIMAGE m_eglCreateImageKHR
Definition: mythegl.h:44
MythRenderOpenGL * m_context
Definition: mythegl.h:41
#define minor(X)
Definition: compat.h:74
#define LOC
Definition: mythegl.cpp:7
#define EGL_PLATFORM_X11_EXT
Definition: mythegl.cpp:23
#define EGL_PLATFORM_WAYLAND_EXT
Definition: mythegl.cpp:19
#define EGL_PLATFORM_DEVICE_EXT
Definition: mythegl.cpp:15
void(*)(GLenum, void *) MYTH_EGLIMAGETARGET
Definition: mythegl.h:10
void(*)(void *, void *) MYTH_EGLDESTROYIMAGE
Definition: mythegl.h:12
void *(*)(void *, void *, unsigned int, void *, const int32_t *) MYTH_EGLCREATEIMAGE
Definition: mythegl.h:11
void *(*)(GLenum, void *, const intptr_t *) MYTH_EGLGETPLATFORMDISPLAY
Definition: mythegl.h:16
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
Definition: mythlogging.h:39
string version
Definition: giantbomb.py:185