83QOpenGLEngineSharedShaders::QOpenGLEngineSharedShaders(QOpenGLContext* context)
84 : blitShaderProg(
nullptr)
85 , simpleShaderProg(
nullptr)
89
90
91
92
93
97 const QSurfaceFormat &fmt = context->format();
98 const bool isCoreProfile = fmt.profile() == QSurfaceFormat::CoreProfile && fmt.version() >= std::pair(3,2);
100 const char** code = qShaderSnippets;
103 code[MainVertexShader] = qopenglslMainVertexShader_core;
104 code[MainWithTexCoordsVertexShader] = qopenglslMainWithTexCoordsVertexShader_core;
105 code[MainWithTexCoordsAndOpacityVertexShader] = qopenglslMainWithTexCoordsAndOpacityVertexShader_core;
107 code[UntransformedPositionVertexShader] = qopenglslUntransformedPositionVertexShader_core;
108 code[PositionOnlyVertexShader] = qopenglslPositionOnlyVertexShader_core;
109 code[ComplexGeometryPositionOnlyVertexShader] = qopenglslComplexGeometryPositionOnlyVertexShader_core;
110 code[PositionWithPatternBrushVertexShader] = qopenglslPositionWithPatternBrushVertexShader_core;
111 code[PositionWithLinearGradientBrushVertexShader] = qopenglslPositionWithLinearGradientBrushVertexShader_core;
112 code[PositionWithConicalGradientBrushVertexShader] = qopenglslPositionWithConicalGradientBrushVertexShader_core;
113 code[PositionWithRadialGradientBrushVertexShader] = qopenglslPositionWithRadialGradientBrushVertexShader_core;
114 code[PositionWithTextureBrushVertexShader] = qopenglslPositionWithTextureBrushVertexShader_core;
115 code[AffinePositionWithPatternBrushVertexShader] = qopenglslAffinePositionWithPatternBrushVertexShader_core;
116 code[AffinePositionWithLinearGradientBrushVertexShader] = qopenglslAffinePositionWithLinearGradientBrushVertexShader_core;
117 code[AffinePositionWithConicalGradientBrushVertexShader] = qopenglslAffinePositionWithConicalGradientBrushVertexShader_core;
118 code[AffinePositionWithRadialGradientBrushVertexShader] = qopenglslAffinePositionWithRadialGradientBrushVertexShader_core;
119 code[AffinePositionWithTextureBrushVertexShader] = qopenglslAffinePositionWithTextureBrushVertexShader_core;
121 code[MainFragmentShader_MO] = qopenglslMainFragmentShader_MO_core;
122 code[MainFragmentShader_M] = qopenglslMainFragmentShader_M_core;
123 code[MainFragmentShader_O] = qopenglslMainFragmentShader_O_core;
124 code[MainFragmentShader] = qopenglslMainFragmentShader_core;
125 code[MainFragmentShader_ImageArrays] = qopenglslMainFragmentShader_ImageArrays_core;
127 code[ImageSrcFragmentShader] = qopenglslImageSrcFragmentShader_core;
128 code[ImageSrcWithPatternFragmentShader] = qopenglslImageSrcWithPatternFragmentShader_core;
129 code[NonPremultipliedImageSrcFragmentShader] = qopenglslNonPremultipliedImageSrcFragmentShader_core;
130 code[GrayscaleImageSrcFragmentShader] = qopenglslGrayscaleImageSrcFragmentShader_core;
131 code[AlphaImageSrcFragmentShader] = qopenglslAlphaImageSrcFragmentShader_core;
132 code[CustomImageSrcFragmentShader] = qopenglslCustomSrcFragmentShader_core;
133 code[SolidBrushSrcFragmentShader] = qopenglslSolidBrushSrcFragmentShader_core;
135 code[TextureBrushSrcFragmentShader] = qopenglslTextureBrushSrcFragmentShader_core;
136 code[TextureBrushSrcWithPatternFragmentShader] = qopenglslTextureBrushSrcWithPatternFragmentShader_core;
137 code[PatternBrushSrcFragmentShader] = qopenglslPatternBrushSrcFragmentShader_core;
138 code[LinearGradientBrushSrcFragmentShader] = qopenglslLinearGradientBrushSrcFragmentShader_core;
139 code[RadialGradientBrushSrcFragmentShader] = qopenglslRadialGradientBrushSrcFragmentShader_core;
140 code[ConicalGradientBrushSrcFragmentShader] = qopenglslConicalGradientBrushSrcFragmentShader_core;
141 code[ShockingPinkSrcFragmentShader] = qopenglslShockingPinkSrcFragmentShader_core;
143 code[NoMaskFragmentShader] =
"";
144 code[MaskFragmentShader] = qopenglslMaskFragmentShader_core;
145 code[RgbMaskFragmentShaderPass1] = qopenglslRgbMaskFragmentShaderPass1_core;
146 code[RgbMaskFragmentShaderPass2] = qopenglslRgbMaskFragmentShaderPass2_core;
147 code[RgbMaskWithGammaFragmentShader] =
"";
149 code[MainVertexShader] = qopenglslMainVertexShader;
150 code[MainWithTexCoordsVertexShader] = qopenglslMainWithTexCoordsVertexShader;
151 code[MainWithTexCoordsAndOpacityVertexShader] = qopenglslMainWithTexCoordsAndOpacityVertexShader;
153 code[UntransformedPositionVertexShader] = qopenglslUntransformedPositionVertexShader;
154 code[PositionOnlyVertexShader] = qopenglslPositionOnlyVertexShader;
155 code[ComplexGeometryPositionOnlyVertexShader] = qopenglslComplexGeometryPositionOnlyVertexShader;
156 code[PositionWithPatternBrushVertexShader] = qopenglslPositionWithPatternBrushVertexShader;
157 code[PositionWithLinearGradientBrushVertexShader] = qopenglslPositionWithLinearGradientBrushVertexShader;
158 code[PositionWithConicalGradientBrushVertexShader] = qopenglslPositionWithConicalGradientBrushVertexShader;
159 code[PositionWithRadialGradientBrushVertexShader] = qopenglslPositionWithRadialGradientBrushVertexShader;
160 code[PositionWithTextureBrushVertexShader] = qopenglslPositionWithTextureBrushVertexShader;
161 code[AffinePositionWithPatternBrushVertexShader] = qopenglslAffinePositionWithPatternBrushVertexShader;
162 code[AffinePositionWithLinearGradientBrushVertexShader] = qopenglslAffinePositionWithLinearGradientBrushVertexShader;
163 code[AffinePositionWithConicalGradientBrushVertexShader] = qopenglslAffinePositionWithConicalGradientBrushVertexShader;
164 code[AffinePositionWithRadialGradientBrushVertexShader] = qopenglslAffinePositionWithRadialGradientBrushVertexShader;
165 code[AffinePositionWithTextureBrushVertexShader] = qopenglslAffinePositionWithTextureBrushVertexShader;
167 code[MainFragmentShader_MO] = qopenglslMainFragmentShader_MO;
168 code[MainFragmentShader_M] = qopenglslMainFragmentShader_M;
169 code[MainFragmentShader_O] = qopenglslMainFragmentShader_O;
170 code[MainFragmentShader] = qopenglslMainFragmentShader;
171 code[MainFragmentShader_ImageArrays] = qopenglslMainFragmentShader_ImageArrays;
173 code[ImageSrcFragmentShader] = qopenglslImageSrcFragmentShader;
174 code[ImageSrcWithPatternFragmentShader] = qopenglslImageSrcWithPatternFragmentShader;
175 code[NonPremultipliedImageSrcFragmentShader] = qopenglslNonPremultipliedImageSrcFragmentShader;
176 code[GrayscaleImageSrcFragmentShader] = qopenglslGrayscaleImageSrcFragmentShader;
177 code[AlphaImageSrcFragmentShader] = qopenglslAlphaImageSrcFragmentShader;
178 code[CustomImageSrcFragmentShader] = qopenglslCustomSrcFragmentShader;
179 code[SolidBrushSrcFragmentShader] = qopenglslSolidBrushSrcFragmentShader;
180 code[TextureBrushSrcFragmentShader] = qopenglslTextureBrushSrcFragmentShader;
181 code[TextureBrushSrcWithPatternFragmentShader] = qopenglslTextureBrushSrcWithPatternFragmentShader;
182 code[PatternBrushSrcFragmentShader] = qopenglslPatternBrushSrcFragmentShader;
183 code[LinearGradientBrushSrcFragmentShader] = qopenglslLinearGradientBrushSrcFragmentShader;
184 code[RadialGradientBrushSrcFragmentShader] = qopenglslRadialGradientBrushSrcFragmentShader;
185 code[ConicalGradientBrushSrcFragmentShader] = qopenglslConicalGradientBrushSrcFragmentShader;
186 code[ShockingPinkSrcFragmentShader] = qopenglslShockingPinkSrcFragmentShader;
188 code[NoMaskFragmentShader] =
"";
189 code[MaskFragmentShader] = qopenglslMaskFragmentShader;
190 code[RgbMaskFragmentShaderPass1] = qopenglslRgbMaskFragmentShaderPass1;
191 code[RgbMaskFragmentShaderPass2] = qopenglslRgbMaskFragmentShaderPass2;
192 code[RgbMaskWithGammaFragmentShader] =
"";
197 code[NoCompositionModeFragmentShader] =
"";
198 code[MultiplyCompositionModeFragmentShader] = qopenglslMultiplyCompositionModeFragmentShader;
199 code[ScreenCompositionModeFragmentShader] = qopenglslScreenCompositionModeFragmentShader;
200 code[OverlayCompositionModeFragmentShader] = qopenglslOverlayCompositionModeFragmentShader;
201 code[DarkenCompositionModeFragmentShader] = qopenglslDarkenCompositionModeFragmentShader;
202 code[LightenCompositionModeFragmentShader] = qopenglslLightenCompositionModeFragmentShader;
203 code[ColorDodgeCompositionModeFragmentShader] = qopenglslColorDodgeCompositionModeFragmentShader;
204 code[ColorBurnCompositionModeFragmentShader] = qopenglslColorBurnCompositionModeFragmentShader;
205 code[HardLightCompositionModeFragmentShader] = qopenglslHardLightCompositionModeFragmentShader;
206 code[SoftLightCompositionModeFragmentShader] = qopenglslSoftLightCompositionModeFragmentShader;
207 code[DifferenceCompositionModeFragmentShader] = qopenglslDifferenceCompositionModeFragmentShader;
208 code[ExclusionCompositionModeFragmentShader] = qopenglslExclusionCompositionModeFragmentShader;
212 for (
int i = 0; i < TotalSnippetCount; ++i) {
213 if (Q_UNLIKELY(!qShaderSnippets[i])) {
214 qFatal(
"Shader snippet for %s (#%d) is missing!",
215 snippetNameStr(SnippetName(i)).constData(), i);
220 QByteArray vertexSource;
221 QByteArray fragSource;
225 vertexSource.append(qShaderSnippets[PositionOnlyVertexShader]);
226 vertexSource.append(qShaderSnippets[MainVertexShader]);
228 vertexSource.append(qShaderSnippets[MainVertexShader]);
229 vertexSource.append(qShaderSnippets[PositionOnlyVertexShader]);
231 fragSource.append(qShaderSnippets[MainFragmentShader]);
232 fragSource.append(qShaderSnippets[ShockingPinkSrcFragmentShader]);
234 simpleShaderProg =
new QOpenGLShaderProgram;
236 CachedShader simpleShaderCache(fragSource, vertexSource);
238 bool inCache = simpleShaderCache.load(simpleShaderProg, context);
241 if (!simpleShaderProg->addCacheableShaderFromSourceCode(QOpenGLShader::Vertex, vertexSource))
242 qWarning(
"Vertex shader for simpleShaderProg (MainVertexShader & PositionOnlyVertexShader) failed to compile");
243 if (!simpleShaderProg->addCacheableShaderFromSourceCode(QOpenGLShader::Fragment, fragSource))
244 qWarning(
"Fragment shader for simpleShaderProg (MainFragmentShader & ShockingPinkSrcFragmentShader) failed to compile");
246 simpleShaderProg->bindAttributeLocation(
"vertexCoordsArray", QT_VERTEX_COORDS_ATTR);
247 simpleShaderProg->bindAttributeLocation(
"pmvMatrix1", QT_PMV_MATRIX_1_ATTR);
248 simpleShaderProg->bindAttributeLocation(
"pmvMatrix2", QT_PMV_MATRIX_2_ATTR);
249 simpleShaderProg->bindAttributeLocation(
"pmvMatrix3", QT_PMV_MATRIX_3_ATTR);
252 simpleShaderProg->link();
254 if (Q_UNLIKELY(!simpleShaderProg->isLinked())) {
255 qCritical(
"Errors linking simple shader: %s", qPrintable(simpleShaderProg->log()));
258 simpleShaderCache.store(simpleShaderProg, context);
262 vertexSource.clear();
263 vertexSource.append(qShaderSnippets[MainWithTexCoordsVertexShader]);
264 vertexSource.append(qShaderSnippets[UntransformedPositionVertexShader]);
267 fragSource.append(qShaderSnippets[MainFragmentShader]);
268 fragSource.append(qShaderSnippets[ImageSrcFragmentShader]);
270 blitShaderProg =
new QOpenGLShaderProgram;
272 CachedShader blitShaderCache(fragSource, vertexSource);
274 inCache = blitShaderCache.load(blitShaderProg, context);
277 if (!blitShaderProg->addCacheableShaderFromSourceCode(QOpenGLShader::Vertex, vertexSource))
278 qWarning(
"Vertex shader for blitShaderProg (MainWithTexCoordsVertexShader & UntransformedPositionVertexShader) failed to compile");
279 if (!blitShaderProg->addCacheableShaderFromSourceCode(QOpenGLShader::Fragment, fragSource))
280 qWarning(
"Fragment shader for blitShaderProg (MainFragmentShader & ImageSrcFragmentShader) failed to compile");
282 blitShaderProg->bindAttributeLocation(
"textureCoordArray", QT_TEXTURE_COORDS_ATTR);
283 blitShaderProg->bindAttributeLocation(
"vertexCoordsArray", QT_VERTEX_COORDS_ATTR);
286 blitShaderProg->link();
287 if (Q_UNLIKELY(!blitShaderProg->isLinked())) {
288 qCritical(
"Errors linking blit shader: %s", qPrintable(blitShaderProg->log()));
291 blitShaderCache.store(blitShaderProg, context);
294#ifdef QT_GL_SHARED_SHADER_DEBUG
295 qDebug(
" -> QOpenGLEngineSharedShaders() %p for thread %p.",
this, QThread::currentThread());
328QOpenGLEngineShaderProg *QOpenGLEngineSharedShaders::findProgramInCache(
const QOpenGLEngineShaderProg &prog)
330 for (
int i = 0; i < cachedPrograms.size(); ++i) {
331 QOpenGLEngineShaderProg *cachedProg = cachedPrograms[i];
332 if (*cachedProg == prog) {
334 cachedPrograms.move(i, 0);
335 cachedProg->program->bind();
340 std::unique_ptr<QOpenGLEngineShaderProg> newProg;
343 QByteArray fragSource;
346 if (prog.srcPixelFragShader == CustomImageSrcFragmentShader)
347 fragSource.append(prog.customStageSource);
348 fragSource.append(qShaderSnippets[prog.mainFragShader]);
349 fragSource.append(qShaderSnippets[prog.srcPixelFragShader]);
350 if (prog.compositionFragShader)
351 fragSource.append(qShaderSnippets[prog.compositionFragShader]);
352 if (prog.maskFragShader)
353 fragSource.append(qShaderSnippets[prog.maskFragShader]);
355 QByteArray vertexSource;
357 vertexSource.append(qShaderSnippets[prog.positionVertexShader]);
358 vertexSource.append(qShaderSnippets[prog.mainVertexShader]);
360 vertexSource.append(qShaderSnippets[prog.mainVertexShader]);
361 vertexSource.append(qShaderSnippets[prog.positionVertexShader]);
363 auto shaderProgram = std::make_unique<QOpenGLShaderProgram>();
365 CachedShader shaderCache(fragSource, vertexSource);
366 bool inCache = shaderCache.load(shaderProgram.get(), QOpenGLContext::currentContext());
369 if (!shaderProgram->addCacheableShaderFromSourceCode(QOpenGLShader::Vertex, vertexSource)) {
370 QByteArray description;
372 description.append(
"Vertex shader: main=");
373 description.append(snippetNameStr(prog.mainVertexShader));
374 description.append(
", position=");
375 description.append(snippetNameStr(prog.positionVertexShader));
377 qWarning(
"Warning: \"%s\" failed to compile!", description.constData());
380 if (!shaderProgram->addCacheableShaderFromSourceCode(QOpenGLShader::Fragment, fragSource)) {
381 QByteArray description;
383 description.append(
"Fragment shader: main=");
384 description.append(snippetNameStr(prog.mainFragShader));
385 description.append(
", srcPixel=");
386 description.append(snippetNameStr(prog.srcPixelFragShader));
387 if (prog.compositionFragShader) {
388 description.append(
", composition=");
389 description.append(snippetNameStr(prog.compositionFragShader));
391 if (prog.maskFragShader) {
392 description.append(
", mask=");
393 description.append(snippetNameStr(prog.maskFragShader));
396 qWarning(
"Warning: \"%s\" failed to compile!", description.constData());
401 shaderProgram->bindAttributeLocation(
"vertexCoordsArray", QT_VERTEX_COORDS_ATTR);
402 if (prog.useTextureCoords)
403 shaderProgram->bindAttributeLocation(
"textureCoordArray", QT_TEXTURE_COORDS_ATTR);
404 if (prog.useOpacityAttribute)
405 shaderProgram->bindAttributeLocation(
"opacityArray", QT_OPACITY_ATTR);
406 if (prog.usePmvMatrixAttribute) {
407 shaderProgram->bindAttributeLocation(
"pmvMatrix1", QT_PMV_MATRIX_1_ATTR);
408 shaderProgram->bindAttributeLocation(
"pmvMatrix2", QT_PMV_MATRIX_2_ATTR);
409 shaderProgram->bindAttributeLocation(
"pmvMatrix3", QT_PMV_MATRIX_3_ATTR);
413 newProg.reset(
new QOpenGLEngineShaderProg(prog));
414 newProg->program = shaderProgram.release();
416 newProg->program->link();
417 if (newProg->program->isLinked()) {
419 shaderCache.store(newProg->program, QOpenGLContext::currentContext());
421 qWarning(
"Shader program failed to link\n"
423 " %ls", qUtf16Printable(newProg->program->log()));
427 newProg->program->bind();
429 if (newProg->maskFragShader != QOpenGLEngineSharedShaders::NoMaskFragmentShader) {
430 GLuint location = newProg->program->uniformLocation(
"maskTexture");
434 if (cachedPrograms.size() > 30) {
438 for (
int i = 0; i < 5; ++i) {
439 delete cachedPrograms.last();
440 cachedPrograms.removeLast();
444 cachedPrograms.insert(0, newProg.get());
447 return newProg.release();
643bool QOpenGLEngineShaderManager::useCorrectShaderProg()
645 if (!shaderProgNeedsChanging)
648 bool useCustomSrc = customSrcStage !=
nullptr;
649 if (useCustomSrc && srcPixelType != QOpenGLEngineShaderManager::ImageSrc && srcPixelType != Qt::TexturePattern) {
650 useCustomSrc =
false;
651 qWarning(
"QOpenGLEngineShaderManager - Ignoring custom shader stage for non image src");
654 QOpenGLEngineShaderProg requiredProgram;
656 bool texCoords =
false;
660 requiredProgram.positionVertexShader = QOpenGLEngineSharedShaders::InvalidSnippetName;
661 requiredProgram.srcPixelFragShader = QOpenGLEngineSharedShaders::InvalidSnippetName;
662 bool isAffine = brushTransform.isAffine();
663 if ( (srcPixelType >= Qt::Dense1Pattern) && (srcPixelType <= Qt::DiagCrossPattern) ) {
665 requiredProgram.positionVertexShader = QOpenGLEngineSharedShaders::AffinePositionWithPatternBrushVertexShader;
667 requiredProgram.positionVertexShader = QOpenGLEngineSharedShaders::PositionWithPatternBrushVertexShader;
669 requiredProgram.srcPixelFragShader = QOpenGLEngineSharedShaders::PatternBrushSrcFragmentShader;
671 else switch (srcPixelType) {
674 qFatal(
"QOpenGLEngineShaderManager::useCorrectShaderProg() - Qt::NoBrush style is set");
676 case QOpenGLEngineShaderManager::ImageSrc:
677 requiredProgram.srcPixelFragShader = QOpenGLEngineSharedShaders::ImageSrcFragmentShader;
678 requiredProgram.positionVertexShader = QOpenGLEngineSharedShaders::PositionOnlyVertexShader;
681 case QOpenGLEngineShaderManager::NonPremultipliedImageSrc:
682 requiredProgram.srcPixelFragShader = QOpenGLEngineSharedShaders::NonPremultipliedImageSrcFragmentShader;
683 requiredProgram.positionVertexShader = QOpenGLEngineSharedShaders::PositionOnlyVertexShader;
686 case QOpenGLEngineShaderManager::GrayscaleImageSrc:
687 requiredProgram.srcPixelFragShader = QOpenGLEngineSharedShaders::GrayscaleImageSrcFragmentShader;
688 requiredProgram.positionVertexShader = QOpenGLEngineSharedShaders::PositionOnlyVertexShader;
691 case QOpenGLEngineShaderManager::AlphaImageSrc:
692 requiredProgram.srcPixelFragShader = QOpenGLEngineSharedShaders::AlphaImageSrcFragmentShader;
693 requiredProgram.positionVertexShader = QOpenGLEngineSharedShaders::PositionOnlyVertexShader;
696 case QOpenGLEngineShaderManager::PatternSrc:
697 requiredProgram.srcPixelFragShader = QOpenGLEngineSharedShaders::ImageSrcWithPatternFragmentShader;
698 requiredProgram.positionVertexShader = QOpenGLEngineSharedShaders::PositionOnlyVertexShader;
701 case QOpenGLEngineShaderManager::TextureSrcWithPattern:
702 requiredProgram.srcPixelFragShader = QOpenGLEngineSharedShaders::TextureBrushSrcWithPatternFragmentShader;
703 requiredProgram.positionVertexShader = isAffine ? QOpenGLEngineSharedShaders::AffinePositionWithTextureBrushVertexShader
704 : QOpenGLEngineSharedShaders::PositionWithTextureBrushVertexShader;
706 case Qt::SolidPattern:
707 requiredProgram.srcPixelFragShader = QOpenGLEngineSharedShaders::SolidBrushSrcFragmentShader;
708 requiredProgram.positionVertexShader = QOpenGLEngineSharedShaders::PositionOnlyVertexShader;
710 case Qt::LinearGradientPattern:
711 requiredProgram.srcPixelFragShader = QOpenGLEngineSharedShaders::LinearGradientBrushSrcFragmentShader;
712 requiredProgram.positionVertexShader = isAffine ? QOpenGLEngineSharedShaders::AffinePositionWithLinearGradientBrushVertexShader
713 : QOpenGLEngineSharedShaders::PositionWithLinearGradientBrushVertexShader;
715 case Qt::ConicalGradientPattern:
716 requiredProgram.srcPixelFragShader = QOpenGLEngineSharedShaders::ConicalGradientBrushSrcFragmentShader;
717 requiredProgram.positionVertexShader = isAffine ? QOpenGLEngineSharedShaders::AffinePositionWithConicalGradientBrushVertexShader
718 : QOpenGLEngineSharedShaders::PositionWithConicalGradientBrushVertexShader;
720 case Qt::RadialGradientPattern:
721 requiredProgram.srcPixelFragShader = QOpenGLEngineSharedShaders::RadialGradientBrushSrcFragmentShader;
722 requiredProgram.positionVertexShader = isAffine ? QOpenGLEngineSharedShaders::AffinePositionWithRadialGradientBrushVertexShader
723 : QOpenGLEngineSharedShaders::PositionWithRadialGradientBrushVertexShader;
725 case Qt::TexturePattern:
726 requiredProgram.srcPixelFragShader = QOpenGLEngineSharedShaders::TextureBrushSrcFragmentShader;
727 requiredProgram.positionVertexShader = isAffine ? QOpenGLEngineSharedShaders::AffinePositionWithTextureBrushVertexShader
728 : QOpenGLEngineSharedShaders::PositionWithTextureBrushVertexShader;
733 requiredProgram.srcPixelFragShader = QOpenGLEngineSharedShaders::CustomImageSrcFragmentShader;
734 requiredProgram.customStageSource = customSrcStage->source();
737 const bool hasCompose = compositionMode > QPainter::CompositionMode_Plus;
738 const bool hasMask = maskType != QOpenGLEngineShaderManager::NoMask;
741 if (opacityMode == AttributeOpacity) {
742 Q_ASSERT(!hasCompose && !hasMask);
743 requiredProgram.mainFragShader = QOpenGLEngineSharedShaders::MainFragmentShader_ImageArrays;
745 bool useGlobalOpacity = (opacityMode == UniformOpacity);
746 if (hasMask && useGlobalOpacity)
747 requiredProgram.mainFragShader = QOpenGLEngineSharedShaders::MainFragmentShader_MO;
748 if (hasMask && !useGlobalOpacity)
749 requiredProgram.mainFragShader = QOpenGLEngineSharedShaders::MainFragmentShader_M;
750 if (!hasMask && useGlobalOpacity)
751 requiredProgram.mainFragShader = QOpenGLEngineSharedShaders::MainFragmentShader_O;
752 if (!hasMask && !useGlobalOpacity)
753 requiredProgram.mainFragShader = QOpenGLEngineSharedShaders::MainFragmentShader;
757 if (maskType == PixelMask) {
758 requiredProgram.maskFragShader = QOpenGLEngineSharedShaders::MaskFragmentShader;
760 }
else if (maskType == SubPixelMaskPass1) {
761 requiredProgram.maskFragShader = QOpenGLEngineSharedShaders::RgbMaskFragmentShaderPass1;
763 }
else if (maskType == SubPixelMaskPass2) {
764 requiredProgram.maskFragShader = QOpenGLEngineSharedShaders::RgbMaskFragmentShaderPass2;
766 }
else if (maskType == SubPixelWithGammaMask) {
767 requiredProgram.maskFragShader = QOpenGLEngineSharedShaders::RgbMaskWithGammaFragmentShader;
770 qCritical(
"QOpenGLEngineShaderManager::useCorrectShaderProg() - Unknown mask type");
773 requiredProgram.maskFragShader = QOpenGLEngineSharedShaders::NoMaskFragmentShader;
777 switch (compositionMode) {
778 case QPainter::CompositionMode_Multiply:
779 requiredProgram.compositionFragShader = QOpenGLEngineSharedShaders::MultiplyCompositionModeFragmentShader;
781 case QPainter::CompositionMode_Screen:
782 requiredProgram.compositionFragShader = QOpenGLEngineSharedShaders::ScreenCompositionModeFragmentShader;
784 case QPainter::CompositionMode_Overlay:
785 requiredProgram.compositionFragShader = QOpenGLEngineSharedShaders::OverlayCompositionModeFragmentShader;
787 case QPainter::CompositionMode_Darken:
788 requiredProgram.compositionFragShader = QOpenGLEngineSharedShaders::DarkenCompositionModeFragmentShader;
790 case QPainter::CompositionMode_Lighten:
791 requiredProgram.compositionFragShader = QOpenGLEngineSharedShaders::LightenCompositionModeFragmentShader;
793 case QPainter::CompositionMode_ColorDodge:
794 requiredProgram.compositionFragShader = QOpenGLEngineSharedShaders::ColorDodgeCompositionModeFragmentShader;
796 case QPainter::CompositionMode_ColorBurn:
797 requiredProgram.compositionFragShader = QOpenGLEngineSharedShaders::ColorBurnCompositionModeFragmentShader;
799 case QPainter::CompositionMode_HardLight:
800 requiredProgram.compositionFragShader = QOpenGLEngineSharedShaders::HardLightCompositionModeFragmentShader;
802 case QPainter::CompositionMode_SoftLight:
803 requiredProgram.compositionFragShader = QOpenGLEngineSharedShaders::SoftLightCompositionModeFragmentShader;
805 case QPainter::CompositionMode_Difference:
806 requiredProgram.compositionFragShader = QOpenGLEngineSharedShaders::DifferenceCompositionModeFragmentShader;
808 case QPainter::CompositionMode_Exclusion:
809 requiredProgram.compositionFragShader = QOpenGLEngineSharedShaders::ExclusionCompositionModeFragmentShader;
812 qWarning(
"QOpenGLEngineShaderManager::useCorrectShaderProg() - Unsupported composition mode");
815 requiredProgram.compositionFragShader = QOpenGLEngineSharedShaders::NoCompositionModeFragmentShader;
819 if (opacityMode == AttributeOpacity) {
821 requiredProgram.mainVertexShader = QOpenGLEngineSharedShaders::MainWithTexCoordsAndOpacityVertexShader;
822 }
else if (texCoords) {
823 requiredProgram.mainVertexShader = QOpenGLEngineSharedShaders::MainWithTexCoordsVertexShader;
825 requiredProgram.mainVertexShader = QOpenGLEngineSharedShaders::MainVertexShader;
827 requiredProgram.useTextureCoords = texCoords;
828 requiredProgram.useOpacityAttribute = (opacityMode == AttributeOpacity);
829 if (complexGeometry && srcPixelType == Qt::SolidPattern) {
830 requiredProgram.positionVertexShader = QOpenGLEngineSharedShaders::ComplexGeometryPositionOnlyVertexShader;
831 requiredProgram.usePmvMatrixAttribute =
false;
833 requiredProgram.usePmvMatrixAttribute =
true;
837 complexGeometry =
false;
841 currentShaderProg = sharedShaders->findProgramInCache(requiredProgram);
843 if (currentShaderProg && useCustomSrc) {
844 customSrcStage->setUniforms(currentShaderProg->program);
849 QOpenGLContextPrivate* ctx_d = ctx->d_func();
850 QOpenGL2PaintEngineEx *active_engine =
static_cast<QOpenGL2PaintEngineEx *>(ctx_d->active_engine);
851 active_engine->d_func()->setVertexAttribArrayEnabled(QT_VERTEX_COORDS_ATTR,
true);
852 active_engine->d_func()->setVertexAttribArrayEnabled(QT_TEXTURE_COORDS_ATTR, currentShaderProg && currentShaderProg->useTextureCoords);
853 active_engine->d_func()->setVertexAttribArrayEnabled(QT_OPACITY_ATTR, currentShaderProg && currentShaderProg->useOpacityAttribute);
855 shaderProgNeedsChanging =
false;