Absolute File Name: | /home/qt/qt5_coco/qt5/qtbase/src/opengl/gl2paintengineex/qglengineshadermanager.cpp |
Switch to Source code | Preprocessed file |
Line | Source | Count | ||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | - | |||||||||||||||||||
2 | - | |||||||||||||||||||
3 | - | |||||||||||||||||||
4 | - | |||||||||||||||||||
5 | - | |||||||||||||||||||
6 | - | |||||||||||||||||||
7 | - | |||||||||||||||||||
8 | - | |||||||||||||||||||
9 | - | |||||||||||||||||||
10 | - | |||||||||||||||||||
11 | - | |||||||||||||||||||
12 | class QGLEngineSharedShadersResource : public QOpenGLSharedResource | - | ||||||||||||||||||
13 | { | - | ||||||||||||||||||
14 | public: | - | ||||||||||||||||||
15 | QGLEngineSharedShadersResource(QOpenGLContext *ctx) | - | ||||||||||||||||||
16 | : QOpenGLSharedResource(ctx->shareGroup()) | - | ||||||||||||||||||
17 | , m_shaders(new QGLEngineSharedShaders(QGLContext::fromOpenGLContext(ctx))) | - | ||||||||||||||||||
18 | { | - | ||||||||||||||||||
19 | } | - | ||||||||||||||||||
20 | - | |||||||||||||||||||
21 | ~QGLEngineSharedShadersResource() | - | ||||||||||||||||||
22 | { | - | ||||||||||||||||||
23 | delete m_shaders; | - | ||||||||||||||||||
24 | } | - | ||||||||||||||||||
25 | - | |||||||||||||||||||
26 | void invalidateResource() override | - | ||||||||||||||||||
27 | { | - | ||||||||||||||||||
28 | delete m_shaders; | - | ||||||||||||||||||
29 | m_shaders = 0; | - | ||||||||||||||||||
30 | } | - | ||||||||||||||||||
31 | - | |||||||||||||||||||
32 | void freeResource(QOpenGLContext *) override | - | ||||||||||||||||||
33 | { | - | ||||||||||||||||||
34 | } | - | ||||||||||||||||||
35 | - | |||||||||||||||||||
36 | QGLEngineSharedShaders *shaders() const { return m_shaders; } | - | ||||||||||||||||||
37 | - | |||||||||||||||||||
38 | private: | - | ||||||||||||||||||
39 | QGLEngineSharedShaders *m_shaders; | - | ||||||||||||||||||
40 | }; | - | ||||||||||||||||||
41 | - | |||||||||||||||||||
42 | class QGLShaderStorage | - | ||||||||||||||||||
43 | { | - | ||||||||||||||||||
44 | public: | - | ||||||||||||||||||
45 | QGLEngineSharedShaders *shadersForThread(const QGLContext *context) { | - | ||||||||||||||||||
46 | QOpenGLMultiGroupSharedResource *&shaders = m_storage.localData(); | - | ||||||||||||||||||
47 | if (!shaders) | - | ||||||||||||||||||
48 | shaders = new QOpenGLMultiGroupSharedResource; | - | ||||||||||||||||||
49 | QGLEngineSharedShadersResource *resource = | - | ||||||||||||||||||
50 | shaders->value<QGLEngineSharedShadersResource>(context->contextHandle()); | - | ||||||||||||||||||
51 | return resource ? resource->shaders() : 0; | - | ||||||||||||||||||
52 | } | - | ||||||||||||||||||
53 | - | |||||||||||||||||||
54 | private: | - | ||||||||||||||||||
55 | QThreadStorage<QOpenGLMultiGroupSharedResource *> m_storage; | - | ||||||||||||||||||
56 | }; | - | ||||||||||||||||||
57 | - | |||||||||||||||||||
58 | namespace { namespace Q_QGS_qt_shader_storage { typedef QGLShaderStorage Type; QBasicAtomicInt guard = { QtGlobalStatic::Uninitialized }; __attribute__((visibility("hidden"))) inline Type *innerFunction() { struct HolderBase { ~HolderBase() noexcept { if (guard.load() == QtGlobalStatic::Initialized) guard.store(QtGlobalStatic::Destroyed); } }; static struct Holder : public HolderBase { Type value; Holder() noexcept(noexcept(Type ())) : value () { guard.store(QtGlobalStatic::Initialized); } } holder; return &holder.value; } } } static QGlobalStatic<QGLShaderStorage, Q_QGS_qt_shader_storage::innerFunction, Q_QGS_qt_shader_storage::guard> qt_shader_storage;; | - | ||||||||||||||||||
59 | - | |||||||||||||||||||
60 | QGLEngineSharedShaders *QGLEngineSharedShaders::shadersForContext(const QGLContext *context) | - | ||||||||||||||||||
61 | { | - | ||||||||||||||||||
62 | return qt_shader_storage()->shadersForThread(context); | - | ||||||||||||||||||
63 | } | - | ||||||||||||||||||
64 | - | |||||||||||||||||||
65 | const char* QGLEngineSharedShaders::qShaderSnippets[] = { | - | ||||||||||||||||||
66 | 0,0,0,0,0,0,0,0,0,0, | - | ||||||||||||||||||
67 | 0,0,0,0,0,0,0,0,0,0, | - | ||||||||||||||||||
68 | 0,0,0,0,0,0,0,0,0,0, | - | ||||||||||||||||||
69 | 0,0,0,0,0 | - | ||||||||||||||||||
70 | }; | - | ||||||||||||||||||
71 | - | |||||||||||||||||||
72 | QGLEngineSharedShaders::QGLEngineSharedShaders(const QGLContext* context) | - | ||||||||||||||||||
73 | : blitShaderProg(0) | - | ||||||||||||||||||
74 | , simpleShaderProg(0) | - | ||||||||||||||||||
75 | { | - | ||||||||||||||||||
76 | - | |||||||||||||||||||
77 | - | |||||||||||||||||||
78 | - | |||||||||||||||||||
79 | - | |||||||||||||||||||
80 | - | |||||||||||||||||||
81 | - | |||||||||||||||||||
82 | - | |||||||||||||||||||
83 | static bool snippetsPopulated = false; | - | ||||||||||||||||||
84 | if (!snippetsPopulated
| 0-1 | ||||||||||||||||||
85 | - | |||||||||||||||||||
86 | const char** code = qShaderSnippets; | - | ||||||||||||||||||
87 | - | |||||||||||||||||||
88 | code[MainVertexShader] = qglslMainVertexShader; | - | ||||||||||||||||||
89 | code[MainWithTexCoordsVertexShader] = qglslMainWithTexCoordsVertexShader; | - | ||||||||||||||||||
90 | code[MainWithTexCoordsAndOpacityVertexShader] = qglslMainWithTexCoordsAndOpacityVertexShader; | - | ||||||||||||||||||
91 | - | |||||||||||||||||||
92 | code[UntransformedPositionVertexShader] = qglslUntransformedPositionVertexShader; | - | ||||||||||||||||||
93 | code[PositionOnlyVertexShader] = qglslPositionOnlyVertexShader; | - | ||||||||||||||||||
94 | code[ComplexGeometryPositionOnlyVertexShader] = qglslComplexGeometryPositionOnlyVertexShader; | - | ||||||||||||||||||
95 | code[PositionWithPatternBrushVertexShader] = qglslPositionWithPatternBrushVertexShader; | - | ||||||||||||||||||
96 | code[PositionWithLinearGradientBrushVertexShader] = qglslPositionWithLinearGradientBrushVertexShader; | - | ||||||||||||||||||
97 | code[PositionWithConicalGradientBrushVertexShader] = qglslPositionWithConicalGradientBrushVertexShader; | - | ||||||||||||||||||
98 | code[PositionWithRadialGradientBrushVertexShader] = qglslPositionWithRadialGradientBrushVertexShader; | - | ||||||||||||||||||
99 | code[PositionWithTextureBrushVertexShader] = qglslPositionWithTextureBrushVertexShader; | - | ||||||||||||||||||
100 | code[AffinePositionWithPatternBrushVertexShader] = qglslAffinePositionWithPatternBrushVertexShader; | - | ||||||||||||||||||
101 | code[AffinePositionWithLinearGradientBrushVertexShader] = qglslAffinePositionWithLinearGradientBrushVertexShader; | - | ||||||||||||||||||
102 | code[AffinePositionWithConicalGradientBrushVertexShader] = qglslAffinePositionWithConicalGradientBrushVertexShader; | - | ||||||||||||||||||
103 | code[AffinePositionWithRadialGradientBrushVertexShader] = qglslAffinePositionWithRadialGradientBrushVertexShader; | - | ||||||||||||||||||
104 | code[AffinePositionWithTextureBrushVertexShader] = qglslAffinePositionWithTextureBrushVertexShader; | - | ||||||||||||||||||
105 | - | |||||||||||||||||||
106 | code[MainFragmentShader_CMO] = qglslMainFragmentShader_CMO; | - | ||||||||||||||||||
107 | code[MainFragmentShader_CM] = qglslMainFragmentShader_CM; | - | ||||||||||||||||||
108 | code[MainFragmentShader_MO] = qglslMainFragmentShader_MO; | - | ||||||||||||||||||
109 | code[MainFragmentShader_M] = qglslMainFragmentShader_M; | - | ||||||||||||||||||
110 | code[MainFragmentShader_CO] = qglslMainFragmentShader_CO; | - | ||||||||||||||||||
111 | code[MainFragmentShader_C] = qglslMainFragmentShader_C; | - | ||||||||||||||||||
112 | code[MainFragmentShader_O] = qglslMainFragmentShader_O; | - | ||||||||||||||||||
113 | code[MainFragmentShader] = qglslMainFragmentShader; | - | ||||||||||||||||||
114 | code[MainFragmentShader_ImageArrays] = qglslMainFragmentShader_ImageArrays; | - | ||||||||||||||||||
115 | - | |||||||||||||||||||
116 | code[ImageSrcFragmentShader] = qglslImageSrcFragmentShader; | - | ||||||||||||||||||
117 | code[ImageSrcWithPatternFragmentShader] = qglslImageSrcWithPatternFragmentShader; | - | ||||||||||||||||||
118 | code[NonPremultipliedImageSrcFragmentShader] = qglslNonPremultipliedImageSrcFragmentShader; | - | ||||||||||||||||||
119 | code[CustomImageSrcFragmentShader] = qglslCustomSrcFragmentShader; | - | ||||||||||||||||||
120 | code[SolidBrushSrcFragmentShader] = qglslSolidBrushSrcFragmentShader; | - | ||||||||||||||||||
121 | if (!context->contextHandle()->isOpenGLES()
| 0-1 | ||||||||||||||||||
122 | code[TextureBrushSrcFragmentShader] = qglslTextureBrushSrcFragmentShader_desktop; executed 1 time by 1 test: code[TextureBrushSrcFragmentShader] = qglslTextureBrushSrcFragmentShader_desktop; Executed by:
| 1 | ||||||||||||||||||
123 | else | - | ||||||||||||||||||
124 | code[TextureBrushSrcFragmentShader] = qglslTextureBrushSrcFragmentShader_ES; never executed: code[TextureBrushSrcFragmentShader] = qglslTextureBrushSrcFragmentShader_ES; | 0 | ||||||||||||||||||
125 | code[TextureBrushSrcWithPatternFragmentShader] = qglslTextureBrushSrcWithPatternFragmentShader; | - | ||||||||||||||||||
126 | code[PatternBrushSrcFragmentShader] = qglslPatternBrushSrcFragmentShader; | - | ||||||||||||||||||
127 | code[LinearGradientBrushSrcFragmentShader] = qglslLinearGradientBrushSrcFragmentShader; | - | ||||||||||||||||||
128 | code[RadialGradientBrushSrcFragmentShader] = qglslRadialGradientBrushSrcFragmentShader; | - | ||||||||||||||||||
129 | code[ConicalGradientBrushSrcFragmentShader] = qglslConicalGradientBrushSrcFragmentShader; | - | ||||||||||||||||||
130 | code[ShockingPinkSrcFragmentShader] = qglslShockingPinkSrcFragmentShader; | - | ||||||||||||||||||
131 | - | |||||||||||||||||||
132 | code[NoMaskFragmentShader] = ""; | - | ||||||||||||||||||
133 | code[MaskFragmentShader] = qglslMaskFragmentShader; | - | ||||||||||||||||||
134 | code[RgbMaskFragmentShaderPass1] = qglslRgbMaskFragmentShaderPass1; | - | ||||||||||||||||||
135 | code[RgbMaskFragmentShaderPass2] = qglslRgbMaskFragmentShaderPass2; | - | ||||||||||||||||||
136 | code[RgbMaskWithGammaFragmentShader] = ""; | - | ||||||||||||||||||
137 | - | |||||||||||||||||||
138 | code[NoCompositionModeFragmentShader] = ""; | - | ||||||||||||||||||
139 | code[MultiplyCompositionModeFragmentShader] = ""; | - | ||||||||||||||||||
140 | code[ScreenCompositionModeFragmentShader] = ""; | - | ||||||||||||||||||
141 | code[OverlayCompositionModeFragmentShader] = ""; | - | ||||||||||||||||||
142 | code[DarkenCompositionModeFragmentShader] = ""; | - | ||||||||||||||||||
143 | code[LightenCompositionModeFragmentShader] = ""; | - | ||||||||||||||||||
144 | code[ColorDodgeCompositionModeFragmentShader] = ""; | - | ||||||||||||||||||
145 | code[ColorBurnCompositionModeFragmentShader] = ""; | - | ||||||||||||||||||
146 | code[HardLightCompositionModeFragmentShader] = ""; | - | ||||||||||||||||||
147 | code[SoftLightCompositionModeFragmentShader] = ""; | - | ||||||||||||||||||
148 | code[DifferenceCompositionModeFragmentShader] = ""; | - | ||||||||||||||||||
149 | code[ExclusionCompositionModeFragmentShader] = ""; | - | ||||||||||||||||||
150 | - | |||||||||||||||||||
151 | - | |||||||||||||||||||
152 | - | |||||||||||||||||||
153 | for (int i = 0; i < TotalSnippetCount
| 1-54 | ||||||||||||||||||
154 | if (__builtin_expect(!!(!
| 0-54 | ||||||||||||||||||
155 | QMessageLogger(__FILE__, 192200, __PRETTY_FUNCTION__).fatal("Shader snippet for %s (#%d) is missing!", | - | ||||||||||||||||||
156 | snippetNameStr(SnippetName(i)).constData(), i); | - | ||||||||||||||||||
157 | } never executed: end of block | 0 | ||||||||||||||||||
158 | } executed 54 times by 1 test: end of block Executed by:
| 54 | ||||||||||||||||||
159 | - | |||||||||||||||||||
160 | snippetsPopulated = true; | - | ||||||||||||||||||
161 | } executed 1 time by 1 test: end of block Executed by:
| 1 | ||||||||||||||||||
162 | - | |||||||||||||||||||
163 | QGLShader* fragShader; | - | ||||||||||||||||||
164 | QGLShader* vertexShader; | - | ||||||||||||||||||
165 | QByteArray vertexSource; | - | ||||||||||||||||||
166 | QByteArray fragSource; | - | ||||||||||||||||||
167 | - | |||||||||||||||||||
168 | - | |||||||||||||||||||
169 | vertexSource.append(qShaderSnippets[MainVertexShader]); | - | ||||||||||||||||||
170 | vertexSource.append(qShaderSnippets[PositionOnlyVertexShader]); | - | ||||||||||||||||||
171 | - | |||||||||||||||||||
172 | fragSource.append(qShaderSnippets[MainFragmentShader]); | - | ||||||||||||||||||
173 | fragSource.append(qShaderSnippets[ShockingPinkSrcFragmentShader]); | - | ||||||||||||||||||
174 | - | |||||||||||||||||||
175 | simpleShaderProg = new QGLShaderProgram(context, 0); | - | ||||||||||||||||||
176 | - | |||||||||||||||||||
177 | CachedShader simpleShaderCache(fragSource, vertexSource); | - | ||||||||||||||||||
178 | - | |||||||||||||||||||
179 | bool inCache = simpleShaderCache.load(simpleShaderProg, context); | - | ||||||||||||||||||
180 | - | |||||||||||||||||||
181 | if (!inCache
| 0-1 | ||||||||||||||||||
182 | vertexShader = new QGLShader(QGLShader::Vertex, context, 0); | - | ||||||||||||||||||
183 | shaders.append(vertexShader); | - | ||||||||||||||||||
184 | if (!vertexShader->compileSourceCode(vertexSource)
| 0-1 | ||||||||||||||||||
185 | QMessageLogger(__FILE__, 222230, __PRETTY_FUNCTION__).warning("Vertex shader for simpleShaderProg (MainVertexShader & PositionOnlyVertexShader) failed to compile"); never executed: QMessageLogger(__FILE__, 230, __PRETTY_FUNCTION__).warning("Vertex shader for simpleShaderProg (MainVertexShader & PositionOnlyVertexShader) failed to compile"); | 0 | ||||||||||||||||||
186 | - | |||||||||||||||||||
187 | fragShader = new QGLShader(QGLShader::Fragment, context, 0); | - | ||||||||||||||||||
188 | shaders.append(fragShader); | - | ||||||||||||||||||
189 | if (!fragShader->compileSourceCode(fragSource)
| 0-1 | ||||||||||||||||||
190 | QMessageLogger(__FILE__, 227235, __PRETTY_FUNCTION__).warning("Fragment shader for simpleShaderProg (MainFragmentShader & ShockingPinkSrcFragmentShader) failed to compile"); never executed: QMessageLogger(__FILE__, 235, __PRETTY_FUNCTION__).warning("Fragment shader for simpleShaderProg (MainFragmentShader & ShockingPinkSrcFragmentShader) failed to compile"); | 0 | ||||||||||||||||||
191 | - | |||||||||||||||||||
192 | simpleShaderProg->addShader(vertexShader); | - | ||||||||||||||||||
193 | simpleShaderProg->addShader(fragShader); | - | ||||||||||||||||||
194 | - | |||||||||||||||||||
195 | simpleShaderProg->bindAttributeLocation("vertexCoordsArray", QT_VERTEX_COORDS_ATTR); | - | ||||||||||||||||||
196 | simpleShaderProg->bindAttributeLocation("pmvMatrix1", QT_PMV_MATRIX_1_ATTR); | - | ||||||||||||||||||
197 | simpleShaderProg->bindAttributeLocation("pmvMatrix2", QT_PMV_MATRIX_2_ATTR); | - | ||||||||||||||||||
198 | simpleShaderProg->bindAttributeLocation("pmvMatrix3", QT_PMV_MATRIX_3_ATTR); | - | ||||||||||||||||||
199 | } executed 1 time by 1 test: end of block Executed by:
| 1 | ||||||||||||||||||
200 | - | |||||||||||||||||||
201 | simpleShaderProg->link(); | - | ||||||||||||||||||
202 | - | |||||||||||||||||||
203 | if (__builtin_expect(!!(!
| 0-1 | ||||||||||||||||||
if (!inCache)
| ||||||||||||||||||||
simpleShaderCache.store(simpleShaderProg, context);
| ||||||||||||||||||||
} else
| ||||||||||||||||||||
204 | QMessageLogger(__FILE__, 244249, __PRETTY_FUNCTION__).critical("Errors linking simple shader: %s", QString(simpleShaderProg->log()).toLocal8Bit().constData()); | - | ||||||||||||||||||
205 | } never executed: else {end of block | 0 | ||||||||||||||||||
206 | if (!inCache
| 0-1 | ||||||||||||||||||
207 | simpleShaderCache.store(simpleShaderProg, context); executed 1 time by 1 test: simpleShaderCache.store(simpleShaderProg, context); Executed by:
| 1 | ||||||||||||||||||
208 | } executed 1 time by 1 test: end of block Executed by:
| 1 | ||||||||||||||||||
209 | - | |||||||||||||||||||
210 | - | |||||||||||||||||||
211 | vertexSource.clear(); | - | ||||||||||||||||||
212 | vertexSource.append(qShaderSnippets[MainWithTexCoordsVertexShader]); | - | ||||||||||||||||||
213 | vertexSource.append(qShaderSnippets[UntransformedPositionVertexShader]); | - | ||||||||||||||||||
214 | - | |||||||||||||||||||
215 | fragSource.clear(); | - | ||||||||||||||||||
216 | fragSource.append(qShaderSnippets[MainFragmentShader]); | - | ||||||||||||||||||
217 | fragSource.append(qShaderSnippets[ImageSrcFragmentShader]); | - | ||||||||||||||||||
218 | - | |||||||||||||||||||
219 | blitShaderProg = new QGLShaderProgram(context, 0); | - | ||||||||||||||||||
220 | - | |||||||||||||||||||
221 | CachedShader blitShaderCache(fragSource, vertexSource); | - | ||||||||||||||||||
222 | - | |||||||||||||||||||
223 | inCache = blitShaderCache.load(blitShaderProg, context); | - | ||||||||||||||||||
224 | - | |||||||||||||||||||
225 | if (!inCache
| 0-1 | ||||||||||||||||||
226 | vertexShader = new QGLShader(QGLShader::Vertex, context, 0); | - | ||||||||||||||||||
227 | shaders.append(vertexShader); | - | ||||||||||||||||||
228 | if (!vertexShader->compileSourceCode(vertexSource)
| 0-1 | ||||||||||||||||||
229 | QMessageLogger(__FILE__, 266274, __PRETTY_FUNCTION__).warning("Vertex shader for blitShaderProg (MainWithTexCoordsVertexShader & UntransformedPositionVertexShader) failed to compile"); never executed: QMessageLogger(__FILE__, 274, __PRETTY_FUNCTION__).warning("Vertex shader for blitShaderProg (MainWithTexCoordsVertexShader & UntransformedPositionVertexShader) failed to compile"); | 0 | ||||||||||||||||||
230 | - | |||||||||||||||||||
231 | fragShader = new QGLShader(QGLShader::Fragment, context, 0); | - | ||||||||||||||||||
232 | shaders.append(fragShader); | - | ||||||||||||||||||
233 | if (!fragShader->compileSourceCode(fragSource)
| 0-1 | ||||||||||||||||||
234 | QMessageLogger(__FILE__, 271279, __PRETTY_FUNCTION__).warning("Fragment shader for blitShaderProg (MainFragmentShader & ImageSrcFragmentShader) failed to compile"); never executed: QMessageLogger(__FILE__, 279, __PRETTY_FUNCTION__).warning("Fragment shader for blitShaderProg (MainFragmentShader & ImageSrcFragmentShader) failed to compile"); | 0 | ||||||||||||||||||
235 | - | |||||||||||||||||||
236 | blitShaderProg->addShader(vertexShader); | - | ||||||||||||||||||
237 | blitShaderProg->addShader(fragShader); | - | ||||||||||||||||||
238 | - | |||||||||||||||||||
239 | blitShaderProg->bindAttributeLocation("textureCoordArray", QT_TEXTURE_COORDS_ATTR); | - | ||||||||||||||||||
240 | blitShaderProg->bindAttributeLocation("vertexCoordsArray", QT_VERTEX_COORDS_ATTR); | - | ||||||||||||||||||
241 | } executed 1 time by 1 test: end of block Executed by:
| 1 | ||||||||||||||||||
242 | - | |||||||||||||||||||
243 | blitShaderProg->link(); | - | ||||||||||||||||||
244 | if (__builtin_expect(!!(!
| 0-1 | ||||||||||||||||||
if (!inCache)
| ||||||||||||||||||||
blitShaderCache.store(blitShaderProg, context);
| ||||||||||||||||||||
} else
| ||||||||||||||||||||
245 | QMessageLogger(__FILE__, 285290, __PRETTY_FUNCTION__).critical("Errors linking blit shader: %s", QString(blitShaderProg->log()).toLocal8Bit().constData()); | - | ||||||||||||||||||
246 | } never executed: else {end of block | 0 | ||||||||||||||||||
247 | if (!inCache
| 0-1 | ||||||||||||||||||
248 | blitShaderCache.store(blitShaderProg, context); executed 1 time by 1 test: blitShaderCache.store(blitShaderProg, context); Executed by:
| 1 | ||||||||||||||||||
249 | } executed 1 time by 1 test: end of block Executed by:
| 1 | ||||||||||||||||||
250 | - | |||||||||||||||||||
251 | - | |||||||||||||||||||
252 | - | |||||||||||||||||||
253 | - | |||||||||||||||||||
254 | } | - | ||||||||||||||||||
255 | - | |||||||||||||||||||
256 | QGLEngineSharedShaders::~QGLEngineSharedShaders() | - | ||||||||||||||||||
257 | { | - | ||||||||||||||||||
258 | - | |||||||||||||||||||
259 | - | |||||||||||||||||||
260 | - | |||||||||||||||||||
261 | qDeleteAll(shaders); | - | ||||||||||||||||||
262 | shaders.clear(); | - | ||||||||||||||||||
263 | - | |||||||||||||||||||
264 | qDeleteAll(cachedPrograms); | - | ||||||||||||||||||
265 | cachedPrograms.clear(); | - | ||||||||||||||||||
266 | - | |||||||||||||||||||
267 | if (blitShaderProg) { | - | ||||||||||||||||||
268 | delete blitShaderProg; | - | ||||||||||||||||||
269 | blitShaderProg = 0; | - | ||||||||||||||||||
270 | } | - | ||||||||||||||||||
271 | - | |||||||||||||||||||
272 | if (simpleShaderProg) { | - | ||||||||||||||||||
273 | delete simpleShaderProg; | - | ||||||||||||||||||
274 | simpleShaderProg = 0; | - | ||||||||||||||||||
275 | } | - | ||||||||||||||||||
276 | } | - | ||||||||||||||||||
277 | - | |||||||||||||||||||
278 | - | |||||||||||||||||||
279 | QByteArray QGLEngineSharedShaders::snippetNameStr(SnippetName name) | - | ||||||||||||||||||
280 | { | - | ||||||||||||||||||
281 | QMetaEnum m = staticMetaObject.enumerator(staticMetaObject.indexOfEnumerator("SnippetName")); | - | ||||||||||||||||||
282 | return QByteArray(m.valueToKey(name)); | - | ||||||||||||||||||
283 | } | - | ||||||||||||||||||
284 | - | |||||||||||||||||||
285 | - | |||||||||||||||||||
286 | - | |||||||||||||||||||
287 | - | |||||||||||||||||||
288 | QGLEngineShaderProg *QGLEngineSharedShaders::findProgramInCache(const QGLEngineShaderProg &prog) | - | ||||||||||||||||||
289 | { | - | ||||||||||||||||||
290 | for (int i = 0; i < cachedPrograms.size()
| 1-2 | ||||||||||||||||||
291 | QGLEngineShaderProg *cachedProg = cachedPrograms[.at(i];); | - | ||||||||||||||||||
292 | if (*
| 0-2 | ||||||||||||||||||
293 | - | |||||||||||||||||||
294 | cachedPrograms.move(i, 0); | - | ||||||||||||||||||
295 | cachedProg->program->bind(); | - | ||||||||||||||||||
296 | return executed 2 times by 1 test: cachedProg;return cachedProg; Executed by:
executed 2 times by 1 test: return cachedProg; Executed by:
| 2 | ||||||||||||||||||
297 | } | - | ||||||||||||||||||
298 | } never executed: end of block | 0 | ||||||||||||||||||
299 | - | |||||||||||||||||||
300 | QScopedPointer<QGLEngineShaderProg> newProg; | - | ||||||||||||||||||
301 | - | |||||||||||||||||||
302 | do { | - | ||||||||||||||||||
303 | QByteArray fragSource; | - | ||||||||||||||||||
304 | - | |||||||||||||||||||
305 | - | |||||||||||||||||||
306 | if (prog.srcPixelFragShader == CustomImageSrcFragmentShader
| 0-1 | ||||||||||||||||||
307 | fragSource.append(prog.customStageSource); never executed: fragSource.append(prog.customStageSource); | 0 | ||||||||||||||||||
308 | fragSource.append(qShaderSnippets[prog.mainFragShader]); | - | ||||||||||||||||||
309 | fragSource.append(qShaderSnippets[prog.srcPixelFragShader]); | - | ||||||||||||||||||
310 | if (prog.compositionFragShader
| 0-1 | ||||||||||||||||||
311 | fragSource.append(qShaderSnippets[prog.compositionFragShader]); executed 1 time by 1 test: fragSource.append(qShaderSnippets[prog.compositionFragShader]); Executed by:
| 1 | ||||||||||||||||||
312 | if (prog.maskFragShader
| 0-1 | ||||||||||||||||||
313 | fragSource.append(qShaderSnippets[prog.maskFragShader]); executed 1 time by 1 test: fragSource.append(qShaderSnippets[prog.maskFragShader]); Executed by:
| 1 | ||||||||||||||||||
314 | - | |||||||||||||||||||
315 | QByteArray vertexSource; | - | ||||||||||||||||||
316 | vertexSource.append(qShaderSnippets[prog.mainVertexShader]); | - | ||||||||||||||||||
317 | vertexSource.append(qShaderSnippets[prog.positionVertexShader]); | - | ||||||||||||||||||
318 | - | |||||||||||||||||||
319 | QScopedPointer<QGLShaderProgram> shaderProgram(new QGLShaderProgram); | - | ||||||||||||||||||
320 | - | |||||||||||||||||||
321 | CachedShader shaderCache(fragSource, vertexSource); | - | ||||||||||||||||||
322 | bool inCache = shaderCache.load(shaderProgram.data(), QGLContext::currentContext()); | - | ||||||||||||||||||
323 | - | |||||||||||||||||||
324 | if (!inCache
| 0-1 | ||||||||||||||||||
325 | - | |||||||||||||||||||
326 | QScopedPointer<QGLShader> fragShader(new QGLShader(QGLShader::Fragment)); | - | ||||||||||||||||||
327 | QByteArray description; | - | ||||||||||||||||||
328 | - | |||||||||||||||||||
329 | - | |||||||||||||||||||
330 | description.append("Fragment shader: main="); | - | ||||||||||||||||||
331 | description.append(snippetNameStr(prog.mainFragShader)); | - | ||||||||||||||||||
332 | description.append(", srcPixel="); | - | ||||||||||||||||||
333 | description.append(snippetNameStr(prog.srcPixelFragShader)); | - | ||||||||||||||||||
334 | if (prog.compositionFragShader
| 0-1 | ||||||||||||||||||
335 | description.append(", composition="); | - | ||||||||||||||||||
336 | description.append(snippetNameStr(prog.compositionFragShader)); | - | ||||||||||||||||||
337 | } executed 1 time by 1 test: end of block Executed by:
| 1 | ||||||||||||||||||
338 | if (prog.maskFragShader
| 0-1 | ||||||||||||||||||
339 | description.append(", mask="); | - | ||||||||||||||||||
340 | description.append(snippetNameStr(prog.maskFragShader)); | - | ||||||||||||||||||
341 | } executed 1 time by 1 test: end of block Executed by:
| 1 | ||||||||||||||||||
342 | fragShader->setObjectName(QString::fromLatin1(description)); | - | ||||||||||||||||||
343 | - | |||||||||||||||||||
344 | if (!fragShader->compileSourceCode(fragSource)
| 0-1 | ||||||||||||||||||
345 | QMessageLogger(__FILE__, 382390, __PRETTY_FUNCTION__).warning() << "Warning:" << description << "failed to compile!"; | - | ||||||||||||||||||
346 | break; never executed: break; | 0 | ||||||||||||||||||
347 | } | - | ||||||||||||||||||
348 | - | |||||||||||||||||||
349 | QScopedPointer<QGLShader> vertexShader(new QGLShader(QGLShader::Vertex)); | - | ||||||||||||||||||
350 | - | |||||||||||||||||||
351 | - | |||||||||||||||||||
352 | description.clear(); | - | ||||||||||||||||||
353 | description.append("Vertex shader: main="); | - | ||||||||||||||||||
354 | description.append(snippetNameStr(prog.mainVertexShader)); | - | ||||||||||||||||||
355 | description.append(", position="); | - | ||||||||||||||||||
356 | description.append(snippetNameStr(prog.positionVertexShader)); | - | ||||||||||||||||||
357 | vertexShader->setObjectName(QString::fromLatin1(description)); | - | ||||||||||||||||||
358 | - | |||||||||||||||||||
359 | if (!vertexShader->compileSourceCode(vertexSource)
| 0-1 | ||||||||||||||||||
360 | QMessageLogger(__FILE__, 397405, __PRETTY_FUNCTION__).warning() << "Warning:" << description << "failed to compile!"; | - | ||||||||||||||||||
361 | break; never executed: break; | 0 | ||||||||||||||||||
362 | } | - | ||||||||||||||||||
363 | - | |||||||||||||||||||
364 | shaders.append(vertexShader.data()); | - | ||||||||||||||||||
365 | shaders.append(fragShader.data()); | - | ||||||||||||||||||
366 | shaderProgram->addShader(vertexShader.take()); | - | ||||||||||||||||||
367 | shaderProgram->addShader(fragShader.take()); | - | ||||||||||||||||||
368 | - | |||||||||||||||||||
369 | - | |||||||||||||||||||
370 | shaderProgram->bindAttributeLocation("vertexCoordsArray", QT_VERTEX_COORDS_ATTR); | - | ||||||||||||||||||
371 | if (prog.useTextureCoords
| 0-1 | ||||||||||||||||||
372 | shaderProgram->bindAttributeLocation("textureCoordArray", QT_TEXTURE_COORDS_ATTR); never executed: shaderProgram->bindAttributeLocation("textureCoordArray", QT_TEXTURE_COORDS_ATTR); | 0 | ||||||||||||||||||
373 | if (prog.useOpacityAttribute
| 0-1 | ||||||||||||||||||
374 | shaderProgram->bindAttributeLocation("opacityArray", QT_OPACITY_ATTR); never executed: shaderProgram->bindAttributeLocation("opacityArray", QT_OPACITY_ATTR); | 0 | ||||||||||||||||||
375 | if (prog.usePmvMatrixAttribute
| 0-1 | ||||||||||||||||||
376 | shaderProgram->bindAttributeLocation("pmvMatrix1", QT_PMV_MATRIX_1_ATTR); | - | ||||||||||||||||||
377 | shaderProgram->bindAttributeLocation("pmvMatrix2", QT_PMV_MATRIX_2_ATTR); | - | ||||||||||||||||||
378 | shaderProgram->bindAttributeLocation("pmvMatrix3", QT_PMV_MATRIX_3_ATTR); | - | ||||||||||||||||||
379 | } executed 1 time by 1 test: end of block Executed by:
| 1 | ||||||||||||||||||
380 | } executed 1 time by 1 test: end of block Executed by:
| 1 | ||||||||||||||||||
381 | - | |||||||||||||||||||
382 | newProg.reset(new QGLEngineShaderProg(prog)); | - | ||||||||||||||||||
383 | newProg->program = shaderProgram.take(); | - | ||||||||||||||||||
384 | - | |||||||||||||||||||
385 | newProg->program->link(); | - | ||||||||||||||||||
386 | if (newProg->program->isLinked()
| 0-1 | ||||||||||||||||||
387 | if (!inCache
| 0-1 | ||||||||||||||||||
388 | shaderCache.store(newProg->program, QGLContext::currentContext()); executed 1 time by 1 test: shaderCache.store(newProg->program, QGLContext::currentContext()); Executed by:
| 1 | ||||||||||||||||||
389 | } executed 1 time by 1 test: else {end of block Executed by:
| 1 | ||||||||||||||||||
390 | QString error; | - | ||||||||||||||||||
391 | error = QLatin1String("Shader program failed to link,"); | - | ||||||||||||||||||
392 | - | |||||||||||||||||||
393 | QLatin1String br("\n"); | - | ||||||||||||||||||
394 | error += QLatin1String("\n Shaders Used:\n"); | - | ||||||||||||||||||
395 | for (int i = 0; i < newProg->program->shaders().count()
| 0 | ||||||||||||||||||
396 | QGLShader *shader = newProg->program->shaders().at(i); | - | ||||||||||||||||||
397 | error += QLatin1String(" ") + shader->objectName() + QLatin1String(": \n") | - | ||||||||||||||||||
398 | + QLatin1String(shader->sourceCode()) + br; | - | ||||||||||||||||||
399 | } never executed: end of block | 0 | ||||||||||||||||||
400 | - | |||||||||||||||||||
401 | error += QLatin1String(" Error Log:\n") | - | ||||||||||||||||||
402 | + QLatin1String(" ") + newProg->program->log(); | - | ||||||||||||||||||
403 | QMessageLogger(__FILE__, 440448, __PRETTY_FUNCTION__).warning() << error; | - | ||||||||||||||||||
404 | break; never executed: break; | 0 | ||||||||||||||||||
405 | } | - | ||||||||||||||||||
406 | - | |||||||||||||||||||
407 | newProg->program->bind(); | - | ||||||||||||||||||
408 | - | |||||||||||||||||||
409 | if (newProg->maskFragShader != QGLEngineSharedShaders::NoMaskFragmentShader
| 0-1 | ||||||||||||||||||
410 | GLuint location = newProg->program->uniformLocation("maskTexture"); | - | ||||||||||||||||||
411 | newProg->program->setUniformValue(location, GLuint(1)); | - | ||||||||||||||||||
412 | } never executed: end of block | 0 | ||||||||||||||||||
413 | - | |||||||||||||||||||
414 | if (cachedPrograms.count() > 30
| 0-1 | ||||||||||||||||||
415 | - | |||||||||||||||||||
416 | - | |||||||||||||||||||
417 | - | |||||||||||||||||||
418 | for (int i = 0; i < 5
| 0 | ||||||||||||||||||
419 | delete cachedPrograms.last(); | - | ||||||||||||||||||
420 | cachedPrograms.removeLast(); | - | ||||||||||||||||||
421 | } never executed: end of block | 0 | ||||||||||||||||||
422 | } never executed: end of block | 0 | ||||||||||||||||||
423 | - | |||||||||||||||||||
424 | cachedPrograms.insert(0, newProg.data()); | - | ||||||||||||||||||
425 | } while (false); | - | ||||||||||||||||||
426 | - | |||||||||||||||||||
427 | return executed 1 time by 1 test: newProg.take();return newProg.take(); Executed by:
executed 1 time by 1 test: return newProg.take(); Executed by:
| 1 | ||||||||||||||||||
428 | } | - | ||||||||||||||||||
429 | - | |||||||||||||||||||
430 | void QGLEngineSharedShaders::cleanupCustomStage(QGLCustomShaderStage* stage) | - | ||||||||||||||||||
431 | { | - | ||||||||||||||||||
432 | for (int iauto hasStageAsCustomShaderSouce = 0; i < cachedPrograms.size(); ++i) {[stage](QGLEngineShaderProg *cachedProg= cachedPrograms[i];) -> bool { | - | ||||||||||||||||||
433 | if (cachedProg->customStageSource == stage->source()
| 0 | ||||||||||||||||||
434 | delete cachedProg; | - | ||||||||||||||||||
435 | return never executed: true;return true; never executed: return true; | 0 | ||||||||||||||||||
436 | } | - | ||||||||||||||||||
437 | return never executed: falsereturn false; never executed: return false; never executed: ;return false; never executed: return false; | 0 | ||||||||||||||||||
438 | }; | - | ||||||||||||||||||
439 | cachedPrograms.removeAterase(i); | - | ||||||||||||||||||
i--; | ||||||||||||||||||||
} | ||||||||||||||||||||
}std::remove_if(cachedPrograms.begin(), cachedPrograms.end(), | ||||||||||||||||||||
440 | hasStageAsCustomShaderSouce), | - | ||||||||||||||||||
441 | cachedPrograms.end()); | - | ||||||||||||||||||
442 | } never executed: end of block | 0 | ||||||||||||||||||
443 | - | |||||||||||||||||||
444 | - | |||||||||||||||||||
445 | QGLEngineShaderManager::QGLEngineShaderManager(QGLContext* context) | - | ||||||||||||||||||
446 | : ctx(context), | - | ||||||||||||||||||
447 | shaderProgNeedsChanging(true), | - | ||||||||||||||||||
448 | complexGeometry(false), | - | ||||||||||||||||||
449 | srcPixelType(Qt::NoBrush), | - | ||||||||||||||||||
450 | opacityMode(NoOpacity), | - | ||||||||||||||||||
451 | maskType(NoMask), | - | ||||||||||||||||||
452 | compositionMode(QPainter::CompositionMode_SourceOver), | - | ||||||||||||||||||
453 | customSrcStage(0), | - | ||||||||||||||||||
454 | currentShaderProg(0) | - | ||||||||||||||||||
455 | { | - | ||||||||||||||||||
456 | sharedShaders = QGLEngineSharedShaders::shadersForContext(context); | - | ||||||||||||||||||
457 | } | - | ||||||||||||||||||
458 | - | |||||||||||||||||||
459 | QGLEngineShaderManager::~QGLEngineShaderManager() | - | ||||||||||||||||||
460 | { | - | ||||||||||||||||||
461 | - | |||||||||||||||||||
462 | removeCustomStage(); | - | ||||||||||||||||||
463 | } | - | ||||||||||||||||||
464 | - | |||||||||||||||||||
465 | GLuint QGLEngineShaderManager::getUniformLocation(Uniform id) | - | ||||||||||||||||||
466 | { | - | ||||||||||||||||||
467 | if (!currentShaderProg) | - | ||||||||||||||||||
468 | return 0; | - | ||||||||||||||||||
469 | - | |||||||||||||||||||
470 | QVector<uint> &uniformLocations = currentShaderProg->uniformLocations; | - | ||||||||||||||||||
471 | if (uniformLocations.isEmpty()) | - | ||||||||||||||||||
472 | uniformLocations.fill(GLuint(-1), NumUniforms); | - | ||||||||||||||||||
473 | - | |||||||||||||||||||
474 | static const char *const uniformNames[] = { | - | ||||||||||||||||||
475 | "imageTexture", | - | ||||||||||||||||||
476 | "patternColor", | - | ||||||||||||||||||
477 | "globalOpacity", | - | ||||||||||||||||||
478 | "depth", | - | ||||||||||||||||||
479 | "maskTexture", | - | ||||||||||||||||||
480 | "fragmentColor", | - | ||||||||||||||||||
481 | "linearData", | - | ||||||||||||||||||
482 | "angle", | - | ||||||||||||||||||
483 | "halfViewportSize", | - | ||||||||||||||||||
484 | "fmp", | - | ||||||||||||||||||
485 | "fmp2_m_radius2", | - | ||||||||||||||||||
486 | "inverse_2_fmp2_m_radius2", | - | ||||||||||||||||||
487 | "sqrfr", | - | ||||||||||||||||||
488 | "bradius", | - | ||||||||||||||||||
489 | "invertedTextureSize", | - | ||||||||||||||||||
490 | "brushTransform", | - | ||||||||||||||||||
491 | "brushTexture", | - | ||||||||||||||||||
492 | "matrix", | - | ||||||||||||||||||
493 | "translateZ" | - | ||||||||||||||||||
494 | }; | - | ||||||||||||||||||
495 | - | |||||||||||||||||||
496 | if (uniformLocations.at(id) == GLuint(-1)) | - | ||||||||||||||||||
497 | uniformLocations[id] = currentShaderProg->program->uniformLocation(uniformNames[id]); | - | ||||||||||||||||||
498 | - | |||||||||||||||||||
499 | return uniformLocations.at(id); | - | ||||||||||||||||||
500 | } | - | ||||||||||||||||||
501 | - | |||||||||||||||||||
502 | - | |||||||||||||||||||
503 | void QGLEngineShaderManager::optimiseForBrushTransform(QTransform::TransformationType transformType) | - | ||||||||||||||||||
504 | { | - | ||||||||||||||||||
505 | (void)transformType;; | - | ||||||||||||||||||
506 | } | - | ||||||||||||||||||
507 | - | |||||||||||||||||||
508 | void QGLEngineShaderManager::setDirty() | - | ||||||||||||||||||
509 | { | - | ||||||||||||||||||
510 | shaderProgNeedsChanging = true; | - | ||||||||||||||||||
511 | } | - | ||||||||||||||||||
512 | - | |||||||||||||||||||
513 | void QGLEngineShaderManager::setSrcPixelType(Qt::BrushStyle style) | - | ||||||||||||||||||
514 | { | - | ||||||||||||||||||
515 | ((!(style != Qt::NoBrush)) ? qt_assert("style != Qt::NoBrush",__FILE__,551560) : qt_noop()); | - | ||||||||||||||||||
516 | if (srcPixelType == PixelSrcType(style)) | - | ||||||||||||||||||
517 | return; | - | ||||||||||||||||||
518 | - | |||||||||||||||||||
519 | srcPixelType = style; | - | ||||||||||||||||||
520 | shaderProgNeedsChanging = true; | - | ||||||||||||||||||
521 | } | - | ||||||||||||||||||
522 | - | |||||||||||||||||||
523 | void QGLEngineShaderManager::setSrcPixelType(PixelSrcType type) | - | ||||||||||||||||||
524 | { | - | ||||||||||||||||||
525 | if (srcPixelType == type) | - | ||||||||||||||||||
526 | return; | - | ||||||||||||||||||
527 | - | |||||||||||||||||||
528 | srcPixelType = type; | - | ||||||||||||||||||
529 | shaderProgNeedsChanging = true; | - | ||||||||||||||||||
530 | } | - | ||||||||||||||||||
531 | - | |||||||||||||||||||
532 | void QGLEngineShaderManager::setOpacityMode(OpacityMode mode) | - | ||||||||||||||||||
533 | { | - | ||||||||||||||||||
534 | if (opacityMode == mode) | - | ||||||||||||||||||
535 | return; | - | ||||||||||||||||||
536 | - | |||||||||||||||||||
537 | opacityMode = mode; | - | ||||||||||||||||||
538 | shaderProgNeedsChanging = true; | - | ||||||||||||||||||
539 | } | - | ||||||||||||||||||
540 | - | |||||||||||||||||||
541 | void QGLEngineShaderManager::setMaskType(MaskType type) | - | ||||||||||||||||||
542 | { | - | ||||||||||||||||||
543 | if (maskType == type) | - | ||||||||||||||||||
544 | return; | - | ||||||||||||||||||
545 | - | |||||||||||||||||||
546 | maskType = type; | - | ||||||||||||||||||
547 | shaderProgNeedsChanging = true; | - | ||||||||||||||||||
548 | } | - | ||||||||||||||||||
549 | - | |||||||||||||||||||
550 | void QGLEngineShaderManager::setCompositionMode(QPainter::CompositionMode mode) | - | ||||||||||||||||||
551 | { | - | ||||||||||||||||||
552 | if (compositionMode == mode) | - | ||||||||||||||||||
553 | return; | - | ||||||||||||||||||
554 | - | |||||||||||||||||||
555 | compositionMode = mode; | - | ||||||||||||||||||
556 | shaderProgNeedsChanging = true; | - | ||||||||||||||||||
557 | } | - | ||||||||||||||||||
558 | - | |||||||||||||||||||
559 | void QGLEngineShaderManager::setCustomStage(QGLCustomShaderStage* stage) | - | ||||||||||||||||||
560 | { | - | ||||||||||||||||||
561 | if (customSrcStage) | - | ||||||||||||||||||
562 | removeCustomStage(); | - | ||||||||||||||||||
563 | customSrcStage = stage; | - | ||||||||||||||||||
564 | shaderProgNeedsChanging = true; | - | ||||||||||||||||||
565 | } | - | ||||||||||||||||||
566 | - | |||||||||||||||||||
567 | void QGLEngineShaderManager::removeCustomStage() | - | ||||||||||||||||||
568 | { | - | ||||||||||||||||||
569 | if (customSrcStage) | - | ||||||||||||||||||
570 | customSrcStage->setInactive(); | - | ||||||||||||||||||
571 | customSrcStage = 0; | - | ||||||||||||||||||
572 | shaderProgNeedsChanging = true; | - | ||||||||||||||||||
573 | } | - | ||||||||||||||||||
574 | - | |||||||||||||||||||
575 | QGLShaderProgram* QGLEngineShaderManager::currentProgram() | - | ||||||||||||||||||
576 | { | - | ||||||||||||||||||
577 | if (currentShaderProg) | - | ||||||||||||||||||
578 | return currentShaderProg->program; | - | ||||||||||||||||||
579 | else | - | ||||||||||||||||||
580 | return sharedShaders->simpleProgram(); | - | ||||||||||||||||||
581 | } | - | ||||||||||||||||||
582 | - | |||||||||||||||||||
583 | void QGLEngineShaderManager::useSimpleProgram() | - | ||||||||||||||||||
584 | { | - | ||||||||||||||||||
585 | sharedShaders->simpleProgram()->bind(); | - | ||||||||||||||||||
586 | QGLContextPrivate* ctx_d = ctx->d_func(); | - | ||||||||||||||||||
587 | ctx_d->setVertexAttribArrayEnabled(QT_VERTEX_COORDS_ATTR, true); | - | ||||||||||||||||||
588 | ctx_d->setVertexAttribArrayEnabled(QT_TEXTURE_COORDS_ATTR, false); | - | ||||||||||||||||||
589 | ctx_d->setVertexAttribArrayEnabled(QT_OPACITY_ATTR, false); | - | ||||||||||||||||||
590 | shaderProgNeedsChanging = true; | - | ||||||||||||||||||
591 | } | - | ||||||||||||||||||
592 | - | |||||||||||||||||||
593 | void QGLEngineShaderManager::useBlitProgram() | - | ||||||||||||||||||
594 | { | - | ||||||||||||||||||
595 | sharedShaders->blitProgram()->bind(); | - | ||||||||||||||||||
596 | QGLContextPrivate* ctx_d = ctx->d_func(); | - | ||||||||||||||||||
597 | ctx_d->setVertexAttribArrayEnabled(QT_VERTEX_COORDS_ATTR, true); | - | ||||||||||||||||||
598 | ctx_d->setVertexAttribArrayEnabled(QT_TEXTURE_COORDS_ATTR, true); | - | ||||||||||||||||||
599 | ctx_d->setVertexAttribArrayEnabled(QT_OPACITY_ATTR, false); | - | ||||||||||||||||||
600 | shaderProgNeedsChanging = true; | - | ||||||||||||||||||
601 | } | - | ||||||||||||||||||
602 | - | |||||||||||||||||||
603 | QGLShaderProgram* QGLEngineShaderManager::simpleProgram() | - | ||||||||||||||||||
604 | { | - | ||||||||||||||||||
605 | return sharedShaders->simpleProgram(); | - | ||||||||||||||||||
606 | } | - | ||||||||||||||||||
607 | - | |||||||||||||||||||
608 | QGLShaderProgram* QGLEngineShaderManager::blitProgram() | - | ||||||||||||||||||
609 | { | - | ||||||||||||||||||
610 | return sharedShaders->blitProgram(); | - | ||||||||||||||||||
611 | } | - | ||||||||||||||||||
612 | - | |||||||||||||||||||
613 | - | |||||||||||||||||||
614 | - | |||||||||||||||||||
615 | - | |||||||||||||||||||
616 | - | |||||||||||||||||||
617 | bool QGLEngineShaderManager::useCorrectShaderProg() | - | ||||||||||||||||||
618 | { | - | ||||||||||||||||||
619 | if (!shaderProgNeedsChanging) | - | ||||||||||||||||||
620 | return false; | - | ||||||||||||||||||
621 | - | |||||||||||||||||||
622 | bool useCustomSrc = customSrcStage != 0; | - | ||||||||||||||||||
623 | if (useCustomSrc && srcPixelType != QGLEngineShaderManager::ImageSrc && srcPixelType != Qt::TexturePattern) { | - | ||||||||||||||||||
624 | useCustomSrc = false; | - | ||||||||||||||||||
625 | QMessageLogger(__FILE__, 661670, __PRETTY_FUNCTION__).warning("QGLEngineShaderManager - Ignoring custom shader stage for non image src"); | - | ||||||||||||||||||
626 | } | - | ||||||||||||||||||
627 | - | |||||||||||||||||||
628 | QGLEngineShaderProg requiredProgram; | - | ||||||||||||||||||
629 | - | |||||||||||||||||||
630 | bool texCoords = false; | - | ||||||||||||||||||
631 | - | |||||||||||||||||||
632 | - | |||||||||||||||||||
633 | - | |||||||||||||||||||
634 | requiredProgram.positionVertexShader = QGLEngineSharedShaders::InvalidSnippetName; | - | ||||||||||||||||||
635 | requiredProgram.srcPixelFragShader = QGLEngineSharedShaders::InvalidSnippetName; | - | ||||||||||||||||||
636 | bool isAffine = brushTransform.isAffine(); | - | ||||||||||||||||||
637 | if ( (srcPixelType >= Qt::Dense1Pattern) && (srcPixelType <= Qt::DiagCrossPattern) ) { | - | ||||||||||||||||||
638 | if (isAffine) | - | ||||||||||||||||||
639 | requiredProgram.positionVertexShader = QGLEngineSharedShaders::AffinePositionWithPatternBrushVertexShader; | - | ||||||||||||||||||
640 | else | - | ||||||||||||||||||
641 | requiredProgram.positionVertexShader = QGLEngineSharedShaders::PositionWithPatternBrushVertexShader; | - | ||||||||||||||||||
642 | - | |||||||||||||||||||
643 | requiredProgram.srcPixelFragShader = QGLEngineSharedShaders::PatternBrushSrcFragmentShader; | - | ||||||||||||||||||
644 | } | - | ||||||||||||||||||
645 | else switch (srcPixelType) { | - | ||||||||||||||||||
646 | default: | - | ||||||||||||||||||
647 | case Qt::NoBrush: | - | ||||||||||||||||||
648 | QMessageLogger(__FILE__, 684693, __PRETTY_FUNCTION__).fatal("QGLEngineShaderManager::useCorrectShaderProg() - Qt::NoBrush style is set"); | - | ||||||||||||||||||
649 | break; | - | ||||||||||||||||||
650 | case QGLEngineShaderManager::ImageSrc: | - | ||||||||||||||||||
651 | requiredProgram.srcPixelFragShader = QGLEngineSharedShaders::ImageSrcFragmentShader; | - | ||||||||||||||||||
652 | requiredProgram.positionVertexShader = QGLEngineSharedShaders::PositionOnlyVertexShader; | - | ||||||||||||||||||
653 | texCoords = true; | - | ||||||||||||||||||
654 | break; | - | ||||||||||||||||||
655 | case QGLEngineShaderManager::NonPremultipliedImageSrc: | - | ||||||||||||||||||
656 | requiredProgram.srcPixelFragShader = QGLEngineSharedShaders::NonPremultipliedImageSrcFragmentShader; | - | ||||||||||||||||||
657 | requiredProgram.positionVertexShader = QGLEngineSharedShaders::PositionOnlyVertexShader; | - | ||||||||||||||||||
658 | texCoords = true; | - | ||||||||||||||||||
659 | break; | - | ||||||||||||||||||
660 | case QGLEngineShaderManager::PatternSrc: | - | ||||||||||||||||||
661 | requiredProgram.srcPixelFragShader = QGLEngineSharedShaders::ImageSrcWithPatternFragmentShader; | - | ||||||||||||||||||
662 | requiredProgram.positionVertexShader = QGLEngineSharedShaders::PositionOnlyVertexShader; | - | ||||||||||||||||||
663 | texCoords = true; | - | ||||||||||||||||||
664 | break; | - | ||||||||||||||||||
665 | case QGLEngineShaderManager::TextureSrcWithPattern: | - | ||||||||||||||||||
666 | requiredProgram.srcPixelFragShader = QGLEngineSharedShaders::TextureBrushSrcWithPatternFragmentShader; | - | ||||||||||||||||||
667 | requiredProgram.positionVertexShader = isAffine ? QGLEngineSharedShaders::AffinePositionWithTextureBrushVertexShader | - | ||||||||||||||||||
668 | : QGLEngineSharedShaders::PositionWithTextureBrushVertexShader; | - | ||||||||||||||||||
669 | break; | - | ||||||||||||||||||
670 | case Qt::SolidPattern: | - | ||||||||||||||||||
671 | requiredProgram.srcPixelFragShader = QGLEngineSharedShaders::SolidBrushSrcFragmentShader; | - | ||||||||||||||||||
672 | requiredProgram.positionVertexShader = QGLEngineSharedShaders::PositionOnlyVertexShader; | - | ||||||||||||||||||
673 | break; | - | ||||||||||||||||||
674 | case Qt::LinearGradientPattern: | - | ||||||||||||||||||
675 | requiredProgram.srcPixelFragShader = QGLEngineSharedShaders::LinearGradientBrushSrcFragmentShader; | - | ||||||||||||||||||
676 | requiredProgram.positionVertexShader = isAffine ? QGLEngineSharedShaders::AffinePositionWithLinearGradientBrushVertexShader | - | ||||||||||||||||||
677 | : QGLEngineSharedShaders::PositionWithLinearGradientBrushVertexShader; | - | ||||||||||||||||||
678 | break; | - | ||||||||||||||||||
679 | case Qt::ConicalGradientPattern: | - | ||||||||||||||||||
680 | requiredProgram.srcPixelFragShader = QGLEngineSharedShaders::ConicalGradientBrushSrcFragmentShader; | - | ||||||||||||||||||
681 | requiredProgram.positionVertexShader = isAffine ? QGLEngineSharedShaders::AffinePositionWithConicalGradientBrushVertexShader | - | ||||||||||||||||||
682 | : QGLEngineSharedShaders::PositionWithConicalGradientBrushVertexShader; | - | ||||||||||||||||||
683 | break; | - | ||||||||||||||||||
684 | case Qt::RadialGradientPattern: | - | ||||||||||||||||||
685 | requiredProgram.srcPixelFragShader = QGLEngineSharedShaders::RadialGradientBrushSrcFragmentShader; | - | ||||||||||||||||||
686 | requiredProgram.positionVertexShader = isAffine ? QGLEngineSharedShaders::AffinePositionWithRadialGradientBrushVertexShader | - | ||||||||||||||||||
687 | : QGLEngineSharedShaders::PositionWithRadialGradientBrushVertexShader; | - | ||||||||||||||||||
688 | break; | - | ||||||||||||||||||
689 | case Qt::TexturePattern: | - | ||||||||||||||||||
690 | requiredProgram.srcPixelFragShader = QGLEngineSharedShaders::TextureBrushSrcFragmentShader; | - | ||||||||||||||||||
691 | requiredProgram.positionVertexShader = isAffine ? QGLEngineSharedShaders::AffinePositionWithTextureBrushVertexShader | - | ||||||||||||||||||
692 | : QGLEngineSharedShaders::PositionWithTextureBrushVertexShader; | - | ||||||||||||||||||
693 | break; | - | ||||||||||||||||||
694 | }; | - | ||||||||||||||||||
695 | - | |||||||||||||||||||
696 | if (useCustomSrc) { | - | ||||||||||||||||||
697 | requiredProgram.srcPixelFragShader = QGLEngineSharedShaders::CustomImageSrcFragmentShader; | - | ||||||||||||||||||
698 | requiredProgram.customStageSource = customSrcStage->source(); | - | ||||||||||||||||||
699 | } | - | ||||||||||||||||||
700 | - | |||||||||||||||||||
701 | const bool hasCompose = compositionMode > QPainter::CompositionMode_Plus; | - | ||||||||||||||||||
702 | const bool hasMask = maskType != QGLEngineShaderManager::NoMask; | - | ||||||||||||||||||
703 | - | |||||||||||||||||||
704 | - | |||||||||||||||||||
705 | if (opacityMode == AttributeOpacity) { | - | ||||||||||||||||||
706 | ((!(!hasCompose && !hasMask)) ? qt_assert("!hasCompose && !hasMask",__FILE__,742751) : qt_noop()); | - | ||||||||||||||||||
707 | requiredProgram.mainFragShader = QGLEngineSharedShaders::MainFragmentShader_ImageArrays; | - | ||||||||||||||||||
708 | } else { | - | ||||||||||||||||||
709 | bool useGlobalOpacity = (opacityMode == UniformOpacity); | - | ||||||||||||||||||
710 | if (hasCompose && hasMask && useGlobalOpacity) | - | ||||||||||||||||||
711 | requiredProgram.mainFragShader = QGLEngineSharedShaders::MainFragmentShader_CMO; | - | ||||||||||||||||||
712 | if (hasCompose && hasMask && !useGlobalOpacity) | - | ||||||||||||||||||
713 | requiredProgram.mainFragShader = QGLEngineSharedShaders::MainFragmentShader_CM; | - | ||||||||||||||||||
714 | if (!hasCompose && hasMask && useGlobalOpacity) | - | ||||||||||||||||||
715 | requiredProgram.mainFragShader = QGLEngineSharedShaders::MainFragmentShader_MO; | - | ||||||||||||||||||
716 | if (!hasCompose && hasMask && !useGlobalOpacity) | - | ||||||||||||||||||
717 | requiredProgram.mainFragShader = QGLEngineSharedShaders::MainFragmentShader_M; | - | ||||||||||||||||||
718 | if (hasCompose && !hasMask && useGlobalOpacity) | - | ||||||||||||||||||
719 | requiredProgram.mainFragShader = QGLEngineSharedShaders::MainFragmentShader_CO; | - | ||||||||||||||||||
720 | if (hasCompose && !hasMask && !useGlobalOpacity) | - | ||||||||||||||||||
721 | requiredProgram.mainFragShader = QGLEngineSharedShaders::MainFragmentShader_C; | - | ||||||||||||||||||
722 | if (!hasCompose && !hasMask && useGlobalOpacity) | - | ||||||||||||||||||
723 | requiredProgram.mainFragShader = QGLEngineSharedShaders::MainFragmentShader_O; | - | ||||||||||||||||||
724 | if (!hasCompose && !hasMask && !useGlobalOpacity) | - | ||||||||||||||||||
725 | requiredProgram.mainFragShader = QGLEngineSharedShaders::MainFragmentShader; | - | ||||||||||||||||||
726 | } | - | ||||||||||||||||||
727 | - | |||||||||||||||||||
728 | if (hasMask) { | - | ||||||||||||||||||
729 | if (maskType == PixelMask) { | - | ||||||||||||||||||
730 | requiredProgram.maskFragShader = QGLEngineSharedShaders::MaskFragmentShader; | - | ||||||||||||||||||
731 | texCoords = true; | - | ||||||||||||||||||
732 | } else if (maskType == SubPixelMaskPass1) { | - | ||||||||||||||||||
733 | requiredProgram.maskFragShader = QGLEngineSharedShaders::RgbMaskFragmentShaderPass1; | - | ||||||||||||||||||
734 | texCoords = true; | - | ||||||||||||||||||
735 | } else if (maskType == SubPixelMaskPass2) { | - | ||||||||||||||||||
736 | requiredProgram.maskFragShader = QGLEngineSharedShaders::RgbMaskFragmentShaderPass2; | - | ||||||||||||||||||
737 | texCoords = true; | - | ||||||||||||||||||
738 | } else if (maskType == SubPixelWithGammaMask) { | - | ||||||||||||||||||
739 | requiredProgram.maskFragShader = QGLEngineSharedShaders::RgbMaskWithGammaFragmentShader; | - | ||||||||||||||||||
740 | texCoords = true; | - | ||||||||||||||||||
741 | } else { | - | ||||||||||||||||||
742 | QMessageLogger(__FILE__, 778787, __PRETTY_FUNCTION__).critical("QGLEngineShaderManager::useCorrectShaderProg() - Unknown mask type"); | - | ||||||||||||||||||
743 | } | - | ||||||||||||||||||
744 | } else { | - | ||||||||||||||||||
745 | requiredProgram.maskFragShader = QGLEngineSharedShaders::NoMaskFragmentShader; | - | ||||||||||||||||||
746 | } | - | ||||||||||||||||||
747 | - | |||||||||||||||||||
748 | if (hasCompose) { | - | ||||||||||||||||||
749 | switch (compositionMode) { | - | ||||||||||||||||||
750 | case QPainter::CompositionMode_Multiply: | - | ||||||||||||||||||
751 | requiredProgram.compositionFragShader = QGLEngineSharedShaders::MultiplyCompositionModeFragmentShader; | - | ||||||||||||||||||
752 | break; | - | ||||||||||||||||||
753 | case QPainter::CompositionMode_Screen: | - | ||||||||||||||||||
754 | requiredProgram.compositionFragShader = QGLEngineSharedShaders::ScreenCompositionModeFragmentShader; | - | ||||||||||||||||||
755 | break; | - | ||||||||||||||||||
756 | case QPainter::CompositionMode_Overlay: | - | ||||||||||||||||||
757 | requiredProgram.compositionFragShader = QGLEngineSharedShaders::OverlayCompositionModeFragmentShader; | - | ||||||||||||||||||
758 | break; | - | ||||||||||||||||||
759 | case QPainter::CompositionMode_Darken: | - | ||||||||||||||||||
760 | requiredProgram.compositionFragShader = QGLEngineSharedShaders::DarkenCompositionModeFragmentShader; | - | ||||||||||||||||||
761 | break; | - | ||||||||||||||||||
762 | case QPainter::CompositionMode_Lighten: | - | ||||||||||||||||||
763 | requiredProgram.compositionFragShader = QGLEngineSharedShaders::LightenCompositionModeFragmentShader; | - | ||||||||||||||||||
764 | break; | - | ||||||||||||||||||
765 | case QPainter::CompositionMode_ColorDodge: | - | ||||||||||||||||||
766 | requiredProgram.compositionFragShader = QGLEngineSharedShaders::ColorDodgeCompositionModeFragmentShader; | - | ||||||||||||||||||
767 | break; | - | ||||||||||||||||||
768 | case QPainter::CompositionMode_ColorBurn: | - | ||||||||||||||||||
769 | requiredProgram.compositionFragShader = QGLEngineSharedShaders::ColorBurnCompositionModeFragmentShader; | - | ||||||||||||||||||
770 | break; | - | ||||||||||||||||||
771 | case QPainter::CompositionMode_HardLight: | - | ||||||||||||||||||
772 | requiredProgram.compositionFragShader = QGLEngineSharedShaders::HardLightCompositionModeFragmentShader; | - | ||||||||||||||||||
773 | break; | - | ||||||||||||||||||
774 | case QPainter::CompositionMode_SoftLight: | - | ||||||||||||||||||
775 | requiredProgram.compositionFragShader = QGLEngineSharedShaders::SoftLightCompositionModeFragmentShader; | - | ||||||||||||||||||
776 | break; | - | ||||||||||||||||||
777 | case QPainter::CompositionMode_Difference: | - | ||||||||||||||||||
778 | requiredProgram.compositionFragShader = QGLEngineSharedShaders::DifferenceCompositionModeFragmentShader; | - | ||||||||||||||||||
779 | break; | - | ||||||||||||||||||
780 | case QPainter::CompositionMode_Exclusion: | - | ||||||||||||||||||
781 | requiredProgram.compositionFragShader = QGLEngineSharedShaders::ExclusionCompositionModeFragmentShader; | - | ||||||||||||||||||
782 | break; | - | ||||||||||||||||||
783 | default: | - | ||||||||||||||||||
784 | QMessageLogger(__FILE__, 820829, __PRETTY_FUNCTION__).warning("QGLEngineShaderManager::useCorrectShaderProg() - Unsupported composition mode"); | - | ||||||||||||||||||
785 | } | - | ||||||||||||||||||
786 | } else { | - | ||||||||||||||||||
787 | requiredProgram.compositionFragShader = QGLEngineSharedShaders::NoCompositionModeFragmentShader; | - | ||||||||||||||||||
788 | } | - | ||||||||||||||||||
789 | - | |||||||||||||||||||
790 | - | |||||||||||||||||||
791 | if (opacityMode == AttributeOpacity) { | - | ||||||||||||||||||
792 | ((!(texCoords)) ? qt_assert("texCoords",__FILE__,828837) : qt_noop()); | - | ||||||||||||||||||
793 | requiredProgram.mainVertexShader = QGLEngineSharedShaders::MainWithTexCoordsAndOpacityVertexShader; | - | ||||||||||||||||||
794 | } else if (texCoords) { | - | ||||||||||||||||||
795 | requiredProgram.mainVertexShader = QGLEngineSharedShaders::MainWithTexCoordsVertexShader; | - | ||||||||||||||||||
796 | } else { | - | ||||||||||||||||||
797 | requiredProgram.mainVertexShader = QGLEngineSharedShaders::MainVertexShader; | - | ||||||||||||||||||
798 | } | - | ||||||||||||||||||
799 | requiredProgram.useTextureCoords = texCoords; | - | ||||||||||||||||||
800 | requiredProgram.useOpacityAttribute = (opacityMode == AttributeOpacity); | - | ||||||||||||||||||
801 | if (complexGeometry && srcPixelType == Qt::SolidPattern) { | - | ||||||||||||||||||
802 | requiredProgram.positionVertexShader = QGLEngineSharedShaders::ComplexGeometryPositionOnlyVertexShader; | - | ||||||||||||||||||
803 | requiredProgram.usePmvMatrixAttribute = false; | - | ||||||||||||||||||
804 | } else { | - | ||||||||||||||||||
805 | requiredProgram.usePmvMatrixAttribute = true; | - | ||||||||||||||||||
806 | - | |||||||||||||||||||
807 | - | |||||||||||||||||||
808 | - | |||||||||||||||||||
809 | complexGeometry = false; | - | ||||||||||||||||||
810 | } | - | ||||||||||||||||||
811 | - | |||||||||||||||||||
812 | - | |||||||||||||||||||
813 | currentShaderProg = sharedShaders->findProgramInCache(requiredProgram); | - | ||||||||||||||||||
814 | - | |||||||||||||||||||
815 | if (currentShaderProg && useCustomSrc) { | - | ||||||||||||||||||
816 | customSrcStage->setUniforms(currentShaderProg->program); | - | ||||||||||||||||||
817 | } | - | ||||||||||||||||||
818 | - | |||||||||||||||||||
819 | - | |||||||||||||||||||
820 | - | |||||||||||||||||||
821 | QGLContextPrivate* ctx_d = ctx->d_func(); | - | ||||||||||||||||||
822 | ctx_d->setVertexAttribArrayEnabled(QT_VERTEX_COORDS_ATTR, true); | - | ||||||||||||||||||
823 | ctx_d->setVertexAttribArrayEnabled(QT_TEXTURE_COORDS_ATTR, currentShaderProg && currentShaderProg->useTextureCoords); | - | ||||||||||||||||||
824 | ctx_d->setVertexAttribArrayEnabled(QT_OPACITY_ATTR, currentShaderProg && currentShaderProg->useOpacityAttribute); | - | ||||||||||||||||||
825 | - | |||||||||||||||||||
826 | shaderProgNeedsChanging = false; | - | ||||||||||||||||||
827 | return true; | - | ||||||||||||||||||
828 | } | - | ||||||||||||||||||
829 | - | |||||||||||||||||||
830 | - | |||||||||||||||||||
Switch to Source code | Preprocessed file |