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 };
104 QStringList GetDescription(
void)
override;
112 int GetMaxTextureSize(
void)
const;
113 int GetMaxTextureUnits(
void)
const;
114 int GetExtraFeatures(
void)
const;
115 QOpenGLFunctions::OpenGLFeatures GetFeatures(
void)
const;
116 bool IsRecommendedRenderer(
void);
117 void SetViewPort(QRect Rect,
bool ViewportOnly =
false)
override;
119 void PushTransformation(
const UIEffects &Fx, QPointF &Center);
120 void PopTransformation(
void);
122 void SetBlend(
bool Enable);
123 void SetBackground(uint8_t Red, uint8_t Green, uint8_t Blue, uint8_t Alpha);
124 QFunctionPointer GetProcAddress(
const QString &Proc)
const;
125 uint64_t GetSwapCount();
127 static constexpr GLuint kVertexSize { 16 *
sizeof(GLfloat) };
128 QOpenGLBuffer* CreateVBO(
int Size,
bool Release =
true);
131 QSize GetTextureSize(QSize Size,
bool Normalised);
133 void SetTextureFilters(
MythGLTexture *Texture, QOpenGLTexture::Filter Filter,
134 QOpenGLTexture::WrapMode Wrap = QOpenGLTexture::ClampToEdge);
135 void ActiveTexture(GLuint ActiveTex);
137 static int GetBufferSize(QSize Size, QOpenGLTexture::PixelFormat
Format, QOpenGLTexture::PixelType Type);
139 QOpenGLFramebufferObject* CreateFramebuffer(QSize &Size,
bool SixteenBit =
false);
140 MythGLTexture* CreateFramebufferTexture(QOpenGLFramebufferObject *Framebuffer);
141 void DeleteFramebuffer(QOpenGLFramebufferObject *Framebuffer);
142 void BindFramebuffer(QOpenGLFramebufferObject *Framebuffer);
143 void ClearFramebuffer(
void);
145 QOpenGLShaderProgram* CreateShaderProgram(
const QString &Vertex,
const QString &Fragment);
146 QOpenGLShaderProgram* CreateComputeShader(
const QString &
Source);
147 void DeleteShaderProgram(QOpenGLShaderProgram* Program);
148 bool EnableShaderProgram(QOpenGLShaderProgram* Program);
149 void SetShaderProgramParams(QOpenGLShaderProgram* Program,
const QMatrix4x4 &Value,
const char* Uniform);
150 void SetShaderProjection(QOpenGLShaderProgram* Program);
152 void DrawBitmap(
MythGLTexture *Texture, QOpenGLFramebufferObject *Target,
153 QRect
Source, QRect Destination,
154 QOpenGLShaderProgram *Program,
int Alpha = 255, qreal Scale = 1.0);
155 void DrawBitmap(std::vector<MythGLTexture *> &Textures,
156 QOpenGLFramebufferObject *Target,
157 QRect
Source, QRect Destination,
158 QOpenGLShaderProgram *Program,
int Rotation);
159 void DrawRect(QOpenGLFramebufferObject *Target,
160 QRect Area,
const QBrush &FillBrush,
161 const QPen &LinePen,
int Alpha);
162 void DrawRoundRect(QOpenGLFramebufferObject *Target,
163 QRect Area,
int CornerRadius,
164 const QBrush &FillBrush,
const QPen &LinePen,
int Alpha);
165 void ClearRect(QOpenGLFramebufferObject *Target, QRect Area,
int Color,
int Alpha);
166 void DrawProcedural(QRect Area,
int Alpha, QOpenGLFramebufferObject* Target,
167 QOpenGLShaderProgram* Program,
float TimeVal);
168 std::tuple<int,int,int> GetGPUMemory();
171 void ReleaseResources(
void)
override;
174 void MessageLogged (
const QOpenGLDebugMessage &Message);
175 void logDebugMarker (
const QString &Message);
176 void contextToBeDestroyed(
void);
181 void SetWidget(QWidget *Widget);
182 void Init2DState(
void);
183 void SetMatrixView(
void);
186 QRect Destination,
int Rotation, qreal Scale = 1.0);
187 GLfloat* GetCachedVertices(GLuint Type, QRect Area);
188 void ExpireVertices(
int Max = 0);
189 void GetCachedVBO(GLuint Type, QRect Area);
190 void ExpireVBOS(
int Max = 0);
191 bool CreateDefaultShaders(
void);
192 void DeleteDefaultShaders(
void);
193 void Check16BitFBO(
void);
197 inline void glVertexAttribPointerI(GLuint Index, GLint Size, GLenum Type,
198 GLboolean Normalize, GLsizei Stride,
201 bool m_ready {
false };
204 GLuint m_activeFramebuffer { 0 };
207 GLuint m_fence { 0 };
210 std::array<QOpenGLShaderProgram*,kShaderCount> m_defaultPrograms {
nullptr };
211 QOpenGLShaderProgram* m_activeProgram {
nullptr };
221 int m_lockLevel { 0 };
224 QOpenGLFunctions::OpenGLFeatures m_features { Multitexture };
227 int m_maxTextureSize { 0 };
228 int m_maxTextureUnits { 0 };
231 uint64_t m_swapCount { 0 };
233 GLuint m_activeTexture { 0 };
234 bool m_blend {
false };
235 int32_t m_background { 0x00000001 };
236 bool m_fullRange {
true };
246 bool m_flushEnabled {
true };
250 void DebugFeatures (
void);
251 QOpenGLDebugLogger *m_openglDebugger {
nullptr };
252 QOpenGLDebugMessage::Types m_openGLDebuggerFilter { QOpenGLDebugMessage::InvalidType };
253 QWindow *m_window {
nullptr };
virtual ~MythGLTexture()=default
QList< uint64_t > m_vertexExpiry
QStack< QMatrix4x4 > m_transforms
QMap< uint64_t, QOpenGLBuffer * > m_cachedVBOS
QHash< QString, QMatrix4x4 > m_cachedMatrixUniforms
void DeleteFramebuffers(void)
QHash< QOpenGLShaderProgram *, QHash< QByteArray, GLint > > m_cachedUniformLocations
QMap< uint64_t, GLfloat * > m_cachedVertices
QList< uint64_t > m_vboExpiry
MythRenderOpenGL * m_render
static constexpr size_t TEX_OFFSET