1 #ifndef MYTHRENDER_OPENGL_H_
2 #define MYTHRENDER_OPENGL_H_
11 #include <QOpenGLContext>
12 #include <QOpenGLFunctions>
13 #include <QOpenGLExtraFunctions>
14 #if QT_VERSION < QT_VERSION_CHECK(6,0,0)
15 #include <QOpenGLShaderProgram>
16 #include <QOpenGLFramebufferObject>
17 #include <QOpenGLTexture>
18 #include <QOpenGLBuffer>
19 #include <QOpenGLDebugLogger>
21 #include <QtOpenGL/QOpenGLTexture>
22 #include <QtOpenGL/QOpenGLShaderProgram>
23 #include <QtOpenGL/QOpenGLFramebufferObject>
24 #include <QtOpenGL/QOpenGLBuffer>
25 #include <QtOpenGL/QOpenGLDebugLogger>
28 #include <QRecursiveMutex>
62 unsigned char *m_data {
nullptr };
63 int m_bufferSize { 0 } ;
64 GLuint m_textureId { 0 } ;
65 QOpenGLTexture *m_texture {
nullptr } ;
66 QOpenGLTexture::PixelFormat m_pixelFormat { QOpenGLTexture::RGBA };
67 QOpenGLTexture::PixelType m_pixelType { QOpenGLTexture::UInt8 };
68 QOpenGLBuffer *m_vbo {
nullptr };
69 QSize m_size { QSize() };
70 QSize m_totalSize { QSize() };
72 bool m_crop {
false };
73 QRect m_source { QRect() };
74 QRect m_destination { QRect() };
75 std::array<GLfloat,16> m_vertexData { 0.0F };
76 GLenum m_target { QOpenGLTexture::Target2D };
113 int GetMaxTextureSize(
void)
const;
114 int GetMaxTextureUnits(
void)
const;
115 int GetExtraFeatures(
void)
const;
116 QOpenGLFunctions::OpenGLFeatures GetFeatures(
void)
const;
117 bool IsRecommendedRenderer(
void);
118 void SetViewPort(QRect Rect,
bool ViewportOnly =
false)
override;
120 void PushTransformation(
const UIEffects &Fx, QPointF &Center);
121 void PopTransformation(
void);
123 void SetBlend(
bool Enable);
124 void SetBackground(uint8_t Red, uint8_t Green, uint8_t Blue, uint8_t Alpha);
125 QFunctionPointer GetProcAddress(
const QString &Proc)
const;
126 uint64_t GetSwapCount();
128 static constexpr GLuint kVertexSize { 16 *
sizeof(GLfloat) };
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);
167 void DrawProcedural(QRect Area,
int Alpha, QOpenGLFramebufferObject* Target,
168 QOpenGLShaderProgram* Program,
float TimeVal);
169 std::tuple<int,int,int> GetGPUMemory();
172 void MessageLogged (
const QOpenGLDebugMessage &Message);
173 void logDebugMarker (
const QString &Message);
174 void contextToBeDestroyed(
void);
179 void SetWidget(QWidget *Widget);
180 void Init2DState(
void);
181 void SetMatrixView(
void);
182 void DeleteFramebuffers(
void);
184 QRect Destination,
int Rotation, qreal Scale = 1.0);
185 GLfloat* GetCachedVertices(GLuint Type, QRect Area);
186 void ExpireVertices(
int Max = 0);
187 void GetCachedVBO(GLuint Type, QRect Area);
188 void ExpireVBOS(
int Max = 0);
189 bool CreateDefaultShaders(
void);
190 void DeleteDefaultShaders(
void);
191 void Check16BitFBO(
void);
195 inline void glVertexAttribPointerI(GLuint Index, GLint Size, GLenum Type,
196 GLboolean Normalize, GLsizei Stride,
199 bool m_ready {
false };
202 GLuint m_activeFramebuffer { 0 };
205 GLuint m_fence { 0 };
208 std::array<QOpenGLShaderProgram*,kShaderCount> m_defaultPrograms {
nullptr };
209 QOpenGLShaderProgram* m_activeProgram {
nullptr };
219 int m_lockLevel { 0 };
222 QOpenGLFunctions::OpenGLFeatures m_features { Multitexture };
225 int m_maxTextureSize { 0 };
226 int m_maxTextureUnits { 0 };
229 uint64_t m_swapCount { 0 };
231 GLuint m_activeTexture { 0 };
232 bool m_blend {
false };
233 int32_t m_background { 0x00000001 };
234 bool m_fullRange {
true };
244 bool m_flushEnabled {
true };
248 void DebugFeatures (
void);
249 QOpenGLDebugLogger *m_openglDebugger {
nullptr };
250 QOpenGLDebugMessage::Types m_openGLDebuggerFilter { QOpenGLDebugMessage::InvalidType };
251 QWindow *m_window {
nullptr };