1 #ifndef MYTHRENDER_OPENGL_H_
2 #define MYTHRENDER_OPENGL_H_
10 #include <QOpenGLContext>
11 #include <QOpenGLFunctions>
12 #include <QOpenGLExtraFunctions>
13 #if QT_VERSION < QT_VERSION_CHECK(6,0,0)
14 #include <QOpenGLShaderProgram>
15 #include <QOpenGLFramebufferObject>
16 #include <QOpenGLTexture>
17 #include <QOpenGLBuffer>
18 #include <QOpenGLDebugLogger>
20 #include <QtOpenGL/QOpenGLTexture>
21 #include <QtOpenGL/QOpenGLShaderProgram>
22 #include <QtOpenGL/QOpenGLFramebufferObject>
23 #include <QtOpenGL/QOpenGLBuffer>
24 #include <QtOpenGL/QOpenGLDebugLogger>
63 unsigned char *m_data {
nullptr };
64 int m_bufferSize { 0 } ;
65 GLuint m_textureId { 0 } ;
66 QOpenGLTexture *m_texture {
nullptr } ;
67 QOpenGLTexture::PixelFormat m_pixelFormat { QOpenGLTexture::RGBA };
68 QOpenGLTexture::PixelType m_pixelType { QOpenGLTexture::UInt8 };
69 QOpenGLBuffer *m_vbo {
nullptr };
70 QSize m_size { QSize() };
71 QSize m_totalSize { QSize() };
73 bool m_crop {
false };
74 QRect m_source { QRect() };
75 QRect m_destination { QRect() };
76 std::array<GLfloat,16> m_vertexData { 0.0F };
77 GLenum m_target { QOpenGLTexture::Target2D };
114 int GetMaxTextureSize(
void)
const;
115 int GetMaxTextureUnits(
void)
const;
116 int GetExtraFeatures(
void)
const;
117 QOpenGLFunctions::OpenGLFeatures GetFeatures(
void)
const;
118 bool IsRecommendedRenderer(
void);
119 void SetViewPort(QRect Rect,
bool ViewportOnly =
false)
override;
121 void PushTransformation(
const UIEffects &Fx, QPointF &Center);
122 void PopTransformation(
void);
124 void SetBlend(
bool Enable);
125 void SetBackground(uint8_t Red, uint8_t Green, uint8_t Blue, uint8_t Alpha);
126 QFunctionPointer GetProcAddress(
const QString &Proc)
const;
129 QOpenGLBuffer* CreateVBO(
int Size,
bool Release =
true);
132 QSize GetTextureSize(QSize Size,
bool Normalised);
134 void SetTextureFilters(
MythGLTexture *Texture, QOpenGLTexture::Filter Filter,
135 QOpenGLTexture::WrapMode Wrap = QOpenGLTexture::ClampToEdge);
136 void ActiveTexture(GLuint ActiveTex);
138 static int GetBufferSize(QSize Size, QOpenGLTexture::PixelFormat
Format, QOpenGLTexture::PixelType Type);
140 QOpenGLFramebufferObject* CreateFramebuffer(QSize &Size,
bool SixteenBit =
false);
141 MythGLTexture* CreateFramebufferTexture(QOpenGLFramebufferObject *Framebuffer);
142 void DeleteFramebuffer(QOpenGLFramebufferObject *Framebuffer);
143 void BindFramebuffer(QOpenGLFramebufferObject *Framebuffer);
144 void ClearFramebuffer(
void);
146 QOpenGLShaderProgram* CreateShaderProgram(
const QString &Vertex,
const QString &Fragment);
147 QOpenGLShaderProgram* CreateComputeShader(
const QString &
Source);
148 void DeleteShaderProgram(QOpenGLShaderProgram* Program);
149 bool EnableShaderProgram(QOpenGLShaderProgram* Program);
150 void SetShaderProgramParams(QOpenGLShaderProgram* Program,
const QMatrix4x4 &Value,
const char* Uniform);
151 void SetShaderProjection(QOpenGLShaderProgram* Program);
153 void DrawBitmap(
MythGLTexture *Texture, QOpenGLFramebufferObject *Target,
154 QRect
Source, QRect Destination,
155 QOpenGLShaderProgram *Program,
int Alpha = 255, qreal Scale = 1.0);
156 void DrawBitmap(std::vector<MythGLTexture *> &Textures,
157 QOpenGLFramebufferObject *Target,
158 QRect
Source, QRect Destination,
159 QOpenGLShaderProgram *Program,
int Rotation);
160 void DrawRect(QOpenGLFramebufferObject *Target,
161 QRect Area,
const QBrush &FillBrush,
162 const QPen &LinePen,
int Alpha);
163 void DrawRoundRect(QOpenGLFramebufferObject *Target,
164 QRect Area,
int CornerRadius,
165 const QBrush &FillBrush,
const QPen &LinePen,
int Alpha);
166 void ClearRect(QOpenGLFramebufferObject *Target, QRect Area,
int Color,
int Alpha);
168 std::tuple<int,int,int> GetGPUMemory();
171 void MessageLogged (
const QOpenGLDebugMessage &Message);
172 void logDebugMarker (
const QString &Message);
173 void contextToBeDestroyed(
void);
178 void SetWidget(QWidget *Widget);
179 void Init2DState(
void);
180 void SetMatrixView(
void);
181 void DeleteFramebuffers(
void);
183 QRect Destination,
int Rotation, qreal Scale = 1.0);
184 GLfloat* GetCachedVertices(GLuint Type, QRect Area);
185 void ExpireVertices(
int Max = 0);
186 void GetCachedVBO(GLuint Type, QRect Area);
187 void ExpireVBOS(
int Max = 0);
188 bool CreateDefaultShaders(
void);
189 void DeleteDefaultShaders(
void);
190 void Check16BitFBO(
void);
194 inline void glVertexAttribPointerI(GLuint Index, GLint Size, GLenum Type,
195 GLboolean Normalize, GLsizei Stride,
198 bool m_ready {
false };
201 GLuint m_activeFramebuffer { 0 };
204 GLuint m_fence { 0 };
207 std::array<QOpenGLShaderProgram*,kShaderCount> m_defaultPrograms {
nullptr };
208 QOpenGLShaderProgram* m_activeProgram {
nullptr };
217 QMutex m_lock { QMutex::Recursive };
218 int m_lockLevel { 0 };
221 QOpenGLFunctions::OpenGLFeatures m_features { Multitexture };
224 int m_maxTextureSize { 0 };
225 int m_maxTextureUnits { 0 };
229 GLuint m_activeTexture { 0 };
230 bool m_blend {
false };
231 int32_t m_background { 0x00000001 };
232 bool m_fullRange {
true };
242 bool m_flushEnabled {
true };
246 void DebugFeatures (
void);
247 QOpenGLDebugLogger *m_openglDebugger {
nullptr };
248 QOpenGLDebugMessage::Types m_openGLDebuggerFilter { QOpenGLDebugMessage::InvalidType };
249 QWindow *m_window {
nullptr };