qglengineshadermanager.cpp

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

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