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>
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;
127 uint64_t GetSwapCount();
129 static constexpr GLuint kVertexSize { 16 *
sizeof(GLfloat) };
130 QOpenGLBuffer* CreateVBO(
int Size,
bool Release =
true);
133 QSize GetTextureSize(QSize Size,
bool Normalised);
135 void SetTextureFilters(
MythGLTexture *Texture, QOpenGLTexture::Filter Filter,
136 QOpenGLTexture::WrapMode Wrap = QOpenGLTexture::ClampToEdge);
137 void ActiveTexture(GLuint ActiveTex);
139 static int GetBufferSize(QSize Size, QOpenGLTexture::PixelFormat
Format, QOpenGLTexture::PixelType Type);
141 QOpenGLFramebufferObject* CreateFramebuffer(QSize &Size,
bool SixteenBit =
false);
142 MythGLTexture* CreateFramebufferTexture(QOpenGLFramebufferObject *Framebuffer);
143 void DeleteFramebuffer(QOpenGLFramebufferObject *Framebuffer);
144 void BindFramebuffer(QOpenGLFramebufferObject *Framebuffer);
145 void ClearFramebuffer(
void);
147 QOpenGLShaderProgram* CreateShaderProgram(
const QString &Vertex,
const QString &Fragment);
148 QOpenGLShaderProgram* CreateComputeShader(
const QString &
Source);
149 void DeleteShaderProgram(QOpenGLShaderProgram* Program);
150 bool EnableShaderProgram(QOpenGLShaderProgram* Program);
151 void SetShaderProgramParams(QOpenGLShaderProgram* Program,
const QMatrix4x4 &Value,
const char* Uniform);
152 void SetShaderProjection(QOpenGLShaderProgram* Program);
154 void DrawBitmap(
MythGLTexture *Texture, QOpenGLFramebufferObject *Target,
155 QRect
Source, QRect Destination,
156 QOpenGLShaderProgram *Program,
int Alpha = 255, qreal Scale = 1.0);
157 void DrawBitmap(std::vector<MythGLTexture *> &Textures,
158 QOpenGLFramebufferObject *Target,
159 QRect
Source, QRect Destination,
160 QOpenGLShaderProgram *Program,
int Rotation);
161 void DrawRect(QOpenGLFramebufferObject *Target,
162 QRect Area,
const QBrush &FillBrush,
163 const QPen &LinePen,
int Alpha);
164 void DrawRoundRect(QOpenGLFramebufferObject *Target,
165 QRect Area,
int CornerRadius,
166 const QBrush &FillBrush,
const QPen &LinePen,
int Alpha);
167 void ClearRect(QOpenGLFramebufferObject *Target, QRect Area,
int Color,
int Alpha);
168 void DrawProcedural(QRect Area,
int Alpha, QOpenGLFramebufferObject* Target,
169 QOpenGLShaderProgram* Program,
float TimeVal);
170 std::tuple<int,int,int> GetGPUMemory();
173 void MessageLogged (
const QOpenGLDebugMessage &Message);
174 void logDebugMarker (
const QString &Message);
175 void contextToBeDestroyed(
void);
180 void SetWidget(QWidget *Widget);
181 void Init2DState(
void);
182 void SetMatrixView(
void);
183 void DeleteFramebuffers(
void);
185 QRect Destination,
int Rotation, qreal Scale = 1.0);
186 GLfloat* GetCachedVertices(GLuint Type, QRect Area);
187 void ExpireVertices(
int Max = 0);
188 void GetCachedVBO(GLuint Type, QRect Area);
189 void ExpireVBOS(
int Max = 0);
190 bool CreateDefaultShaders(
void);
191 void DeleteDefaultShaders(
void);
192 void Check16BitFBO(
void);
196 inline void glVertexAttribPointerI(GLuint Index, GLint Size, GLenum Type,
197 GLboolean Normalize, GLsizei Stride,
200 bool m_ready {
false };
203 GLuint m_activeFramebuffer { 0 };
206 GLuint m_fence { 0 };
209 std::array<QOpenGLShaderProgram*,kShaderCount> m_defaultPrograms {
nullptr };
210 QOpenGLShaderProgram* m_activeProgram {
nullptr };
220 int m_lockLevel { 0 };
223 QOpenGLFunctions::OpenGLFeatures m_features { Multitexture };
226 int m_maxTextureSize { 0 };
227 int m_maxTextureUnits { 0 };
230 uint64_t m_swapCount { 0 };
232 GLuint m_activeTexture { 0 };
233 bool m_blend {
false };
234 int32_t m_background { 0x00000001 };
235 bool m_fullRange {
true };
245 bool m_flushEnabled {
true };
249 void DebugFeatures (
void);
250 QOpenGLDebugLogger *m_openglDebugger {
nullptr };
251 QOpenGLDebugMessage::Types m_openGLDebuggerFilter { QOpenGLDebugMessage::InvalidType };
252 QWindow *m_window {
nullptr };