qopenglengineshadermanager.cpp

Absolute File Name:/home/qt/qt5_coco/qt5/qtbase/src/gui/opengl/qopenglengineshadermanager.cpp
Source codeSwitch to Preprocessed file
LineSourceCount
1/****************************************************************************-
2**-
3** Copyright (C) 2015 The Qt Company Ltd.-
4** Contact: http://www.qt.io/licensing/-
5**-
6** This file is part of the QtGui module of the Qt Toolkit.-
7**-
8** $QT_BEGIN_LICENSE:LGPL21$-
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 http://www.qt.io/terms-conditions. For further-
15** information use the contact form at http://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 2.1 or version 3 as published by the Free-
20** Software Foundation and appearing in the file LICENSE.LGPLv21 and-
21** LICENSE.LGPLv3 included in the packaging of this file. Please review the-
22** following information to ensure the GNU Lesser General Public License-
23** requirements will be met: https://www.gnu.org/licenses/lgpl.html and-
24** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.-
25**-
26** As a special exception, The Qt Company gives you certain additional-
27** rights. These rights are described in The Qt Company LGPL Exception-
28** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.-
29**-
30** $QT_END_LICENSE$-
31**-
32****************************************************************************/-
33-
34#include "qopenglengineshadermanager_p.h"-
35#include "qopenglengineshadersource_p.h"-
36#include "qopenglpaintengine_p.h"-
37#include "qopenglshadercache_p.h"-
38-
39#include <QtGui/private/qopenglcontext_p.h>-
40#include <QtCore/qthreadstorage.h>-
41-
42#if defined(QT_DEBUG)-
43#include <QMetaEnum>-
44#endif-
45-
46// #define QT_GL_SHARED_SHADER_DEBUG-
47-
48QT_BEGIN_NAMESPACE-
49-
50class QOpenGLEngineSharedShadersResource : public QOpenGLSharedResource-
51{-
52public:-
53 QOpenGLEngineSharedShadersResource(QOpenGLContext *ctx)-
54 : QOpenGLSharedResource(ctx->shareGroup())-
55 , m_shaders(new QOpenGLEngineSharedShaders(ctx))-
56 {-
57 }
never executed: end of block
0
58-
59 ~QOpenGLEngineSharedShadersResource()-
60 {-
61 delete m_shaders;-
62 }
never executed: end of block
0
63-
64 void invalidateResource() Q_DECL_OVERRIDE-
65 {-
66 delete m_shaders;-
67 m_shaders = 0;-
68 }
never executed: end of block
0
69-
70 void freeResource(QOpenGLContext *) Q_DECL_OVERRIDE-
71 {-
72 }-
73-
74 QOpenGLEngineSharedShaders *shaders() const { return m_shaders; }
never executed: return m_shaders;
0
75-
76private:-
77 QOpenGLEngineSharedShaders *m_shaders;-
78};-
79-
80class QOpenGLShaderStorage-
81{-
82public:-
83 QOpenGLEngineSharedShaders *shadersForThread(QOpenGLContext *context) {-
84 QOpenGLMultiGroupSharedResource *&shaders = m_storage.localData();-
85 if (!shaders)
!shadersDescription
TRUEnever evaluated
FALSEnever evaluated
0
86 shaders = new QOpenGLMultiGroupSharedResource;
never executed: shaders = new QOpenGLMultiGroupSharedResource;
0
87 QOpenGLEngineSharedShadersResource *resource =-
88 shaders->value<QOpenGLEngineSharedShadersResource>(context);-
89 return resource ? resource->shaders() : 0;
never executed: return resource ? resource->shaders() : 0;
resourceDescription
TRUEnever evaluated
FALSEnever evaluated
0
90 }-
91-
92private:-
93 QThreadStorage<QOpenGLMultiGroupSharedResource *> m_storage;-
94};-
95-
96Q_GLOBAL_STATIC(QOpenGLShaderStorage, qt_shader_storage);
never executed: end of block
never executed: guard.store(QtGlobalStatic::Destroyed);
never executed: return &holder.value;
guard.load() =...c::InitializedDescription
TRUEnever evaluated
FALSEnever evaluated
0
97-
98QOpenGLEngineSharedShaders *QOpenGLEngineSharedShaders::shadersForContext(QOpenGLContext *context)-
99{-
100 return qt_shader_storage()->shadersForThread(context);
never executed: return qt_shader_storage()->shadersForThread(context);
0
101}-
102-
103const char* QOpenGLEngineSharedShaders::qShaderSnippets[] = {-
104 0,0,0,0,0,0,0,0,0,0,-
105 0,0,0,0,0,0,0,0,0,0,-
106 0,0,0,0,0,0,0,0,0,0,-
107 0,0,0,0,0-
108};-
109-
110QOpenGLEngineSharedShaders::QOpenGLEngineSharedShaders(QOpenGLContext* context)-
111 : blitShaderProg(0)-
112 , simpleShaderProg(0)-
113{-
114-
115/*-
116 Rather than having the shader source array statically initialised, it is initialised-
117 here instead. This is to allow new shader names to be inserted or existing names moved-
118 around without having to change the order of the glsl strings. It is hoped this will-
119 make future hard-to-find runtime bugs more obvious and generally give more solid code.-
120*/-
121 static bool snippetsPopulated = false;-
122 if (!snippetsPopulated) {
!snippetsPopulatedDescription
TRUEnever evaluated
FALSEnever evaluated
0
123-
124 const char** code = qShaderSnippets; // shortcut-
125-
126 code[MainVertexShader] = qopenglslMainVertexShader;-
127 code[MainWithTexCoordsVertexShader] = qopenglslMainWithTexCoordsVertexShader;-
128 code[MainWithTexCoordsAndOpacityVertexShader] = qopenglslMainWithTexCoordsAndOpacityVertexShader;-
129-
130 code[UntransformedPositionVertexShader] = qopenglslUntransformedPositionVertexShader;-
131 code[PositionOnlyVertexShader] = qopenglslPositionOnlyVertexShader;-
132 code[ComplexGeometryPositionOnlyVertexShader] = qopenglslComplexGeometryPositionOnlyVertexShader;-
133 code[PositionWithPatternBrushVertexShader] = qopenglslPositionWithPatternBrushVertexShader;-
134 code[PositionWithLinearGradientBrushVertexShader] = qopenglslPositionWithLinearGradientBrushVertexShader;-
135 code[PositionWithConicalGradientBrushVertexShader] = qopenglslPositionWithConicalGradientBrushVertexShader;-
136 code[PositionWithRadialGradientBrushVertexShader] = qopenglslPositionWithRadialGradientBrushVertexShader;-
137 code[PositionWithTextureBrushVertexShader] = qopenglslPositionWithTextureBrushVertexShader;-
138 code[AffinePositionWithPatternBrushVertexShader] = qopenglslAffinePositionWithPatternBrushVertexShader;-
139 code[AffinePositionWithLinearGradientBrushVertexShader] = qopenglslAffinePositionWithLinearGradientBrushVertexShader;-
140 code[AffinePositionWithConicalGradientBrushVertexShader] = qopenglslAffinePositionWithConicalGradientBrushVertexShader;-
141 code[AffinePositionWithRadialGradientBrushVertexShader] = qopenglslAffinePositionWithRadialGradientBrushVertexShader;-
142 code[AffinePositionWithTextureBrushVertexShader] = qopenglslAffinePositionWithTextureBrushVertexShader;-
143-
144 code[MainFragmentShader_CMO] = qopenglslMainFragmentShader_CMO;-
145 code[MainFragmentShader_CM] = qopenglslMainFragmentShader_CM;-
146 code[MainFragmentShader_MO] = qopenglslMainFragmentShader_MO;-
147 code[MainFragmentShader_M] = qopenglslMainFragmentShader_M;-
148 code[MainFragmentShader_CO] = qopenglslMainFragmentShader_CO;-
149 code[MainFragmentShader_C] = qopenglslMainFragmentShader_C;-
150 code[MainFragmentShader_O] = qopenglslMainFragmentShader_O;-
151 code[MainFragmentShader] = qopenglslMainFragmentShader;-
152 code[MainFragmentShader_ImageArrays] = qopenglslMainFragmentShader_ImageArrays;-
153-
154 code[ImageSrcFragmentShader] = qopenglslImageSrcFragmentShader;-
155 code[ImageSrcWithPatternFragmentShader] = qopenglslImageSrcWithPatternFragmentShader;-
156 code[NonPremultipliedImageSrcFragmentShader] = qopenglslNonPremultipliedImageSrcFragmentShader;-
157 code[GrayscaleImageSrcFragmentShader] = qopenglslGrayscaleImageSrcFragmentShader;-
158 code[AlphaImageSrcFragmentShader] = qopenglslAlphaImageSrcFragmentShader;-
159 code[CustomImageSrcFragmentShader] = qopenglslCustomSrcFragmentShader; // Calls "customShader", which must be appended-
160 code[SolidBrushSrcFragmentShader] = qopenglslSolidBrushSrcFragmentShader;-
161 if (context->isOpenGLES())
context->isOpenGLES()Description
TRUEnever evaluated
FALSEnever evaluated
0
162 code[TextureBrushSrcFragmentShader] = qopenglslTextureBrushSrcFragmentShader_ES;
never executed: code[TextureBrushSrcFragmentShader] = qopenglslTextureBrushSrcFragmentShader_ES;
0
163 else-
164 code[TextureBrushSrcFragmentShader] = qopenglslTextureBrushSrcFragmentShader_desktop;
never executed: code[TextureBrushSrcFragmentShader] = qopenglslTextureBrushSrcFragmentShader_desktop;
0
165 code[TextureBrushSrcWithPatternFragmentShader] = qopenglslTextureBrushSrcWithPatternFragmentShader;-
166 code[PatternBrushSrcFragmentShader] = qopenglslPatternBrushSrcFragmentShader;-
167 code[LinearGradientBrushSrcFragmentShader] = qopenglslLinearGradientBrushSrcFragmentShader;-
168 code[RadialGradientBrushSrcFragmentShader] = qopenglslRadialGradientBrushSrcFragmentShader;-
169 code[ConicalGradientBrushSrcFragmentShader] = qopenglslConicalGradientBrushSrcFragmentShader;-
170 code[ShockingPinkSrcFragmentShader] = qopenglslShockingPinkSrcFragmentShader;-
171-
172 code[NoMaskFragmentShader] = "";-
173 code[MaskFragmentShader] = qopenglslMaskFragmentShader;-
174 code[RgbMaskFragmentShaderPass1] = qopenglslRgbMaskFragmentShaderPass1;-
175 code[RgbMaskFragmentShaderPass2] = qopenglslRgbMaskFragmentShaderPass2;-
176 code[RgbMaskWithGammaFragmentShader] = ""; //###-
177-
178 code[NoCompositionModeFragmentShader] = "";-
179 code[MultiplyCompositionModeFragmentShader] = ""; //###-
180 code[ScreenCompositionModeFragmentShader] = ""; //###-
181 code[OverlayCompositionModeFragmentShader] = ""; //###-
182 code[DarkenCompositionModeFragmentShader] = ""; //###-
183 code[LightenCompositionModeFragmentShader] = ""; //###-
184 code[ColorDodgeCompositionModeFragmentShader] = ""; //###-
185 code[ColorBurnCompositionModeFragmentShader] = ""; //###-
186 code[HardLightCompositionModeFragmentShader] = ""; //###-
187 code[SoftLightCompositionModeFragmentShader] = ""; //###-
188 code[DifferenceCompositionModeFragmentShader] = ""; //###-
189 code[ExclusionCompositionModeFragmentShader] = ""; //###-
190-
191#if defined(QT_DEBUG)-
192 // Check that all the elements have been filled:-
193 for (int i = 0; i < TotalSnippetCount; ++i) {
i < TotalSnippetCountDescription
TRUEnever evaluated
FALSEnever evaluated
0
194 if (qShaderSnippets[i] == 0) {
qShaderSnippets[i] == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
195 qFatal("Shader snippet for %s (#%d) is missing!",-
196 snippetNameStr(SnippetName(i)).constData(), i);-
197 }
never executed: end of block
0
198 }
never executed: end of block
0
199#endif-
200 snippetsPopulated = true;-
201 }
never executed: end of block
0
202-
203 QOpenGLShader* fragShader;-
204 QOpenGLShader* vertexShader;-
205 QByteArray vertexSource;-
206 QByteArray fragSource;-
207-
208 // Compile up the simple shader:-
209 vertexSource.append(qShaderSnippets[MainVertexShader]);-
210 vertexSource.append(qShaderSnippets[PositionOnlyVertexShader]);-
211-
212 fragSource.append(qShaderSnippets[MainFragmentShader]);-
213 fragSource.append(qShaderSnippets[ShockingPinkSrcFragmentShader]);-
214-
215 simpleShaderProg = new QOpenGLShaderProgram;-
216-
217 CachedShader simpleShaderCache(fragSource, vertexSource);-
218-
219 bool inCache = simpleShaderCache.load(simpleShaderProg, context);-
220-
221 if (!inCache) {
!inCacheDescription
TRUEnever evaluated
FALSEnever evaluated
0
222 vertexShader = new QOpenGLShader(QOpenGLShader::Vertex);-
223 shaders.append(vertexShader);-
224 if (!vertexShader->compileSourceCode(vertexSource))
!vertexShader-...(vertexSource)Description
TRUEnever evaluated
FALSEnever evaluated
0
225 qWarning("Vertex shader for simpleShaderProg (MainVertexShader & PositionOnlyVertexShader) failed to compile");
never executed: QMessageLogger(__FILE__, 225, __PRETTY_FUNCTION__).warning("Vertex shader for simpleShaderProg (MainVertexShader & PositionOnlyVertexShader) failed to compile");
0
226-
227 fragShader = new QOpenGLShader(QOpenGLShader::Fragment);-
228 shaders.append(fragShader);-
229 if (!fragShader->compileSourceCode(fragSource))
!fragShader->c...de(fragSource)Description
TRUEnever evaluated
FALSEnever evaluated
0
230 qWarning("Fragment shader for simpleShaderProg (MainFragmentShader & ShockingPinkSrcFragmentShader) failed to compile");
never executed: QMessageLogger(__FILE__, 230, __PRETTY_FUNCTION__).warning("Fragment shader for simpleShaderProg (MainFragmentShader & ShockingPinkSrcFragmentShader) failed to compile");
0
231-
232 simpleShaderProg->addShader(vertexShader);-
233 simpleShaderProg->addShader(fragShader);-
234-
235 simpleShaderProg->bindAttributeLocation("vertexCoordsArray", QT_VERTEX_COORDS_ATTR);-
236 simpleShaderProg->bindAttributeLocation("pmvMatrix1", QT_PMV_MATRIX_1_ATTR);-
237 simpleShaderProg->bindAttributeLocation("pmvMatrix2", QT_PMV_MATRIX_2_ATTR);-
238 simpleShaderProg->bindAttributeLocation("pmvMatrix3", QT_PMV_MATRIX_3_ATTR);-
239 }
never executed: end of block
0
240-
241 simpleShaderProg->link();-
242-
243 if (simpleShaderProg->isLinked()) {
simpleShaderProg->isLinked()Description
TRUEnever evaluated
FALSEnever evaluated
0
244 if (!inCache)
!inCacheDescription
TRUEnever evaluated
FALSEnever evaluated
0
245 simpleShaderCache.store(simpleShaderProg, context);
never executed: simpleShaderCache.store(simpleShaderProg, context);
0
246 } else {
never executed: end of block
0
247 qCritical("Errors linking simple shader: %s", qPrintable(simpleShaderProg->log()));-
248 }
never executed: end of block
0
249-
250 // Compile the blit shader:-
251 vertexSource.clear();-
252 vertexSource.append(qShaderSnippets[MainWithTexCoordsVertexShader]);-
253 vertexSource.append(qShaderSnippets[UntransformedPositionVertexShader]);-
254-
255 fragSource.clear();-
256 fragSource.append(qShaderSnippets[MainFragmentShader]);-
257 fragSource.append(qShaderSnippets[ImageSrcFragmentShader]);-
258-
259 blitShaderProg = new QOpenGLShaderProgram;-
260-
261 CachedShader blitShaderCache(fragSource, vertexSource);-
262-
263 inCache = blitShaderCache.load(blitShaderProg, context);-
264-
265 if (!inCache) {
!inCacheDescription
TRUEnever evaluated
FALSEnever evaluated
0
266 vertexShader = new QOpenGLShader(QOpenGLShader::Vertex);-
267 shaders.append(vertexShader);-
268 if (!vertexShader->compileSourceCode(vertexSource))
!vertexShader-...(vertexSource)Description
TRUEnever evaluated
FALSEnever evaluated
0
269 qWarning("Vertex shader for blitShaderProg (MainWithTexCoordsVertexShader & UntransformedPositionVertexShader) failed to compile");
never executed: QMessageLogger(__FILE__, 269, __PRETTY_FUNCTION__).warning("Vertex shader for blitShaderProg (MainWithTexCoordsVertexShader & UntransformedPositionVertexShader) failed to compile");
0
270-
271 fragShader = new QOpenGLShader(QOpenGLShader::Fragment);-
272 shaders.append(fragShader);-
273 if (!fragShader->compileSourceCode(fragSource))
!fragShader->c...de(fragSource)Description
TRUEnever evaluated
FALSEnever evaluated
0
274 qWarning("Fragment shader for blitShaderProg (MainFragmentShader & ImageSrcFragmentShader) failed to compile");
never executed: QMessageLogger(__FILE__, 274, __PRETTY_FUNCTION__).warning("Fragment shader for blitShaderProg (MainFragmentShader & ImageSrcFragmentShader) failed to compile");
0
275-
276 blitShaderProg->addShader(vertexShader);-
277 blitShaderProg->addShader(fragShader);-
278-
279 blitShaderProg->bindAttributeLocation("textureCoordArray", QT_TEXTURE_COORDS_ATTR);-
280 blitShaderProg->bindAttributeLocation("vertexCoordsArray", QT_VERTEX_COORDS_ATTR);-
281 }
never executed: end of block
0
282-
283 blitShaderProg->link();-
284 if (blitShaderProg->isLinked()) {
blitShaderProg->isLinked()Description
TRUEnever evaluated
FALSEnever evaluated
0
285 if (!inCache)
!inCacheDescription
TRUEnever evaluated
FALSEnever evaluated
0
286 blitShaderCache.store(blitShaderProg, context);
never executed: blitShaderCache.store(blitShaderProg, context);
0
287 } else {
never executed: end of block
0
288 qCritical("Errors linking blit shader: %s", qPrintable(blitShaderProg->log()));-
289 }
never executed: end of block
0
290-
291#ifdef QT_GL_SHARED_SHADER_DEBUG-
292 qDebug(" -> QOpenGLEngineSharedShaders() %p for thread %p.", this, QThread::currentThread());-
293#endif-
294}-
295-
296QOpenGLEngineSharedShaders::~QOpenGLEngineSharedShaders()-
297{-
298#ifdef QT_GL_SHARED_SHADER_DEBUG-
299 qDebug(" -> ~QOpenGLEngineSharedShaders() %p for thread %p.", this, QThread::currentThread());-
300#endif-
301 qDeleteAll(shaders);-
302 shaders.clear();-
303-
304 qDeleteAll(cachedPrograms);-
305 cachedPrograms.clear();-
306-
307 if (blitShaderProg) {
blitShaderProgDescription
TRUEnever evaluated
FALSEnever evaluated
0
308 delete blitShaderProg;-
309 blitShaderProg = 0;-
310 }
never executed: end of block
0
311-
312 if (simpleShaderProg) {
simpleShaderProgDescription
TRUEnever evaluated
FALSEnever evaluated
0
313 delete simpleShaderProg;-
314 simpleShaderProg = 0;-
315 }
never executed: end of block
0
316}
never executed: end of block
0
317-
318#if defined (QT_DEBUG)-
319QByteArray QOpenGLEngineSharedShaders::snippetNameStr(SnippetName name)-
320{-
321 QMetaEnum m = staticMetaObject.enumerator(staticMetaObject.indexOfEnumerator("SnippetName"));-
322 return QByteArray(m.valueToKey(name));
never executed: return QByteArray(m.valueToKey(name));
0
323}-
324#endif-
325-
326// The address returned here will only be valid until next time this function is called.-
327// The program is return bound.-
328QOpenGLEngineShaderProg *QOpenGLEngineSharedShaders::findProgramInCache(const QOpenGLEngineShaderProg &prog)-
329{-
330 for (int i = 0; i < cachedPrograms.size(); ++i) {
i < cachedPrograms.size()Description
TRUEnever evaluated
FALSEnever evaluated
0
331 QOpenGLEngineShaderProg *cachedProg = cachedPrograms[i];-
332 if (*cachedProg == prog) {
*cachedProg == progDescription
TRUEnever evaluated
FALSEnever evaluated
0
333 // Move the program to the top of the list as a poor-man's cache algo-
334 cachedPrograms.move(i, 0);-
335 cachedProg->program->bind();-
336 return cachedProg;
never executed: return cachedProg;
0
337 }-
338 }
never executed: end of block
0
339-
340 QScopedPointer<QOpenGLEngineShaderProg> newProg;-
341-
342 do {-
343 QByteArray fragSource;-
344 // Insert the custom stage before the srcPixel shader to work around an ATI driver bug-
345 // where you cannot forward declare a function that takes a sampler as argument.-
346 if (prog.srcPixelFragShader == CustomImageSrcFragmentShader)
prog.srcPixelF...FragmentShaderDescription
TRUEnever evaluated
FALSEnever evaluated
0
347 fragSource.append(prog.customStageSource);
never executed: fragSource.append(prog.customStageSource);
0
348 fragSource.append(qShaderSnippets[prog.mainFragShader]);-
349 fragSource.append(qShaderSnippets[prog.srcPixelFragShader]);-
350 if (prog.compositionFragShader)
prog.compositionFragShaderDescription
TRUEnever evaluated
FALSEnever evaluated
0
351 fragSource.append(qShaderSnippets[prog.compositionFragShader]);
never executed: fragSource.append(qShaderSnippets[prog.compositionFragShader]);
0
352 if (prog.maskFragShader)
prog.maskFragShaderDescription
TRUEnever evaluated
FALSEnever evaluated
0
353 fragSource.append(qShaderSnippets[prog.maskFragShader]);
never executed: fragSource.append(qShaderSnippets[prog.maskFragShader]);
0
354-
355 QByteArray vertexSource;-
356 vertexSource.append(qShaderSnippets[prog.mainVertexShader]);-
357 vertexSource.append(qShaderSnippets[prog.positionVertexShader]);-
358-
359 QScopedPointer<QOpenGLShaderProgram> shaderProgram(new QOpenGLShaderProgram);-
360-
361 CachedShader shaderCache(fragSource, vertexSource);-
362 bool inCache = shaderCache.load(shaderProgram.data(), QOpenGLContext::currentContext());-
363-
364 if (!inCache) {
!inCacheDescription
TRUEnever evaluated
FALSEnever evaluated
0
365-
366 QScopedPointer<QOpenGLShader> fragShader(new QOpenGLShader(QOpenGLShader::Fragment));-
367 QByteArray description;-
368#if defined(QT_DEBUG)-
369 // Name the shader for easier debugging-
370 description.append("Fragment shader: main=");-
371 description.append(snippetNameStr(prog.mainFragShader));-
372 description.append(", srcPixel=");-
373 description.append(snippetNameStr(prog.srcPixelFragShader));-
374 if (prog.compositionFragShader) {
prog.compositionFragShaderDescription
TRUEnever evaluated
FALSEnever evaluated
0
375 description.append(", composition=");-
376 description.append(snippetNameStr(prog.compositionFragShader));-
377 }
never executed: end of block
0
378 if (prog.maskFragShader) {
prog.maskFragShaderDescription
TRUEnever evaluated
FALSEnever evaluated
0
379 description.append(", mask=");-
380 description.append(snippetNameStr(prog.maskFragShader));-
381 }
never executed: end of block
0
382 fragShader->setObjectName(QString::fromLatin1(description));-
383#endif-
384 if (!fragShader->compileSourceCode(fragSource)) {
!fragShader->c...de(fragSource)Description
TRUEnever evaluated
FALSEnever evaluated
0
385 qWarning() << "Warning:" << description << "failed to compile!";-
386 break;
never executed: break;
0
387 }-
388-
389 QScopedPointer<QOpenGLShader> vertexShader(new QOpenGLShader(QOpenGLShader::Vertex));-
390#if defined(QT_DEBUG)-
391 // Name the shader for easier debugging-
392 description.clear();-
393 description.append("Vertex shader: main=");-
394 description.append(snippetNameStr(prog.mainVertexShader));-
395 description.append(", position=");-
396 description.append(snippetNameStr(prog.positionVertexShader));-
397 vertexShader->setObjectName(QString::fromLatin1(description));-
398#endif-
399 if (!vertexShader->compileSourceCode(vertexSource)) {
!vertexShader-...(vertexSource)Description
TRUEnever evaluated
FALSEnever evaluated
0
400 qWarning() << "Warning:" << description << "failed to compile!";-
401 break;
never executed: break;
0
402 }-
403-
404 shaders.append(vertexShader.data());-
405 shaders.append(fragShader.data());-
406 shaderProgram->addShader(vertexShader.take());-
407 shaderProgram->addShader(fragShader.take());-
408-
409 // We have to bind the vertex attribute names before the program is linked:-
410 shaderProgram->bindAttributeLocation("vertexCoordsArray", QT_VERTEX_COORDS_ATTR);-
411 if (prog.useTextureCoords)
prog.useTextureCoordsDescription
TRUEnever evaluated
FALSEnever evaluated
0
412 shaderProgram->bindAttributeLocation("textureCoordArray", QT_TEXTURE_COORDS_ATTR);
never executed: shaderProgram->bindAttributeLocation("textureCoordArray", QT_TEXTURE_COORDS_ATTR);
0
413 if (prog.useOpacityAttribute)
prog.useOpacityAttributeDescription
TRUEnever evaluated
FALSEnever evaluated
0
414 shaderProgram->bindAttributeLocation("opacityArray", QT_OPACITY_ATTR);
never executed: shaderProgram->bindAttributeLocation("opacityArray", QT_OPACITY_ATTR);
0
415 if (prog.usePmvMatrixAttribute) {
prog.usePmvMatrixAttributeDescription
TRUEnever evaluated
FALSEnever evaluated
0
416 shaderProgram->bindAttributeLocation("pmvMatrix1", QT_PMV_MATRIX_1_ATTR);-
417 shaderProgram->bindAttributeLocation("pmvMatrix2", QT_PMV_MATRIX_2_ATTR);-
418 shaderProgram->bindAttributeLocation("pmvMatrix3", QT_PMV_MATRIX_3_ATTR);-
419 }
never executed: end of block
0
420 }
never executed: end of block
0
421-
422 newProg.reset(new QOpenGLEngineShaderProg(prog));-
423 newProg->program = shaderProgram.take();-
424-
425 newProg->program->link();-
426 if (newProg->program->isLinked()) {
newProg->program->isLinked()Description
TRUEnever evaluated
FALSEnever evaluated
0
427 if (!inCache)
!inCacheDescription
TRUEnever evaluated
FALSEnever evaluated
0
428 shaderCache.store(newProg->program, QOpenGLContext::currentContext());
never executed: shaderCache.store(newProg->program, QOpenGLContext::currentContext());
0
429 } else {
never executed: end of block
0
430 QString error;-
431 error = QLatin1String("Shader program failed to link,");-
432#if defined(QT_DEBUG)-
433 QLatin1String br("\n");-
434 error += QLatin1String("\n Shaders Used:\n");-
435 for (int i = 0; i < newProg->program->shaders().count(); ++i) {
i < newProg->p...ders().count()Description
TRUEnever evaluated
FALSEnever evaluated
0
436 QOpenGLShader *shader = newProg->program->shaders().at(i);-
437 error += QLatin1String(" ") + shader->objectName() + QLatin1String(": \n")-
438 + QLatin1String(shader->sourceCode()) + br;-
439 }
never executed: end of block
0
440#endif-
441 error += QLatin1String(" Error Log:\n")-
442 + QLatin1String(" ") + newProg->program->log();-
443 qWarning() << error;-
444 break;
never executed: break;
0
445 }-
446-
447 newProg->program->bind();-
448-
449 if (newProg->maskFragShader != QOpenGLEngineSharedShaders::NoMaskFragmentShader) {
newProg->maskF...FragmentShaderDescription
TRUEnever evaluated
FALSEnever evaluated
0
450 GLuint location = newProg->program->uniformLocation("maskTexture");-
451 newProg->program->setUniformValue(location, QT_MASK_TEXTURE_UNIT);-
452 }
never executed: end of block
0
453-
454 if (cachedPrograms.count() > 30) {
cachedPrograms.count() > 30Description
TRUEnever evaluated
FALSEnever evaluated
0
455 // The cache is full, so delete the last 5 programs in the list.-
456 // These programs will be least used, as a program us bumped to-
457 // the top of the list when it's used.-
458 for (int i = 0; i < 5; ++i) {
i < 5Description
TRUEnever evaluated
FALSEnever evaluated
0
459 delete cachedPrograms.last();-
460 cachedPrograms.removeLast();-
461 }
never executed: end of block
0
462 }
never executed: end of block
0
463-
464 cachedPrograms.insert(0, newProg.data());-
465 } while (false);-
466-
467 return newProg.take();
never executed: return newProg.take();
0
468}-
469-
470void QOpenGLEngineSharedShaders::cleanupCustomStage(QOpenGLCustomShaderStage* stage)-
471{-
472 // Remove any shader programs which has this as the custom shader src:-
473 for (int i = 0; i < cachedPrograms.size(); ++i) {
i < cachedPrograms.size()Description
TRUEnever evaluated
FALSEnever evaluated
0
474 QOpenGLEngineShaderProg *cachedProg = cachedPrograms[i];-
475 if (cachedProg->customStageSource == stage->source()) {
cachedProg->cu...tage->source()Description
TRUEnever evaluated
FALSEnever evaluated
0
476 delete cachedProg;-
477 cachedPrograms.removeAt(i);-
478 i--;-
479 }
never executed: end of block
0
480 }
never executed: end of block
0
481}
never executed: end of block
0
482-
483-
484QOpenGLEngineShaderManager::QOpenGLEngineShaderManager(QOpenGLContext* context)-
485 : ctx(context),-
486 shaderProgNeedsChanging(true),-
487 complexGeometry(false),-
488 srcPixelType(Qt::NoBrush),-
489 opacityMode(NoOpacity),-
490 maskType(NoMask),-
491 compositionMode(QPainter::CompositionMode_SourceOver),-
492 customSrcStage(0),-
493 currentShaderProg(0)-
494{-
495 sharedShaders = QOpenGLEngineSharedShaders::shadersForContext(context);-
496}
never executed: end of block
0
497-
498QOpenGLEngineShaderManager::~QOpenGLEngineShaderManager()-
499{-
500 //###-
501 removeCustomStage();-
502}
never executed: end of block
0
503-
504GLuint QOpenGLEngineShaderManager::getUniformLocation(Uniform id)-
505{-
506 if (!currentShaderProg)
!currentShaderProgDescription
TRUEnever evaluated
FALSEnever evaluated
0
507 return 0;
never executed: return 0;
0
508-
509 QVector<uint> &uniformLocations = currentShaderProg->uniformLocations;-
510 if (uniformLocations.isEmpty())
uniformLocations.isEmpty()Description
TRUEnever evaluated
FALSEnever evaluated
0
511 uniformLocations.fill(GLuint(-1), NumUniforms);
never executed: uniformLocations.fill(GLuint(-1), NumUniforms);
0
512-
513 static const char *const uniformNames[] = {-
514 "imageTexture",-
515 "patternColor",-
516 "globalOpacity",-
517 "depth",-
518 "maskTexture",-
519 "fragmentColor",-
520 "linearData",-
521 "angle",-
522 "halfViewportSize",-
523 "fmp",-
524 "fmp2_m_radius2",-
525 "inverse_2_fmp2_m_radius2",-
526 "sqrfr",-
527 "bradius",-
528 "invertedTextureSize",-
529 "brushTransform",-
530 "brushTexture",-
531 "matrix"-
532 };-
533-
534 if (uniformLocations.at(id) == GLuint(-1))
uniformLocatio... == GLuint(-1)Description
TRUEnever evaluated
FALSEnever evaluated
0
535 uniformLocations[id] = currentShaderProg->program->uniformLocation(uniformNames[id]);
never executed: uniformLocations[id] = currentShaderProg->program->uniformLocation(uniformNames[id]);
0
536-
537 return uniformLocations.at(id);
never executed: return uniformLocations.at(id);
0
538}-
539-
540-
541void QOpenGLEngineShaderManager::optimiseForBrushTransform(QTransform::TransformationType transformType)-
542{-
543 Q_UNUSED(transformType); // Currently ignored-
544}
never executed: end of block
0
545-
546void QOpenGLEngineShaderManager::setDirty()-
547{-
548 shaderProgNeedsChanging = true;-
549}
never executed: end of block
0
550-
551void QOpenGLEngineShaderManager::setSrcPixelType(Qt::BrushStyle style)-
552{-
553 Q_ASSERT(style != Qt::NoBrush);-
554 if (srcPixelType == PixelSrcType(style))
srcPixelType =...SrcType(style)Description
TRUEnever evaluated
FALSEnever evaluated
0
555 return;
never executed: return;
0
556-
557 srcPixelType = style;-
558 shaderProgNeedsChanging = true; //###-
559}
never executed: end of block
0
560-
561void QOpenGLEngineShaderManager::setSrcPixelType(PixelSrcType type)-
562{-
563 if (srcPixelType == type)
srcPixelType == typeDescription
TRUEnever evaluated
FALSEnever evaluated
0
564 return;
never executed: return;
0
565-
566 srcPixelType = type;-
567 shaderProgNeedsChanging = true; //###-
568}
never executed: end of block
0
569-
570void QOpenGLEngineShaderManager::setOpacityMode(OpacityMode mode)-
571{-
572 if (opacityMode == mode)
opacityMode == modeDescription
TRUEnever evaluated
FALSEnever evaluated
0
573 return;
never executed: return;
0
574-
575 opacityMode = mode;-
576 shaderProgNeedsChanging = true; //###-
577}
never executed: end of block
0
578-
579void QOpenGLEngineShaderManager::setMaskType(MaskType type)-
580{-
581 if (maskType == type)
maskType == typeDescription
TRUEnever evaluated
FALSEnever evaluated
0
582 return;
never executed: return;
0
583-
584 maskType = type;-
585 shaderProgNeedsChanging = true; //###-
586}
never executed: end of block
0
587-
588void QOpenGLEngineShaderManager::setCompositionMode(QPainter::CompositionMode mode)-
589{-
590 if (compositionMode == mode)
compositionMode == modeDescription
TRUEnever evaluated
FALSEnever evaluated
0
591 return;
never executed: return;
0
592-
593 compositionMode = mode;-
594 shaderProgNeedsChanging = true; //###-
595}
never executed: end of block
0
596-
597void QOpenGLEngineShaderManager::setCustomStage(QOpenGLCustomShaderStage* stage)-
598{-
599 if (customSrcStage)
customSrcStageDescription
TRUEnever evaluated
FALSEnever evaluated
0
600 removeCustomStage();
never executed: removeCustomStage();
0
601 customSrcStage = stage;-
602 shaderProgNeedsChanging = true;-
603}
never executed: end of block
0
604-
605void QOpenGLEngineShaderManager::removeCustomStage()-
606{-
607 if (customSrcStage)
customSrcStageDescription
TRUEnever evaluated
FALSEnever evaluated
0
608 customSrcStage->setInactive();
never executed: customSrcStage->setInactive();
0
609 customSrcStage = 0;-
610 shaderProgNeedsChanging = true;-
611}
never executed: end of block
0
612-
613QOpenGLShaderProgram* QOpenGLEngineShaderManager::currentProgram()-
614{-
615 if (currentShaderProg)
currentShaderProgDescription
TRUEnever evaluated
FALSEnever evaluated
0
616 return currentShaderProg->program;
never executed: return currentShaderProg->program;
0
617 else-
618 return sharedShaders->simpleProgram();
never executed: return sharedShaders->simpleProgram();
0
619}-
620-
621void QOpenGLEngineShaderManager::useSimpleProgram()-
622{-
623 sharedShaders->simpleProgram()->bind();-
624 QOpenGLContextPrivate* ctx_d = ctx->d_func();-
625 Q_UNUSED(ctx_d);-
626-
627 QOpenGL2PaintEngineEx *active_engine = static_cast<QOpenGL2PaintEngineEx *>(ctx_d->active_engine);-
628-
629 active_engine->d_func()->setVertexAttribArrayEnabled(QT_VERTEX_COORDS_ATTR, true);-
630 active_engine->d_func()->setVertexAttribArrayEnabled(QT_TEXTURE_COORDS_ATTR, false);-
631 active_engine->d_func()->setVertexAttribArrayEnabled(QT_OPACITY_ATTR, false);-
632-
633 shaderProgNeedsChanging = true;-
634}
never executed: end of block
0
635-
636void QOpenGLEngineShaderManager::useBlitProgram()-
637{-
638 sharedShaders->blitProgram()->bind();-
639 QOpenGLContextPrivate* ctx_d = ctx->d_func();-
640 QOpenGL2PaintEngineEx *active_engine = static_cast<QOpenGL2PaintEngineEx *>(ctx_d->active_engine);-
641 active_engine->d_func()->setVertexAttribArrayEnabled(QT_VERTEX_COORDS_ATTR, true);-
642 active_engine->d_func()->setVertexAttribArrayEnabled(QT_TEXTURE_COORDS_ATTR, true);-
643 active_engine->d_func()->setVertexAttribArrayEnabled(QT_OPACITY_ATTR, false);-
644 shaderProgNeedsChanging = true;-
645}
never executed: end of block
0
646-
647QOpenGLShaderProgram* QOpenGLEngineShaderManager::simpleProgram()-
648{-
649 return sharedShaders->simpleProgram();
never executed: return sharedShaders->simpleProgram();
0
650}-
651-
652QOpenGLShaderProgram* QOpenGLEngineShaderManager::blitProgram()-
653{-
654 return sharedShaders->blitProgram();
never executed: return sharedShaders->blitProgram();
0
655}-
656-
657-
658-
659// Select & use the correct shader program using the current state.-
660// Returns \c true if program needed changing.-
661bool QOpenGLEngineShaderManager::useCorrectShaderProg()-
662{-
663 if (!shaderProgNeedsChanging)
!shaderProgNeedsChangingDescription
TRUEnever evaluated
FALSEnever evaluated
0
664 return false;
never executed: return false;
0
665-
666 bool useCustomSrc = customSrcStage != 0;-
667 if (useCustomSrc && srcPixelType != QOpenGLEngineShaderManager::ImageSrc && srcPixelType != Qt::TexturePattern) {
useCustomSrcDescription
TRUEnever evaluated
FALSEnever evaluated
srcPixelType !...ager::ImageSrcDescription
TRUEnever evaluated
FALSEnever evaluated
srcPixelType !...TexturePatternDescription
TRUEnever evaluated
FALSEnever evaluated
0
668 useCustomSrc = false;-
669 qWarning("QOpenGLEngineShaderManager - Ignoring custom shader stage for non image src");-
670 }
never executed: end of block
0
671-
672 QOpenGLEngineShaderProg requiredProgram;-
673-
674 bool texCoords = false;-
675-
676 // Choose vertex shader shader position function (which typically also sets-
677 // varyings) and the source pixel (srcPixel) fragment shader function:-
678 requiredProgram.positionVertexShader = QOpenGLEngineSharedShaders::InvalidSnippetName;-
679 requiredProgram.srcPixelFragShader = QOpenGLEngineSharedShaders::InvalidSnippetName;-
680 bool isAffine = brushTransform.isAffine();-
681 if ( (srcPixelType >= Qt::Dense1Pattern) && (srcPixelType <= Qt::DiagCrossPattern) ) {
(srcPixelType ...Dense1Pattern)Description
TRUEnever evaluated
FALSEnever evaluated
(srcPixelType ...gCrossPattern)Description
TRUEnever evaluated
FALSEnever evaluated
0
682 if (isAffine)
isAffineDescription
TRUEnever evaluated
FALSEnever evaluated
0
683 requiredProgram.positionVertexShader = QOpenGLEngineSharedShaders::AffinePositionWithPatternBrushVertexShader;
never executed: requiredProgram.positionVertexShader = QOpenGLEngineSharedShaders::AffinePositionWithPatternBrushVertexShader;
0
684 else-
685 requiredProgram.positionVertexShader = QOpenGLEngineSharedShaders::PositionWithPatternBrushVertexShader;
never executed: requiredProgram.positionVertexShader = QOpenGLEngineSharedShaders::PositionWithPatternBrushVertexShader;
0
686-
687 requiredProgram.srcPixelFragShader = QOpenGLEngineSharedShaders::PatternBrushSrcFragmentShader;-
688 }
never executed: end of block
0
689 else switch (srcPixelType) {-
690 default:
never executed: default:
0
691 case Qt::NoBrush:
never executed: case Qt::NoBrush:
0
692 qFatal("QOpenGLEngineShaderManager::useCorrectShaderProg() - Qt::NoBrush style is set");-
693 break;
never executed: break;
0
694 case QOpenGLEngineShaderManager::ImageSrc:
never executed: case QOpenGLEngineShaderManager::ImageSrc:
0
695 requiredProgram.srcPixelFragShader = QOpenGLEngineSharedShaders::ImageSrcFragmentShader;-
696 requiredProgram.positionVertexShader = QOpenGLEngineSharedShaders::PositionOnlyVertexShader;-
697 texCoords = true;-
698 break;
never executed: break;
0
699 case QOpenGLEngineShaderManager::NonPremultipliedImageSrc:
never executed: case QOpenGLEngineShaderManager::NonPremultipliedImageSrc:
0
700 requiredProgram.srcPixelFragShader = QOpenGLEngineSharedShaders::NonPremultipliedImageSrcFragmentShader;-
701 requiredProgram.positionVertexShader = QOpenGLEngineSharedShaders::PositionOnlyVertexShader;-
702 texCoords = true;-
703 break;
never executed: break;
0
704 case QOpenGLEngineShaderManager::GrayscaleImageSrc:
never executed: case QOpenGLEngineShaderManager::GrayscaleImageSrc:
0
705 requiredProgram.srcPixelFragShader = QOpenGLEngineSharedShaders::GrayscaleImageSrcFragmentShader;-
706 requiredProgram.positionVertexShader = QOpenGLEngineSharedShaders::PositionOnlyVertexShader;-
707 texCoords = true;-
708 break;
never executed: break;
0
709 case QOpenGLEngineShaderManager::AlphaImageSrc:
never executed: case QOpenGLEngineShaderManager::AlphaImageSrc:
0
710 requiredProgram.srcPixelFragShader = QOpenGLEngineSharedShaders::AlphaImageSrcFragmentShader;-
711 requiredProgram.positionVertexShader = QOpenGLEngineSharedShaders::PositionOnlyVertexShader;-
712 texCoords = true;-
713 break;
never executed: break;
0
714 case QOpenGLEngineShaderManager::PatternSrc:
never executed: case QOpenGLEngineShaderManager::PatternSrc:
0
715 requiredProgram.srcPixelFragShader = QOpenGLEngineSharedShaders::ImageSrcWithPatternFragmentShader;-
716 requiredProgram.positionVertexShader = QOpenGLEngineSharedShaders::PositionOnlyVertexShader;-
717 texCoords = true;-
718 break;
never executed: break;
0
719 case QOpenGLEngineShaderManager::TextureSrcWithPattern:
never executed: case QOpenGLEngineShaderManager::TextureSrcWithPattern:
0
720 requiredProgram.srcPixelFragShader = QOpenGLEngineSharedShaders::TextureBrushSrcWithPatternFragmentShader;-
721 requiredProgram.positionVertexShader = isAffine ? QOpenGLEngineSharedShaders::AffinePositionWithTextureBrushVertexShader
isAffineDescription
TRUEnever evaluated
FALSEnever evaluated
0
722 : QOpenGLEngineSharedShaders::PositionWithTextureBrushVertexShader;-
723 break;
never executed: break;
0
724 case Qt::SolidPattern:
never executed: case Qt::SolidPattern:
0
725 requiredProgram.srcPixelFragShader = QOpenGLEngineSharedShaders::SolidBrushSrcFragmentShader;-
726 requiredProgram.positionVertexShader = QOpenGLEngineSharedShaders::PositionOnlyVertexShader;-
727 break;
never executed: break;
0
728 case Qt::LinearGradientPattern:
never executed: case Qt::LinearGradientPattern:
0
729 requiredProgram.srcPixelFragShader = QOpenGLEngineSharedShaders::LinearGradientBrushSrcFragmentShader;-
730 requiredProgram.positionVertexShader = isAffine ? QOpenGLEngineSharedShaders::AffinePositionWithLinearGradientBrushVertexShader
isAffineDescription
TRUEnever evaluated
FALSEnever evaluated
0
731 : QOpenGLEngineSharedShaders::PositionWithLinearGradientBrushVertexShader;-
732 break;
never executed: break;
0
733 case Qt::ConicalGradientPattern:
never executed: case Qt::ConicalGradientPattern:
0
734 requiredProgram.srcPixelFragShader = QOpenGLEngineSharedShaders::ConicalGradientBrushSrcFragmentShader;-
735 requiredProgram.positionVertexShader = isAffine ? QOpenGLEngineSharedShaders::AffinePositionWithConicalGradientBrushVertexShader
isAffineDescription
TRUEnever evaluated
FALSEnever evaluated
0
736 : QOpenGLEngineSharedShaders::PositionWithConicalGradientBrushVertexShader;-
737 break;
never executed: break;
0
738 case Qt::RadialGradientPattern:
never executed: case Qt::RadialGradientPattern:
0
739 requiredProgram.srcPixelFragShader = QOpenGLEngineSharedShaders::RadialGradientBrushSrcFragmentShader;-
740 requiredProgram.positionVertexShader = isAffine ? QOpenGLEngineSharedShaders::AffinePositionWithRadialGradientBrushVertexShader
isAffineDescription
TRUEnever evaluated
FALSEnever evaluated
0
741 : QOpenGLEngineSharedShaders::PositionWithRadialGradientBrushVertexShader;-
742 break;
never executed: break;
0
743 case Qt::TexturePattern:
never executed: case Qt::TexturePattern:
0
744 requiredProgram.srcPixelFragShader = QOpenGLEngineSharedShaders::TextureBrushSrcFragmentShader;-
745 requiredProgram.positionVertexShader = isAffine ? QOpenGLEngineSharedShaders::AffinePositionWithTextureBrushVertexShader
isAffineDescription
TRUEnever evaluated
FALSEnever evaluated
0
746 : QOpenGLEngineSharedShaders::PositionWithTextureBrushVertexShader;-
747 break;
never executed: break;
0
748 };-
749-
750 if (useCustomSrc) {
useCustomSrcDescription
TRUEnever evaluated
FALSEnever evaluated
0
751 requiredProgram.srcPixelFragShader = QOpenGLEngineSharedShaders::CustomImageSrcFragmentShader;-
752 requiredProgram.customStageSource = customSrcStage->source();-
753 }
never executed: end of block
0
754-
755 const bool hasCompose = compositionMode > QPainter::CompositionMode_Plus;-
756 const bool hasMask = maskType != QOpenGLEngineShaderManager::NoMask;-
757-
758 // Choose fragment shader main function:-
759 if (opacityMode == AttributeOpacity) {
opacityMode ==...tributeOpacityDescription
TRUEnever evaluated
FALSEnever evaluated
0
760 Q_ASSERT(!hasCompose && !hasMask);-
761 requiredProgram.mainFragShader = QOpenGLEngineSharedShaders::MainFragmentShader_ImageArrays;-
762 } else {
never executed: end of block
0
763 bool useGlobalOpacity = (opacityMode == UniformOpacity);-
764 if (hasCompose && hasMask && useGlobalOpacity)
hasComposeDescription
TRUEnever evaluated
FALSEnever evaluated
hasMaskDescription
TRUEnever evaluated
FALSEnever evaluated
useGlobalOpacityDescription
TRUEnever evaluated
FALSEnever evaluated
0
765 requiredProgram.mainFragShader = QOpenGLEngineSharedShaders::MainFragmentShader_CMO;
never executed: requiredProgram.mainFragShader = QOpenGLEngineSharedShaders::MainFragmentShader_CMO;
0
766 if (hasCompose && hasMask && !useGlobalOpacity)
hasComposeDescription
TRUEnever evaluated
FALSEnever evaluated
hasMaskDescription
TRUEnever evaluated
FALSEnever evaluated
!useGlobalOpacityDescription
TRUEnever evaluated
FALSEnever evaluated
0
767 requiredProgram.mainFragShader = QOpenGLEngineSharedShaders::MainFragmentShader_CM;
never executed: requiredProgram.mainFragShader = QOpenGLEngineSharedShaders::MainFragmentShader_CM;
0
768 if (!hasCompose && hasMask && useGlobalOpacity)
!hasComposeDescription
TRUEnever evaluated
FALSEnever evaluated
hasMaskDescription
TRUEnever evaluated
FALSEnever evaluated
useGlobalOpacityDescription
TRUEnever evaluated
FALSEnever evaluated
0
769 requiredProgram.mainFragShader = QOpenGLEngineSharedShaders::MainFragmentShader_MO;
never executed: requiredProgram.mainFragShader = QOpenGLEngineSharedShaders::MainFragmentShader_MO;
0
770 if (!hasCompose && hasMask && !useGlobalOpacity)
!hasComposeDescription
TRUEnever evaluated
FALSEnever evaluated
hasMaskDescription
TRUEnever evaluated
FALSEnever evaluated
!useGlobalOpacityDescription
TRUEnever evaluated
FALSEnever evaluated
0
771 requiredProgram.mainFragShader = QOpenGLEngineSharedShaders::MainFragmentShader_M;
never executed: requiredProgram.mainFragShader = QOpenGLEngineSharedShaders::MainFragmentShader_M;
0
772 if (hasCompose && !hasMask && useGlobalOpacity)
hasComposeDescription
TRUEnever evaluated
FALSEnever evaluated
!hasMaskDescription
TRUEnever evaluated
FALSEnever evaluated
useGlobalOpacityDescription
TRUEnever evaluated
FALSEnever evaluated
0
773 requiredProgram.mainFragShader = QOpenGLEngineSharedShaders::MainFragmentShader_CO;
never executed: requiredProgram.mainFragShader = QOpenGLEngineSharedShaders::MainFragmentShader_CO;
0
774 if (hasCompose && !hasMask && !useGlobalOpacity)
hasComposeDescription
TRUEnever evaluated
FALSEnever evaluated
!hasMaskDescription
TRUEnever evaluated
FALSEnever evaluated
!useGlobalOpacityDescription
TRUEnever evaluated
FALSEnever evaluated
0
775 requiredProgram.mainFragShader = QOpenGLEngineSharedShaders::MainFragmentShader_C;
never executed: requiredProgram.mainFragShader = QOpenGLEngineSharedShaders::MainFragmentShader_C;
0
776 if (!hasCompose && !hasMask && useGlobalOpacity)
!hasComposeDescription
TRUEnever evaluated
FALSEnever evaluated
!hasMaskDescription
TRUEnever evaluated
FALSEnever evaluated
useGlobalOpacityDescription
TRUEnever evaluated
FALSEnever evaluated
0
777 requiredProgram.mainFragShader = QOpenGLEngineSharedShaders::MainFragmentShader_O;
never executed: requiredProgram.mainFragShader = QOpenGLEngineSharedShaders::MainFragmentShader_O;
0
778 if (!hasCompose && !hasMask && !useGlobalOpacity)
!hasComposeDescription
TRUEnever evaluated
FALSEnever evaluated
!hasMaskDescription
TRUEnever evaluated
FALSEnever evaluated
!useGlobalOpacityDescription
TRUEnever evaluated
FALSEnever evaluated
0
779 requiredProgram.mainFragShader = QOpenGLEngineSharedShaders::MainFragmentShader;
never executed: requiredProgram.mainFragShader = QOpenGLEngineSharedShaders::MainFragmentShader;
0
780 }
never executed: end of block
0
781-
782 if (hasMask) {
hasMaskDescription
TRUEnever evaluated
FALSEnever evaluated
0
783 if (maskType == PixelMask) {
maskType == PixelMaskDescription
TRUEnever evaluated
FALSEnever evaluated
0
784 requiredProgram.maskFragShader = QOpenGLEngineSharedShaders::MaskFragmentShader;-
785 texCoords = true;-
786 } else if (maskType == SubPixelMaskPass1) {
never executed: end of block
maskType == SubPixelMaskPass1Description
TRUEnever evaluated
FALSEnever evaluated
0
787 requiredProgram.maskFragShader = QOpenGLEngineSharedShaders::RgbMaskFragmentShaderPass1;-
788 texCoords = true;-
789 } else if (maskType == SubPixelMaskPass2) {
never executed: end of block
maskType == SubPixelMaskPass2Description
TRUEnever evaluated
FALSEnever evaluated
0
790 requiredProgram.maskFragShader = QOpenGLEngineSharedShaders::RgbMaskFragmentShaderPass2;-
791 texCoords = true;-
792 } else if (maskType == SubPixelWithGammaMask) {
never executed: end of block
maskType == Su...lWithGammaMaskDescription
TRUEnever evaluated
FALSEnever evaluated
0
793 requiredProgram.maskFragShader = QOpenGLEngineSharedShaders::RgbMaskWithGammaFragmentShader;-
794 texCoords = true;-
795 } else {
never executed: end of block
0
796 qCritical("QOpenGLEngineShaderManager::useCorrectShaderProg() - Unknown mask type");-
797 }
never executed: end of block
0
798 } else {-
799 requiredProgram.maskFragShader = QOpenGLEngineSharedShaders::NoMaskFragmentShader;-
800 }
never executed: end of block
0
801-
802 if (hasCompose) {
hasComposeDescription
TRUEnever evaluated
FALSEnever evaluated
0
803 switch (compositionMode) {-
804 case QPainter::CompositionMode_Multiply:
never executed: case QPainter::CompositionMode_Multiply:
0
805 requiredProgram.compositionFragShader = QOpenGLEngineSharedShaders::MultiplyCompositionModeFragmentShader;-
806 break;
never executed: break;
0
807 case QPainter::CompositionMode_Screen:
never executed: case QPainter::CompositionMode_Screen:
0
808 requiredProgram.compositionFragShader = QOpenGLEngineSharedShaders::ScreenCompositionModeFragmentShader;-
809 break;
never executed: break;
0
810 case QPainter::CompositionMode_Overlay:
never executed: case QPainter::CompositionMode_Overlay:
0
811 requiredProgram.compositionFragShader = QOpenGLEngineSharedShaders::OverlayCompositionModeFragmentShader;-
812 break;
never executed: break;
0
813 case QPainter::CompositionMode_Darken:
never executed: case QPainter::CompositionMode_Darken:
0
814 requiredProgram.compositionFragShader = QOpenGLEngineSharedShaders::DarkenCompositionModeFragmentShader;-
815 break;
never executed: break;
0
816 case QPainter::CompositionMode_Lighten:
never executed: case QPainter::CompositionMode_Lighten:
0
817 requiredProgram.compositionFragShader = QOpenGLEngineSharedShaders::LightenCompositionModeFragmentShader;-
818 break;
never executed: break;
0
819 case QPainter::CompositionMode_ColorDodge:
never executed: case QPainter::CompositionMode_ColorDodge:
0
820 requiredProgram.compositionFragShader = QOpenGLEngineSharedShaders::ColorDodgeCompositionModeFragmentShader;-
821 break;
never executed: break;
0
822 case QPainter::CompositionMode_ColorBurn:
never executed: case QPainter::CompositionMode_ColorBurn:
0
823 requiredProgram.compositionFragShader = QOpenGLEngineSharedShaders::ColorBurnCompositionModeFragmentShader;-
824 break;
never executed: break;
0
825 case QPainter::CompositionMode_HardLight:
never executed: case QPainter::CompositionMode_HardLight:
0
826 requiredProgram.compositionFragShader = QOpenGLEngineSharedShaders::HardLightCompositionModeFragmentShader;-
827 break;
never executed: break;
0
828 case QPainter::CompositionMode_SoftLight:
never executed: case QPainter::CompositionMode_SoftLight:
0
829 requiredProgram.compositionFragShader = QOpenGLEngineSharedShaders::SoftLightCompositionModeFragmentShader;-
830 break;
never executed: break;
0
831 case QPainter::CompositionMode_Difference:
never executed: case QPainter::CompositionMode_Difference:
0
832 requiredProgram.compositionFragShader = QOpenGLEngineSharedShaders::DifferenceCompositionModeFragmentShader;-
833 break;
never executed: break;
0
834 case QPainter::CompositionMode_Exclusion:
never executed: case QPainter::CompositionMode_Exclusion:
0
835 requiredProgram.compositionFragShader = QOpenGLEngineSharedShaders::ExclusionCompositionModeFragmentShader;-
836 break;
never executed: break;
0
837 default:
never executed: default:
0
838 qWarning("QOpenGLEngineShaderManager::useCorrectShaderProg() - Unsupported composition mode");-
839 }
never executed: end of block
0
840 } else {-
841 requiredProgram.compositionFragShader = QOpenGLEngineSharedShaders::NoCompositionModeFragmentShader;-
842 }
never executed: end of block
0
843-
844 // Choose vertex shader main function-
845 if (opacityMode == AttributeOpacity) {
opacityMode ==...tributeOpacityDescription
TRUEnever evaluated
FALSEnever evaluated
0
846 Q_ASSERT(texCoords);-
847 requiredProgram.mainVertexShader = QOpenGLEngineSharedShaders::MainWithTexCoordsAndOpacityVertexShader;-
848 } else if (texCoords) {
never executed: end of block
texCoordsDescription
TRUEnever evaluated
FALSEnever evaluated
0
849 requiredProgram.mainVertexShader = QOpenGLEngineSharedShaders::MainWithTexCoordsVertexShader;-
850 } else {
never executed: end of block
0
851 requiredProgram.mainVertexShader = QOpenGLEngineSharedShaders::MainVertexShader;-
852 }
never executed: end of block
0
853 requiredProgram.useTextureCoords = texCoords;-
854 requiredProgram.useOpacityAttribute = (opacityMode == AttributeOpacity);-
855 if (complexGeometry && srcPixelType == Qt::SolidPattern) {
complexGeometryDescription
TRUEnever evaluated
FALSEnever evaluated
srcPixelType =...::SolidPatternDescription
TRUEnever evaluated
FALSEnever evaluated
0
856 requiredProgram.positionVertexShader = QOpenGLEngineSharedShaders::ComplexGeometryPositionOnlyVertexShader;-
857 requiredProgram.usePmvMatrixAttribute = false;-
858 } else {
never executed: end of block
0
859 requiredProgram.usePmvMatrixAttribute = true;-
860-
861 // Force complexGeometry off, since we currently don't support that mode for-
862 // non-solid brushes-
863 complexGeometry = false;-
864 }
never executed: end of block
0
865-
866 // At this point, requiredProgram is fully populated so try to find the program in the cache-
867 currentShaderProg = sharedShaders->findProgramInCache(requiredProgram);-
868-
869 if (currentShaderProg && useCustomSrc) {
currentShaderProgDescription
TRUEnever evaluated
FALSEnever evaluated
useCustomSrcDescription
TRUEnever evaluated
FALSEnever evaluated
0
870 customSrcStage->setUniforms(currentShaderProg->program);-
871 }
never executed: end of block
0
872-
873 // Make sure all the vertex attribute arrays the program uses are enabled (and the ones it-
874 // doesn't use are disabled)-
875 QOpenGLContextPrivate* ctx_d = ctx->d_func();-
876 QOpenGL2PaintEngineEx *active_engine = static_cast<QOpenGL2PaintEngineEx *>(ctx_d->active_engine);-
877 active_engine->d_func()->setVertexAttribArrayEnabled(QT_VERTEX_COORDS_ATTR, true);-
878 active_engine->d_func()->setVertexAttribArrayEnabled(QT_TEXTURE_COORDS_ATTR, currentShaderProg && currentShaderProg->useTextureCoords);-
879 active_engine->d_func()->setVertexAttribArrayEnabled(QT_OPACITY_ATTR, currentShaderProg && currentShaderProg->useOpacityAttribute);-
880-
881 shaderProgNeedsChanging = false;-
882 return true;
never executed: return true;
0
883}-
884-
885QT_END_NAMESPACE-
Source codeSwitch to Preprocessed file

Generated by Squish Coco Non-Commercial 4.3.0-BETA-master-30-08-2018-4cb69e9