QtBase
v6.3.1
src
gui
opengl
qopenglprogrambinarycache_p.h
Go to the documentation of this file.
1
/****************************************************************************
2
**
3
** Copyright (C) 2016 The Qt Company Ltd.
4
** Contact: https://www.qt.io/licensing/
5
**
6
** This file is part of the QtGui module of the Qt Toolkit.
7
**
8
** $QT_BEGIN_LICENSE:LGPL$
9
** Commercial License Usage
10
** Licensees holding valid commercial Qt licenses may use this file in
11
** accordance with the commercial license agreement provided with the
12
** Software or, alternatively, in accordance with the terms contained in
13
** a written agreement between you and The Qt Company. For licensing terms
14
** and conditions see https://www.qt.io/terms-conditions. For further
15
** information use the contact form at https://www.qt.io/contact-us.
16
**
17
** GNU Lesser General Public License Usage
18
** Alternatively, this file may be used under the terms of the GNU Lesser
19
** General Public License version 3 as published by the Free Software
20
** Foundation and appearing in the file LICENSE.LGPL3 included in the
21
** packaging of this file. Please review the following information to
22
** ensure the GNU Lesser General Public License version 3 requirements
23
** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
24
**
25
** GNU General Public License Usage
26
** Alternatively, this file may be used under the terms of the GNU
27
** General Public License version 2.0 or (at your option) the GNU General
28
** Public license version 3 or any later version approved by the KDE Free
29
** Qt Foundation. The licenses are as published by the Free Software
30
** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
31
** included in the packaging of this file. Please review the following
32
** information to ensure the GNU General Public License requirements will
33
** be met: https://www.gnu.org/licenses/gpl-2.0.html and
34
** https://www.gnu.org/licenses/gpl-3.0.html.
35
**
36
** $QT_END_LICENSE$
37
**
38
****************************************************************************/
39
40
#ifndef QOPENGLPROGRAMBINARYCACHE_P_H
41
#define QOPENGLPROGRAMBINARYCACHE_P_H
42
43
//
44
// W A R N I N G
45
// -------------
46
//
47
// This file is not part of the Qt API. It exists purely as an
48
// implementation detail. This header file may change from version to
49
// version without notice, or even be removed.
50
//
51
// We mean it.
52
//
53
54
#include <QtGui/qtguiglobal.h>
55
#include <QtCore/qcache.h>
56
#include <QtCore/qmutex.h>
57
#include <QtCore/QLoggingCategory>
58
#include <QtGui/private/qopenglcontext_p.h>
59
#include <QtGui/private/qshader_p.h>
60
61
QT_BEGIN_NAMESPACE
62
63
// These classes are also used by the OpenGL backend of QRhi. They must
64
// therefore stay independent from QOpenGLShader(Program). Must rely only on
65
// QOpenGLContext/Functions.
66
67
Q_GUI_EXPORT
Q_DECLARE_LOGGING_CATEGORY
(lcOpenGLProgramDiskCache)
68
69
class
Q_GUI_EXPORT QOpenGLProgramBinaryCache
70
{
71
public
:
72
struct
Q_GUI_EXPORT ShaderDesc {
73
ShaderDesc() { }
74
ShaderDesc(
QShader::Stage
stage,
const
QByteArray
&
source
=
QByteArray
())
75
: stage(stage),
source
(
source
)
76
{ }
77
QShader::Stage
stage;
78
QByteArray
source
;
79
};
80
struct
Q_GUI_EXPORT ProgramDesc {
81
QList<ShaderDesc>
shaders
;
82
QByteArray
cacheKey()
const
;
83
};
84
85
QOpenGLProgramBinaryCache();
86
87
bool
load
(
const
QByteArray
&cacheKey,
uint
programId);
88
void
save(
const
QByteArray
&cacheKey,
uint
programId);
89
90
private
:
91
QString
cacheFileName(
const
QByteArray
&cacheKey)
const
;
92
bool
verifyHeader(
const
QByteArray
&
buf
)
const
;
93
bool
setProgramBinary(
uint
programId,
uint
blobFormat,
const
void
*
p
,
uint
blobSize);
94
95
QString
m_globalCacheDir;
96
QString
m_localCacheDir;
97
QString
m_currentCacheDir;
98
bool
m_cacheWritable;
99
struct
MemCacheEntry {
100
MemCacheEntry(
const
void
*
p
,
int
size
,
uint
format
)
101
: blob(
reinterpret_cast<
const
char
*
>
(
p
),
size
),
102
format
(
format
)
103
{ }
104
QByteArray
blob;
105
uint
format
;
106
};
107
QCache<QByteArray, MemCacheEntry>
m_memCache;
108
#if QT_CONFIG(opengles2)
109
void
(
QOPENGLF_APIENTRYP
programBinaryOES)(
GLuint
program
,
GLenum
binaryFormat
,
const
GLvoid *
binary
,
GLsizei
length
);
110
void
(
QOPENGLF_APIENTRYP
getProgramBinaryOES)(
GLuint
program
,
GLsizei
bufSize
,
GLsizei
*
length
,
GLenum
*
binaryFormat
, GLvoid *
binary
);
111
void
initializeProgramBinaryOES(
QOpenGLContext
*
context
);
112
bool
m_programBinaryOESInitialized =
false
;
113
#endif
114
QMutex
m_mutex;
115
};
116
117
// While unlikely, one application can in theory use contexts with different versions
118
// or profiles. Therefore any version- or extension-specific checks must be done on a
119
// per-context basis, not just once per process. QOpenGLSharedResource enables this,
120
// although it's once-per-sharing-context-group, not per-context. Still, this should
121
// be good enough in practice.
122
class
Q_GUI_EXPORT
QOpenGLProgramBinarySupportCheck
:
public
QOpenGLSharedResource
123
{
124
public
:
125
QOpenGLProgramBinarySupportCheck
(
QOpenGLContext
*
context
);
126
void
invalidateResource
()
override
{ }
127
void
freeResource
(
QOpenGLContext
*)
override
{ }
128
129
bool
isSupported
()
const
{
return
m_supported; }
130
131
private
:
132
bool
m_supported;
133
};
134
135
class
QOpenGLProgramBinarySupportCheckWrapper
136
{
137
public
:
138
QOpenGLProgramBinarySupportCheck
*
get
(
QOpenGLContext
*
context
)
139
{
140
return
m_resource.
value
<
QOpenGLProgramBinarySupportCheck
>(
context
);
141
}
142
143
private
:
144
QOpenGLMultiGroupSharedResource
m_resource;
145
};
146
147
QT_END_NAMESPACE
148
149
#endif
QByteArray
The QByteArray class provides an array of bytes.
Definition:
qbytearray.h:85
QCache
Definition:
qcache.h:50
QList
Definition:
qlist.h:108
QMutex
The QMutex class provides access serialization between threads.
Definition:
qmutex.h:285
QOpenGLContext
The QOpenGLContext class represents a native OpenGL context, enabling OpenGL rendering on a QSurface.
Definition:
qopenglcontext.h:102
QOpenGLMultiGroupSharedResource
Definition:
qopenglcontext_p.h:159
QOpenGLMultiGroupSharedResource::value
QOpenGLSharedResource * value(QOpenGLContext *context)
Definition:
qopenglcontext.cpp:1244
QOpenGLProgramBinarySupportCheck
Definition:
qopenglprogrambinarycache_p.h:123
QOpenGLProgramBinarySupportCheck::isSupported
bool isSupported() const
Definition:
qopenglprogrambinarycache_p.h:129
QOpenGLProgramBinarySupportCheck::invalidateResource
void invalidateResource() override
Definition:
qopenglprogrambinarycache_p.h:126
QOpenGLProgramBinarySupportCheck::freeResource
void freeResource(QOpenGLContext *) override
Definition:
qopenglprogrambinarycache_p.h:127
QOpenGLProgramBinarySupportCheckWrapper
Definition:
qopenglprogrambinarycache_p.h:136
QOpenGLProgramBinarySupportCheckWrapper::get
QOpenGLProgramBinarySupportCheck * get(QOpenGLContext *context)
Definition:
qopenglprogrambinarycache_p.h:138
QOpenGLSharedResource
Definition:
qopenglcontext_p.h:76
QShader::Stage
Stage
Definition:
qshader_p.h:119
QString
The QString class provides a Unicode character string.
Definition:
qstring.h:388
load
p1 load("image.bmp")
QT_BEGIN_NAMESPACE
Definition:
server.cpp:57
QT_END_NAMESPACE
Definition:
qsharedpointer.cpp:1532
src_gui_qopenglshaderprogram::context
QObject * context
Definition:
src_gui_qopenglshaderprogram.cpp:56
void
void
Definition:
png.h:1080
QByteArray
typedef QByteArray(EGLAPIENTRYP PFNQGSGETDISPLAYSPROC)()
uint
unsigned int uint
Definition:
qglobal.h:334
QOPENGLF_APIENTRYP
#define QOPENGLF_APIENTRYP
Definition:
qopengl.h:301
length
GLenum GLuint GLenum GLsizei length
Definition:
qopengl.h:270
binary
GLsizei GLsizei GLenum void * binary
Definition:
qopengles2ext.h:427
size
GLenum GLuint GLintptr GLsizeiptr size
[1]
Definition:
qopengles2ext.h:660
GLsizei
typedef GLsizei(GL_APIENTRYP PFNGLGETFRAMEBUFFERPIXELLOCALSTORAGESIZEEXTPROC)(GLuint target)
GLenum
typedef GLenum(GL_APIENTRYP PFNGLGETGRAPHICSRESETSTATUSKHRPROC)(void)
buf
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition:
qopengles2ext.h:151
program
GLuint program
Definition:
qopengles2ext.h:1805
binaryFormat
GLsizei GLsizei GLenum * binaryFormat
Definition:
qopengles2ext.h:427
bufSize
GLsizei bufSize
Definition:
qopengles2ext.h:153
GLuint
typedef GLuint(GL_APIENTRYP PFNGLGETDEBUGMESSAGELOGKHRPROC)(GLuint count
format
GLint GLsizei GLsizei GLenum format
Definition:
qopengles2ext.h:206
source
GLsizei GLsizei GLchar * source
Definition:
qopengles2ext.h:952
shaders
GLsizei GLsizei GLuint * shaders
Definition:
qopenglext.h:677
p
GLfloat GLfloat p
[1]
Definition:
qopenglext.h:12698
Q_DECLARE_LOGGING_CATEGORY
QT_BEGIN_NAMESPACE Q_GUI_EXPORT Q_DECLARE_LOGGING_CATEGORY(lcOpenGLProgramDiskCache) class Q_GUI_EXPORT QOpenGLProgramBinaryCache
Definition:
qopenglprogrambinarycache_p.h:67
Generated by
1.9.1