diff options
Diffstat (limited to 'src/gui/opengl/qopenglengineshadermanager.cpp')
-rw-r--r-- | src/gui/opengl/qopenglengineshadermanager.cpp | 75 |
1 files changed, 33 insertions, 42 deletions
diff --git a/src/gui/opengl/qopenglengineshadermanager.cpp b/src/gui/opengl/qopenglengineshadermanager.cpp index 2f7afa4a66..1e5a10c99c 100644 --- a/src/gui/opengl/qopenglengineshadermanager.cpp +++ b/src/gui/opengl/qopenglengineshadermanager.cpp @@ -153,12 +153,8 @@ QOpenGLEngineSharedShaders::QOpenGLEngineSharedShaders(QOpenGLContext* context) code[AffinePositionWithRadialGradientBrushVertexShader] = qopenglslAffinePositionWithRadialGradientBrushVertexShader_core; code[AffinePositionWithTextureBrushVertexShader] = qopenglslAffinePositionWithTextureBrushVertexShader_core; - code[MainFragmentShader_CMO] = qopenglslMainFragmentShader_CMO_core; - code[MainFragmentShader_CM] = qopenglslMainFragmentShader_CM_core; code[MainFragmentShader_MO] = qopenglslMainFragmentShader_MO_core; code[MainFragmentShader_M] = qopenglslMainFragmentShader_M_core; - code[MainFragmentShader_CO] = qopenglslMainFragmentShader_CO_core; - code[MainFragmentShader_C] = qopenglslMainFragmentShader_C_core; code[MainFragmentShader_O] = qopenglslMainFragmentShader_O_core; code[MainFragmentShader] = qopenglslMainFragmentShader_core; code[MainFragmentShader_ImageArrays] = qopenglslMainFragmentShader_ImageArrays_core; @@ -171,7 +167,7 @@ QOpenGLEngineSharedShaders::QOpenGLEngineSharedShaders(QOpenGLContext* context) code[CustomImageSrcFragmentShader] = qopenglslCustomSrcFragmentShader_core; // Calls "customShader", which must be appended code[SolidBrushSrcFragmentShader] = qopenglslSolidBrushSrcFragmentShader_core; - code[TextureBrushSrcFragmentShader] = qopenglslTextureBrushSrcFragmentShader_desktop_core; + code[TextureBrushSrcFragmentShader] = qopenglslTextureBrushSrcFragmentShader_core; code[TextureBrushSrcWithPatternFragmentShader] = qopenglslTextureBrushSrcWithPatternFragmentShader_core; code[PatternBrushSrcFragmentShader] = qopenglslPatternBrushSrcFragmentShader_core; code[LinearGradientBrushSrcFragmentShader] = qopenglslLinearGradientBrushSrcFragmentShader_core; @@ -203,12 +199,8 @@ QOpenGLEngineSharedShaders::QOpenGLEngineSharedShaders(QOpenGLContext* context) code[AffinePositionWithRadialGradientBrushVertexShader] = qopenglslAffinePositionWithRadialGradientBrushVertexShader; code[AffinePositionWithTextureBrushVertexShader] = qopenglslAffinePositionWithTextureBrushVertexShader; - code[MainFragmentShader_CMO] = qopenglslMainFragmentShader_CMO; - code[MainFragmentShader_CM] = qopenglslMainFragmentShader_CM; code[MainFragmentShader_MO] = qopenglslMainFragmentShader_MO; code[MainFragmentShader_M] = qopenglslMainFragmentShader_M; - code[MainFragmentShader_CO] = qopenglslMainFragmentShader_CO; - code[MainFragmentShader_C] = qopenglslMainFragmentShader_C; code[MainFragmentShader_O] = qopenglslMainFragmentShader_O; code[MainFragmentShader] = qopenglslMainFragmentShader; code[MainFragmentShader_ImageArrays] = qopenglslMainFragmentShader_ImageArrays; @@ -220,10 +212,7 @@ QOpenGLEngineSharedShaders::QOpenGLEngineSharedShaders(QOpenGLContext* context) code[AlphaImageSrcFragmentShader] = qopenglslAlphaImageSrcFragmentShader; code[CustomImageSrcFragmentShader] = qopenglslCustomSrcFragmentShader; // Calls "customShader", which must be appended code[SolidBrushSrcFragmentShader] = qopenglslSolidBrushSrcFragmentShader; - if (context->isOpenGLES()) - code[TextureBrushSrcFragmentShader] = qopenglslTextureBrushSrcFragmentShader_ES; - else - code[TextureBrushSrcFragmentShader] = qopenglslTextureBrushSrcFragmentShader_desktop; + code[TextureBrushSrcFragmentShader] = qopenglslTextureBrushSrcFragmentShader; code[TextureBrushSrcWithPatternFragmentShader] = qopenglslTextureBrushSrcWithPatternFragmentShader; code[PatternBrushSrcFragmentShader] = qopenglslPatternBrushSrcFragmentShader; code[LinearGradientBrushSrcFragmentShader] = qopenglslLinearGradientBrushSrcFragmentShader; @@ -238,21 +227,20 @@ QOpenGLEngineSharedShaders::QOpenGLEngineSharedShaders(QOpenGLContext* context) code[RgbMaskWithGammaFragmentShader] = ""; //### } - // These shaders are not implemented yet and therefore are the same - // for all profiles. Implementations should make a version for both - // profiles and put the appropriate lines in the if-statement above. + // The composition shaders are just layout qualifiers and the same + // for all profiles that support them. code[NoCompositionModeFragmentShader] = ""; - code[MultiplyCompositionModeFragmentShader] = ""; //### - code[ScreenCompositionModeFragmentShader] = ""; //### - code[OverlayCompositionModeFragmentShader] = ""; //### - code[DarkenCompositionModeFragmentShader] = ""; //### - code[LightenCompositionModeFragmentShader] = ""; //### - code[ColorDodgeCompositionModeFragmentShader] = ""; //### - code[ColorBurnCompositionModeFragmentShader] = ""; //### - code[HardLightCompositionModeFragmentShader] = ""; //### - code[SoftLightCompositionModeFragmentShader] = ""; //### - code[DifferenceCompositionModeFragmentShader] = ""; //### - code[ExclusionCompositionModeFragmentShader] = ""; //### + code[MultiplyCompositionModeFragmentShader] = qopenglslMultiplyCompositionModeFragmentShader; + code[ScreenCompositionModeFragmentShader] = qopenglslScreenCompositionModeFragmentShader; + code[OverlayCompositionModeFragmentShader] = qopenglslOverlayCompositionModeFragmentShader; + code[DarkenCompositionModeFragmentShader] = qopenglslDarkenCompositionModeFragmentShader; + code[LightenCompositionModeFragmentShader] = qopenglslLightenCompositionModeFragmentShader; + code[ColorDodgeCompositionModeFragmentShader] = qopenglslColorDodgeCompositionModeFragmentShader; + code[ColorBurnCompositionModeFragmentShader] = qopenglslColorBurnCompositionModeFragmentShader; + code[HardLightCompositionModeFragmentShader] = qopenglslHardLightCompositionModeFragmentShader; + code[SoftLightCompositionModeFragmentShader] = qopenglslSoftLightCompositionModeFragmentShader; + code[DifferenceCompositionModeFragmentShader] = qopenglslDifferenceCompositionModeFragmentShader; + code[ExclusionCompositionModeFragmentShader] = qopenglslExclusionCompositionModeFragmentShader; #if defined(QT_DEBUG) // Check that all the elements have been filled: @@ -268,9 +256,13 @@ QOpenGLEngineSharedShaders::QOpenGLEngineSharedShaders(QOpenGLContext* context) QByteArray fragSource; // Compile up the simple shader: +#ifdef Q_OS_WASM + vertexSource.append(qShaderSnippets[PositionOnlyVertexShader]); + vertexSource.append(qShaderSnippets[MainVertexShader]); +#else vertexSource.append(qShaderSnippets[MainVertexShader]); vertexSource.append(qShaderSnippets[PositionOnlyVertexShader]); - +#endif fragSource.append(qShaderSnippets[MainFragmentShader]); fragSource.append(qShaderSnippets[ShockingPinkSrcFragmentShader]); @@ -396,9 +388,13 @@ QOpenGLEngineShaderProg *QOpenGLEngineSharedShaders::findProgramInCache(const QO fragSource.append(qShaderSnippets[prog.maskFragShader]); QByteArray vertexSource; +#ifdef Q_OS_WASM + vertexSource.append(qShaderSnippets[prog.positionVertexShader]); + vertexSource.append(qShaderSnippets[prog.mainVertexShader]); +#else vertexSource.append(qShaderSnippets[prog.mainVertexShader]); vertexSource.append(qShaderSnippets[prog.positionVertexShader]); - +#endif QScopedPointer<QOpenGLShaderProgram> shaderProgram(new QOpenGLShaderProgram); CachedShader shaderCache(fragSource, vertexSource); @@ -612,8 +608,11 @@ void QOpenGLEngineShaderManager::setCompositionMode(QPainter::CompositionMode mo if (compositionMode == mode) return; + bool wasAdvanced = compositionMode > QPainter::CompositionMode_Plus; + bool isAdvanced = mode > QPainter::CompositionMode_Plus; + compositionMode = mode; - shaderProgNeedsChanging = true; //### + shaderProgNeedsChanging = shaderProgNeedsChanging || wasAdvanced || isAdvanced; } void QOpenGLEngineShaderManager::setCustomStage(QOpenGLCustomShaderStage* stage) @@ -783,21 +782,13 @@ bool QOpenGLEngineShaderManager::useCorrectShaderProg() requiredProgram.mainFragShader = QOpenGLEngineSharedShaders::MainFragmentShader_ImageArrays; } else { bool useGlobalOpacity = (opacityMode == UniformOpacity); - if (hasCompose && hasMask && useGlobalOpacity) - requiredProgram.mainFragShader = QOpenGLEngineSharedShaders::MainFragmentShader_CMO; - if (hasCompose && hasMask && !useGlobalOpacity) - requiredProgram.mainFragShader = QOpenGLEngineSharedShaders::MainFragmentShader_CM; - if (!hasCompose && hasMask && useGlobalOpacity) + if (hasMask && useGlobalOpacity) requiredProgram.mainFragShader = QOpenGLEngineSharedShaders::MainFragmentShader_MO; - if (!hasCompose && hasMask && !useGlobalOpacity) + if (hasMask && !useGlobalOpacity) requiredProgram.mainFragShader = QOpenGLEngineSharedShaders::MainFragmentShader_M; - if (hasCompose && !hasMask && useGlobalOpacity) - requiredProgram.mainFragShader = QOpenGLEngineSharedShaders::MainFragmentShader_CO; - if (hasCompose && !hasMask && !useGlobalOpacity) - requiredProgram.mainFragShader = QOpenGLEngineSharedShaders::MainFragmentShader_C; - if (!hasCompose && !hasMask && useGlobalOpacity) + if (!hasMask && useGlobalOpacity) requiredProgram.mainFragShader = QOpenGLEngineSharedShaders::MainFragmentShader_O; - if (!hasCompose && !hasMask && !useGlobalOpacity) + if (!hasMask && !useGlobalOpacity) requiredProgram.mainFragShader = QOpenGLEngineSharedShaders::MainFragmentShader; } |