84QOpenGLEngineSharedShaders::QOpenGLEngineSharedShaders(QOpenGLContext* context)
85 : blitShaderProg(
nullptr)
86 , simpleShaderProg(
nullptr)
90
91
92
93
94
98 const QSurfaceFormat &fmt = context->format();
99 const bool isCoreProfile = fmt.profile() == QSurfaceFormat::CoreProfile && fmt.version() >= std::pair(3,2);
101 const char** code = qShaderSnippets;
104 code[MainVertexShader] = qopenglslMainVertexShader_core;
105 code[MainWithTexCoordsVertexShader] = qopenglslMainWithTexCoordsVertexShader_core;
106 code[MainWithTexCoordsAndOpacityVertexShader] = qopenglslMainWithTexCoordsAndOpacityVertexShader_core;
108 code[UntransformedPositionVertexShader] = qopenglslUntransformedPositionVertexShader_core;
109 code[PositionOnlyVertexShader] = qopenglslPositionOnlyVertexShader_core;
110 code[ComplexGeometryPositionOnlyVertexShader] = qopenglslComplexGeometryPositionOnlyVertexShader_core;
111 code[PositionWithPatternBrushVertexShader] = qopenglslPositionWithPatternBrushVertexShader_core;
112 code[PositionWithLinearGradientBrushVertexShader] = qopenglslPositionWithLinearGradientBrushVertexShader_core;
113 code[PositionWithConicalGradientBrushVertexShader] = qopenglslPositionWithConicalGradientBrushVertexShader_core;
114 code[PositionWithRadialGradientBrushVertexShader] = qopenglslPositionWithRadialGradientBrushVertexShader_core;
115 code[PositionWithTextureBrushVertexShader] = qopenglslPositionWithTextureBrushVertexShader_core;
116 code[AffinePositionWithPatternBrushVertexShader] = qopenglslAffinePositionWithPatternBrushVertexShader_core;
117 code[AffinePositionWithLinearGradientBrushVertexShader] = qopenglslAffinePositionWithLinearGradientBrushVertexShader_core;
118 code[AffinePositionWithConicalGradientBrushVertexShader] = qopenglslAffinePositionWithConicalGradientBrushVertexShader_core;
119 code[AffinePositionWithRadialGradientBrushVertexShader] = qopenglslAffinePositionWithRadialGradientBrushVertexShader_core;
120 code[AffinePositionWithTextureBrushVertexShader] = qopenglslAffinePositionWithTextureBrushVertexShader_core;
122 code[MainFragmentShader_MO] = qopenglslMainFragmentShader_MO_core;
123 code[MainFragmentShader_M] = qopenglslMainFragmentShader_M_core;
124 code[MainFragmentShader_O] = qopenglslMainFragmentShader_O_core;
125 code[MainFragmentShader] = qopenglslMainFragmentShader_core;
126 code[MainFragmentShader_ImageArrays] = qopenglslMainFragmentShader_ImageArrays_core;
128 code[ImageSrcFragmentShader] = qopenglslImageSrcFragmentShader_core;
129 code[ImageSrcWithPatternFragmentShader] = qopenglslImageSrcWithPatternFragmentShader_core;
130 code[NonPremultipliedImageSrcFragmentShader] = qopenglslNonPremultipliedImageSrcFragmentShader_core;
131 code[GrayscaleImageSrcFragmentShader] = qopenglslGrayscaleImageSrcFragmentShader_core;
132 code[AlphaImageSrcFragmentShader] = qopenglslAlphaImageSrcFragmentShader_core;
133 code[CustomImageSrcFragmentShader] = qopenglslCustomSrcFragmentShader_core;
134 code[SolidBrushSrcFragmentShader] = qopenglslSolidBrushSrcFragmentShader_core;
136 code[TextureBrushSrcFragmentShader] = qopenglslTextureBrushSrcFragmentShader_core;
137 code[TextureBrushSrcWithPatternFragmentShader] = qopenglslTextureBrushSrcWithPatternFragmentShader_core;
138 code[PatternBrushSrcFragmentShader] = qopenglslPatternBrushSrcFragmentShader_core;
139 code[LinearGradientBrushSrcFragmentShader] = qopenglslLinearGradientBrushSrcFragmentShader_core;
140 code[RadialGradientBrushSrcFragmentShader] = qopenglslRadialGradientBrushSrcFragmentShader_core;
141 code[ConicalGradientBrushSrcFragmentShader] = qopenglslConicalGradientBrushSrcFragmentShader_core;
142 code[ShockingPinkSrcFragmentShader] = qopenglslShockingPinkSrcFragmentShader_core;
144 code[NoMaskFragmentShader] =
"";
145 code[MaskFragmentShader] = qopenglslMaskFragmentShader_core;
146 code[RgbMaskFragmentShaderPass1] = qopenglslRgbMaskFragmentShaderPass1_core;
147 code[RgbMaskFragmentShaderPass2] = qopenglslRgbMaskFragmentShaderPass2_core;
148 code[RgbMaskWithGammaFragmentShader] =
"";
150 code[MainVertexShader] = qopenglslMainVertexShader;
151 code[MainWithTexCoordsVertexShader] = qopenglslMainWithTexCoordsVertexShader;
152 code[MainWithTexCoordsAndOpacityVertexShader] = qopenglslMainWithTexCoordsAndOpacityVertexShader;
154 code[UntransformedPositionVertexShader] = qopenglslUntransformedPositionVertexShader;
155 code[PositionOnlyVertexShader] = qopenglslPositionOnlyVertexShader;
156 code[ComplexGeometryPositionOnlyVertexShader] = qopenglslComplexGeometryPositionOnlyVertexShader;
157 code[PositionWithPatternBrushVertexShader] = qopenglslPositionWithPatternBrushVertexShader;
158 code[PositionWithLinearGradientBrushVertexShader] = qopenglslPositionWithLinearGradientBrushVertexShader;
159 code[PositionWithConicalGradientBrushVertexShader] = qopenglslPositionWithConicalGradientBrushVertexShader;
160 code[PositionWithRadialGradientBrushVertexShader] = qopenglslPositionWithRadialGradientBrushVertexShader;
161 code[PositionWithTextureBrushVertexShader] = qopenglslPositionWithTextureBrushVertexShader;
162 code[AffinePositionWithPatternBrushVertexShader] = qopenglslAffinePositionWithPatternBrushVertexShader;
163 code[AffinePositionWithLinearGradientBrushVertexShader] = qopenglslAffinePositionWithLinearGradientBrushVertexShader;
164 code[AffinePositionWithConicalGradientBrushVertexShader] = qopenglslAffinePositionWithConicalGradientBrushVertexShader;
165 code[AffinePositionWithRadialGradientBrushVertexShader] = qopenglslAffinePositionWithRadialGradientBrushVertexShader;
166 code[AffinePositionWithTextureBrushVertexShader] = qopenglslAffinePositionWithTextureBrushVertexShader;
168 code[MainFragmentShader_MO] = qopenglslMainFragmentShader_MO;
169 code[MainFragmentShader_M] = qopenglslMainFragmentShader_M;
170 code[MainFragmentShader_O] = qopenglslMainFragmentShader_O;
171 code[MainFragmentShader] = qopenglslMainFragmentShader;
172 code[MainFragmentShader_ImageArrays] = qopenglslMainFragmentShader_ImageArrays;
174 code[ImageSrcFragmentShader] = qopenglslImageSrcFragmentShader;
175 code[ImageSrcWithPatternFragmentShader] = qopenglslImageSrcWithPatternFragmentShader;
176 code[NonPremultipliedImageSrcFragmentShader] = qopenglslNonPremultipliedImageSrcFragmentShader;
177 code[GrayscaleImageSrcFragmentShader] = qopenglslGrayscaleImageSrcFragmentShader;
178 code[AlphaImageSrcFragmentShader] = qopenglslAlphaImageSrcFragmentShader;
179 code[CustomImageSrcFragmentShader] = qopenglslCustomSrcFragmentShader;
180 code[SolidBrushSrcFragmentShader] = qopenglslSolidBrushSrcFragmentShader;
181 code[TextureBrushSrcFragmentShader] = qopenglslTextureBrushSrcFragmentShader;
182 code[TextureBrushSrcWithPatternFragmentShader] = qopenglslTextureBrushSrcWithPatternFragmentShader;
183 code[PatternBrushSrcFragmentShader] = qopenglslPatternBrushSrcFragmentShader;
184 code[LinearGradientBrushSrcFragmentShader] = qopenglslLinearGradientBrushSrcFragmentShader;
185 code[RadialGradientBrushSrcFragmentShader] = qopenglslRadialGradientBrushSrcFragmentShader;
186 code[ConicalGradientBrushSrcFragmentShader] = qopenglslConicalGradientBrushSrcFragmentShader;
187 code[ShockingPinkSrcFragmentShader] = qopenglslShockingPinkSrcFragmentShader;
189 code[NoMaskFragmentShader] =
"";
190 code[MaskFragmentShader] = qopenglslMaskFragmentShader;
191 code[RgbMaskFragmentShaderPass1] = qopenglslRgbMaskFragmentShaderPass1;
192 code[RgbMaskFragmentShaderPass2] = qopenglslRgbMaskFragmentShaderPass2;
193 code[RgbMaskWithGammaFragmentShader] =
"";
198 code[NoCompositionModeFragmentShader] =
"";
199 code[MultiplyCompositionModeFragmentShader] = qopenglslMultiplyCompositionModeFragmentShader;
200 code[ScreenCompositionModeFragmentShader] = qopenglslScreenCompositionModeFragmentShader;
201 code[OverlayCompositionModeFragmentShader] = qopenglslOverlayCompositionModeFragmentShader;
202 code[DarkenCompositionModeFragmentShader] = qopenglslDarkenCompositionModeFragmentShader;
203 code[LightenCompositionModeFragmentShader] = qopenglslLightenCompositionModeFragmentShader;
204 code[ColorDodgeCompositionModeFragmentShader] = qopenglslColorDodgeCompositionModeFragmentShader;
205 code[ColorBurnCompositionModeFragmentShader] = qopenglslColorBurnCompositionModeFragmentShader;
206 code[HardLightCompositionModeFragmentShader] = qopenglslHardLightCompositionModeFragmentShader;
207 code[SoftLightCompositionModeFragmentShader] = qopenglslSoftLightCompositionModeFragmentShader;
208 code[DifferenceCompositionModeFragmentShader] = qopenglslDifferenceCompositionModeFragmentShader;
209 code[ExclusionCompositionModeFragmentShader] = qopenglslExclusionCompositionModeFragmentShader;
213 for (
int i = 0; i < TotalSnippetCount; ++i) {
214 if (Q_UNLIKELY(!qShaderSnippets[i])) {
215 qFatal(
"Shader snippet for %s (#%d) is missing!",
216 snippetNameStr(SnippetName(i)).constData(), i);
221 QByteArray vertexSource;
222 QByteArray fragSource;
226 vertexSource.append(qShaderSnippets[PositionOnlyVertexShader]);
227 vertexSource.append(qShaderSnippets[MainVertexShader]);
229 vertexSource.append(qShaderSnippets[MainVertexShader]);
230 vertexSource.append(qShaderSnippets[PositionOnlyVertexShader]);
232 fragSource.append(qShaderSnippets[MainFragmentShader]);
233 fragSource.append(qShaderSnippets[ShockingPinkSrcFragmentShader]);
235 simpleShaderProg =
new QOpenGLShaderProgram;
237 CachedShader simpleShaderCache(fragSource, vertexSource);
239 bool inCache = simpleShaderCache.load(simpleShaderProg, context);
242 if (!simpleShaderProg->addCacheableShaderFromSourceCode(QOpenGLShader::Vertex, vertexSource))
243 qWarning(
"Vertex shader for simpleShaderProg (MainVertexShader & PositionOnlyVertexShader) failed to compile");
244 if (!simpleShaderProg->addCacheableShaderFromSourceCode(QOpenGLShader::Fragment, fragSource))
245 qWarning(
"Fragment shader for simpleShaderProg (MainFragmentShader & ShockingPinkSrcFragmentShader) failed to compile");
247 simpleShaderProg->bindAttributeLocation(
"vertexCoordsArray", QT_VERTEX_COORDS_ATTR);
248 simpleShaderProg->bindAttributeLocation(
"pmvMatrix1", QT_PMV_MATRIX_1_ATTR);
249 simpleShaderProg->bindAttributeLocation(
"pmvMatrix2", QT_PMV_MATRIX_2_ATTR);
250 simpleShaderProg->bindAttributeLocation(
"pmvMatrix3", QT_PMV_MATRIX_3_ATTR);
253 simpleShaderProg->link();
255 if (Q_UNLIKELY(!simpleShaderProg->isLinked())) {
256 qCritical(
"Errors linking simple shader: %s", qPrintable(simpleShaderProg->log()));
259 simpleShaderCache.store(simpleShaderProg, context);
263 vertexSource.clear();
264 vertexSource.append(qShaderSnippets[MainWithTexCoordsVertexShader]);
265 vertexSource.append(qShaderSnippets[UntransformedPositionVertexShader]);
268 fragSource.append(qShaderSnippets[MainFragmentShader]);
269 fragSource.append(qShaderSnippets[ImageSrcFragmentShader]);
271 blitShaderProg =
new QOpenGLShaderProgram;
273 CachedShader blitShaderCache(fragSource, vertexSource);
275 inCache = blitShaderCache.load(blitShaderProg, context);
278 if (!blitShaderProg->addCacheableShaderFromSourceCode(QOpenGLShader::Vertex, vertexSource))
279 qWarning(
"Vertex shader for blitShaderProg (MainWithTexCoordsVertexShader & UntransformedPositionVertexShader) failed to compile");
280 if (!blitShaderProg->addCacheableShaderFromSourceCode(QOpenGLShader::Fragment, fragSource))
281 qWarning(
"Fragment shader for blitShaderProg (MainFragmentShader & ImageSrcFragmentShader) failed to compile");
283 blitShaderProg->bindAttributeLocation(
"textureCoordArray", QT_TEXTURE_COORDS_ATTR);
284 blitShaderProg->bindAttributeLocation(
"vertexCoordsArray", QT_VERTEX_COORDS_ATTR);
287 blitShaderProg->link();
288 if (Q_UNLIKELY(!blitShaderProg->isLinked())) {
289 qCritical(
"Errors linking blit shader: %s", qPrintable(blitShaderProg->log()));
292 blitShaderCache.store(blitShaderProg, context);
295#ifdef QT_GL_SHARED_SHADER_DEBUG
296 qDebug(
" -> QOpenGLEngineSharedShaders() %p for thread %p.",
this, QThread::currentThread());
329QOpenGLEngineShaderProg *QOpenGLEngineSharedShaders::findProgramInCache(
const QOpenGLEngineShaderProg &prog)
331 for (
int i = 0; i < cachedPrograms.size(); ++i) {
332 QOpenGLEngineShaderProg *cachedProg = cachedPrograms[i];
333 if (*cachedProg == prog) {
335 cachedPrograms.move(i, 0);
336 cachedProg->program->bind();
341 std::unique_ptr<QOpenGLEngineShaderProg> newProg;
344 QByteArray fragSource;
347 if (prog.srcPixelFragShader == CustomImageSrcFragmentShader)
348 fragSource.append(prog.customStageSource);
349 fragSource.append(qShaderSnippets[prog.mainFragShader]);
350 fragSource.append(qShaderSnippets[prog.srcPixelFragShader]);
351 if (prog.compositionFragShader)
352 fragSource.append(qShaderSnippets[prog.compositionFragShader]);
353 if (prog.maskFragShader)
354 fragSource.append(qShaderSnippets[prog.maskFragShader]);
356 QByteArray vertexSource;
358 vertexSource.append(qShaderSnippets[prog.positionVertexShader]);
359 vertexSource.append(qShaderSnippets[prog.mainVertexShader]);
361 vertexSource.append(qShaderSnippets[prog.mainVertexShader]);
362 vertexSource.append(qShaderSnippets[prog.positionVertexShader]);
364 auto shaderProgram = std::make_unique<QOpenGLShaderProgram>();
366 CachedShader shaderCache(fragSource, vertexSource);
367 bool inCache = shaderCache.load(shaderProgram.get(), QOpenGLContext::currentContext());
370 if (!shaderProgram->addCacheableShaderFromSourceCode(QOpenGLShader::Vertex, vertexSource)) {
371 QByteArray description;
373 description.append(
"Vertex shader: main=");
374 description.append(snippetNameStr(prog.mainVertexShader));
375 description.append(
", position=");
376 description.append(snippetNameStr(prog.positionVertexShader));
378 qWarning(
"Warning: \"%s\" failed to compile!", description.constData());
381 if (!shaderProgram->addCacheableShaderFromSourceCode(QOpenGLShader::Fragment, fragSource)) {
382 QByteArray description;
384 description.append(
"Fragment shader: main=");
385 description.append(snippetNameStr(prog.mainFragShader));
386 description.append(
", srcPixel=");
387 description.append(snippetNameStr(prog.srcPixelFragShader));
388 if (prog.compositionFragShader) {
389 description.append(
", composition=");
390 description.append(snippetNameStr(prog.compositionFragShader));
392 if (prog.maskFragShader) {
393 description.append(
", mask=");
394 description.append(snippetNameStr(prog.maskFragShader));
397 qWarning(
"Warning: \"%s\" failed to compile!", description.constData());
402 shaderProgram->bindAttributeLocation(
"vertexCoordsArray", QT_VERTEX_COORDS_ATTR);
403 if (prog.useTextureCoords)
404 shaderProgram->bindAttributeLocation(
"textureCoordArray", QT_TEXTURE_COORDS_ATTR);
405 if (prog.useOpacityAttribute)
406 shaderProgram->bindAttributeLocation(
"opacityArray", QT_OPACITY_ATTR);
407 if (prog.usePmvMatrixAttribute) {
408 shaderProgram->bindAttributeLocation(
"pmvMatrix1", QT_PMV_MATRIX_1_ATTR);
409 shaderProgram->bindAttributeLocation(
"pmvMatrix2", QT_PMV_MATRIX_2_ATTR);
410 shaderProgram->bindAttributeLocation(
"pmvMatrix3", QT_PMV_MATRIX_3_ATTR);
414 newProg.reset(
new QOpenGLEngineShaderProg(prog));
415 newProg->program = shaderProgram.release();
417 newProg->program->link();
418 if (newProg->program->isLinked()) {
420 shaderCache.store(newProg->program, QOpenGLContext::currentContext());
422 qWarning(
"Shader program failed to link\n"
424 " %ls", qUtf16Printable(newProg->program->log()));
428 newProg->program->bind();
430 if (newProg->maskFragShader != QOpenGLEngineSharedShaders::NoMaskFragmentShader) {
431 GLuint location = newProg->program->uniformLocation(
"maskTexture");
435 if (cachedPrograms.size() > 30) {
439 for (
int i = 0; i < 5; ++i) {
440 delete cachedPrograms.last();
441 cachedPrograms.removeLast();
445 cachedPrograms.insert(0, newProg.get());
448 return newProg.release();
644bool QOpenGLEngineShaderManager::useCorrectShaderProg()
646 if (!shaderProgNeedsChanging)
649 bool useCustomSrc = customSrcStage !=
nullptr;
650 if (useCustomSrc && srcPixelType != QOpenGLEngineShaderManager::ImageSrc && srcPixelType != Qt::TexturePattern) {
651 useCustomSrc =
false;
652 qWarning(
"QOpenGLEngineShaderManager - Ignoring custom shader stage for non image src");
655 QOpenGLEngineShaderProg requiredProgram;
657 bool texCoords =
false;
661 requiredProgram.positionVertexShader = QOpenGLEngineSharedShaders::InvalidSnippetName;
662 requiredProgram.srcPixelFragShader = QOpenGLEngineSharedShaders::InvalidSnippetName;
663 bool isAffine = brushTransform.isAffine();
664 if ( (srcPixelType >= Qt::Dense1Pattern) && (srcPixelType <= Qt::DiagCrossPattern) ) {
666 requiredProgram.positionVertexShader = QOpenGLEngineSharedShaders::AffinePositionWithPatternBrushVertexShader;
668 requiredProgram.positionVertexShader = QOpenGLEngineSharedShaders::PositionWithPatternBrushVertexShader;
670 requiredProgram.srcPixelFragShader = QOpenGLEngineSharedShaders::PatternBrushSrcFragmentShader;
672 else switch (srcPixelType) {
675 qFatal(
"QOpenGLEngineShaderManager::useCorrectShaderProg() - Qt::NoBrush style is set");
677 case QOpenGLEngineShaderManager::ImageSrc:
678 requiredProgram.srcPixelFragShader = QOpenGLEngineSharedShaders::ImageSrcFragmentShader;
679 requiredProgram.positionVertexShader = QOpenGLEngineSharedShaders::PositionOnlyVertexShader;
682 case QOpenGLEngineShaderManager::NonPremultipliedImageSrc:
683 requiredProgram.srcPixelFragShader = QOpenGLEngineSharedShaders::NonPremultipliedImageSrcFragmentShader;
684 requiredProgram.positionVertexShader = QOpenGLEngineSharedShaders::PositionOnlyVertexShader;
687 case QOpenGLEngineShaderManager::GrayscaleImageSrc:
688 requiredProgram.srcPixelFragShader = QOpenGLEngineSharedShaders::GrayscaleImageSrcFragmentShader;
689 requiredProgram.positionVertexShader = QOpenGLEngineSharedShaders::PositionOnlyVertexShader;
692 case QOpenGLEngineShaderManager::AlphaImageSrc:
693 requiredProgram.srcPixelFragShader = QOpenGLEngineSharedShaders::AlphaImageSrcFragmentShader;
694 requiredProgram.positionVertexShader = QOpenGLEngineSharedShaders::PositionOnlyVertexShader;
697 case QOpenGLEngineShaderManager::PatternSrc:
698 requiredProgram.srcPixelFragShader = QOpenGLEngineSharedShaders::ImageSrcWithPatternFragmentShader;
699 requiredProgram.positionVertexShader = QOpenGLEngineSharedShaders::PositionOnlyVertexShader;
702 case QOpenGLEngineShaderManager::TextureSrcWithPattern:
703 requiredProgram.srcPixelFragShader = QOpenGLEngineSharedShaders::TextureBrushSrcWithPatternFragmentShader;
704 requiredProgram.positionVertexShader = isAffine ? QOpenGLEngineSharedShaders::AffinePositionWithTextureBrushVertexShader
705 : QOpenGLEngineSharedShaders::PositionWithTextureBrushVertexShader;
707 case Qt::SolidPattern:
708 requiredProgram.srcPixelFragShader = QOpenGLEngineSharedShaders::SolidBrushSrcFragmentShader;
709 requiredProgram.positionVertexShader = QOpenGLEngineSharedShaders::PositionOnlyVertexShader;
711 case Qt::LinearGradientPattern:
712 requiredProgram.srcPixelFragShader = QOpenGLEngineSharedShaders::LinearGradientBrushSrcFragmentShader;
713 requiredProgram.positionVertexShader = isAffine ? QOpenGLEngineSharedShaders::AffinePositionWithLinearGradientBrushVertexShader
714 : QOpenGLEngineSharedShaders::PositionWithLinearGradientBrushVertexShader;
716 case Qt::ConicalGradientPattern:
717 requiredProgram.srcPixelFragShader = QOpenGLEngineSharedShaders::ConicalGradientBrushSrcFragmentShader;
718 requiredProgram.positionVertexShader = isAffine ? QOpenGLEngineSharedShaders::AffinePositionWithConicalGradientBrushVertexShader
719 : QOpenGLEngineSharedShaders::PositionWithConicalGradientBrushVertexShader;
721 case Qt::RadialGradientPattern:
722 requiredProgram.srcPixelFragShader = QOpenGLEngineSharedShaders::RadialGradientBrushSrcFragmentShader;
723 requiredProgram.positionVertexShader = isAffine ? QOpenGLEngineSharedShaders::AffinePositionWithRadialGradientBrushVertexShader
724 : QOpenGLEngineSharedShaders::PositionWithRadialGradientBrushVertexShader;
726 case Qt::TexturePattern:
727 requiredProgram.srcPixelFragShader = QOpenGLEngineSharedShaders::TextureBrushSrcFragmentShader;
728 requiredProgram.positionVertexShader = isAffine ? QOpenGLEngineSharedShaders::AffinePositionWithTextureBrushVertexShader
729 : QOpenGLEngineSharedShaders::PositionWithTextureBrushVertexShader;
734 requiredProgram.srcPixelFragShader = QOpenGLEngineSharedShaders::CustomImageSrcFragmentShader;
735 requiredProgram.customStageSource = customSrcStage->source();
738 const bool hasCompose = compositionMode > QPainter::CompositionMode_Plus;
739 const bool hasMask = maskType != QOpenGLEngineShaderManager::NoMask;
742 if (opacityMode == AttributeOpacity) {
743 Q_ASSERT(!hasCompose && !hasMask);
744 requiredProgram.mainFragShader = QOpenGLEngineSharedShaders::MainFragmentShader_ImageArrays;
746 bool useGlobalOpacity = (opacityMode == UniformOpacity);
747 if (hasMask && useGlobalOpacity)
748 requiredProgram.mainFragShader = QOpenGLEngineSharedShaders::MainFragmentShader_MO;
749 if (hasMask && !useGlobalOpacity)
750 requiredProgram.mainFragShader = QOpenGLEngineSharedShaders::MainFragmentShader_M;
751 if (!hasMask && useGlobalOpacity)
752 requiredProgram.mainFragShader = QOpenGLEngineSharedShaders::MainFragmentShader_O;
753 if (!hasMask && !useGlobalOpacity)
754 requiredProgram.mainFragShader = QOpenGLEngineSharedShaders::MainFragmentShader;
758 if (maskType == PixelMask) {
759 requiredProgram.maskFragShader = QOpenGLEngineSharedShaders::MaskFragmentShader;
761 }
else if (maskType == SubPixelMaskPass1) {
762 requiredProgram.maskFragShader = QOpenGLEngineSharedShaders::RgbMaskFragmentShaderPass1;
764 }
else if (maskType == SubPixelMaskPass2) {
765 requiredProgram.maskFragShader = QOpenGLEngineSharedShaders::RgbMaskFragmentShaderPass2;
767 }
else if (maskType == SubPixelWithGammaMask) {
768 requiredProgram.maskFragShader = QOpenGLEngineSharedShaders::RgbMaskWithGammaFragmentShader;
771 qCritical(
"QOpenGLEngineShaderManager::useCorrectShaderProg() - Unknown mask type");
774 requiredProgram.maskFragShader = QOpenGLEngineSharedShaders::NoMaskFragmentShader;
778 switch (compositionMode) {
779 case QPainter::CompositionMode_Multiply:
780 requiredProgram.compositionFragShader = QOpenGLEngineSharedShaders::MultiplyCompositionModeFragmentShader;
782 case QPainter::CompositionMode_Screen:
783 requiredProgram.compositionFragShader = QOpenGLEngineSharedShaders::ScreenCompositionModeFragmentShader;
785 case QPainter::CompositionMode_Overlay:
786 requiredProgram.compositionFragShader = QOpenGLEngineSharedShaders::OverlayCompositionModeFragmentShader;
788 case QPainter::CompositionMode_Darken:
789 requiredProgram.compositionFragShader = QOpenGLEngineSharedShaders::DarkenCompositionModeFragmentShader;
791 case QPainter::CompositionMode_Lighten:
792 requiredProgram.compositionFragShader = QOpenGLEngineSharedShaders::LightenCompositionModeFragmentShader;
794 case QPainter::CompositionMode_ColorDodge:
795 requiredProgram.compositionFragShader = QOpenGLEngineSharedShaders::ColorDodgeCompositionModeFragmentShader;
797 case QPainter::CompositionMode_ColorBurn:
798 requiredProgram.compositionFragShader = QOpenGLEngineSharedShaders::ColorBurnCompositionModeFragmentShader;
800 case QPainter::CompositionMode_HardLight:
801 requiredProgram.compositionFragShader = QOpenGLEngineSharedShaders::HardLightCompositionModeFragmentShader;
803 case QPainter::CompositionMode_SoftLight:
804 requiredProgram.compositionFragShader = QOpenGLEngineSharedShaders::SoftLightCompositionModeFragmentShader;
806 case QPainter::CompositionMode_Difference:
807 requiredProgram.compositionFragShader = QOpenGLEngineSharedShaders::DifferenceCompositionModeFragmentShader;
809 case QPainter::CompositionMode_Exclusion:
810 requiredProgram.compositionFragShader = QOpenGLEngineSharedShaders::ExclusionCompositionModeFragmentShader;
813 qWarning(
"QOpenGLEngineShaderManager::useCorrectShaderProg() - Unsupported composition mode");
816 requiredProgram.compositionFragShader = QOpenGLEngineSharedShaders::NoCompositionModeFragmentShader;
820 if (opacityMode == AttributeOpacity) {
822 requiredProgram.mainVertexShader = QOpenGLEngineSharedShaders::MainWithTexCoordsAndOpacityVertexShader;
823 }
else if (texCoords) {
824 requiredProgram.mainVertexShader = QOpenGLEngineSharedShaders::MainWithTexCoordsVertexShader;
826 requiredProgram.mainVertexShader = QOpenGLEngineSharedShaders::MainVertexShader;
828 requiredProgram.useTextureCoords = texCoords;
829 requiredProgram.useOpacityAttribute = (opacityMode == AttributeOpacity);
830 if (complexGeometry && srcPixelType == Qt::SolidPattern) {
831 requiredProgram.positionVertexShader = QOpenGLEngineSharedShaders::ComplexGeometryPositionOnlyVertexShader;
832 requiredProgram.usePmvMatrixAttribute =
false;
834 requiredProgram.usePmvMatrixAttribute =
true;
838 complexGeometry =
false;
842 currentShaderProg = sharedShaders->findProgramInCache(requiredProgram);
844 if (currentShaderProg && useCustomSrc) {
845 customSrcStage->setUniforms(currentShaderProg->program);
850 QOpenGLContextPrivate* ctx_d = ctx->d_func();
851 QOpenGL2PaintEngineEx *active_engine =
static_cast<QOpenGL2PaintEngineEx *>(ctx_d->active_engine);
852 active_engine->d_func()->setVertexAttribArrayEnabled(QT_VERTEX_COORDS_ATTR,
true);
853 active_engine->d_func()->setVertexAttribArrayEnabled(QT_TEXTURE_COORDS_ATTR, currentShaderProg && currentShaderProg->useTextureCoords);
854 active_engine->d_func()->setVertexAttribArrayEnabled(QT_OPACITY_ATTR, currentShaderProg && currentShaderProg->useOpacityAttribute);
856 shaderProgNeedsChanging =
false;