diff options
Diffstat (limited to 'src/gui/opengl/qopenglprogrambinarycache_p.h')
-rw-r--r-- | src/gui/opengl/qopenglprogrambinarycache_p.h | 46 |
1 files changed, 42 insertions, 4 deletions
diff --git a/src/gui/opengl/qopenglprogrambinarycache_p.h b/src/gui/opengl/qopenglprogrambinarycache_p.h index 9fade08e66..f1cf24cd87 100644 --- a/src/gui/opengl/qopenglprogrambinarycache_p.h +++ b/src/gui/opengl/qopenglprogrambinarycache_p.h @@ -52,24 +52,31 @@ // #include <QtGui/qtguiglobal.h> -#include <QtGui/qopenglshaderprogram.h> #include <QtCore/qcache.h> +#include <QtCore/qmutex.h> +#include <QtGui/private/qopenglcontext_p.h> +#include <QtGui/private/qshader_p.h> QT_BEGIN_NAMESPACE +// These classes are also used by the OpenGL backend of QRhi. They must +// therefore stay independent from QOpenGLShader(Program). Must rely only on +// QOpenGLContext/Functions. + class QOpenGLProgramBinaryCache { public: struct ShaderDesc { ShaderDesc() { } - ShaderDesc(QOpenGLShader::ShaderType type, const QByteArray &source = QByteArray()) - : type(type), source(source) + ShaderDesc(QShader::Stage stage, const QByteArray &source = QByteArray()) + : stage(stage), source(source) { } - QOpenGLShader::ShaderType type; + QShader::Stage stage; QByteArray source; }; struct ProgramDesc { QVector<ShaderDesc> shaders; + QByteArray cacheKey() const; }; QOpenGLProgramBinaryCache(); @@ -99,6 +106,37 @@ private: void initializeProgramBinaryOES(QOpenGLContext *context); bool m_programBinaryOESInitialized = false; #endif + QMutex m_mutex; +}; + +// While unlikely, one application can in theory use contexts with different versions +// or profiles. Therefore any version- or extension-specific checks must be done on a +// per-context basis, not just once per process. QOpenGLSharedResource enables this, +// although it's once-per-sharing-context-group, not per-context. Still, this should +// be good enough in practice. +class QOpenGLProgramBinarySupportCheck : public QOpenGLSharedResource +{ +public: + QOpenGLProgramBinarySupportCheck(QOpenGLContext *context); + void invalidateResource() override { } + void freeResource(QOpenGLContext *) override { } + + bool isSupported() const { return m_supported; } + +private: + bool m_supported; +}; + +class QOpenGLProgramBinarySupportCheckWrapper +{ +public: + QOpenGLProgramBinarySupportCheck *get(QOpenGLContext *context) + { + return m_resource.value<QOpenGLProgramBinarySupportCheck>(context); + } + +private: + QOpenGLMultiGroupSharedResource m_resource; }; QT_END_NAMESPACE |