[Development] Infinite loop in QML ShaderEffect polish()

Alberto Mardegan mardy at users.sourceforge.net
Thu Feb 16 15:25:58 CET 2023


Hi all!
    I've recently bumped into an issue on AuroraOS (a fork of 
SailfishOS), where as soon as an application window gets created, the 
output gets filled with logs similar to these, and the application gets 
stuck:

[W] unknown:230 - qrc:/Sailfish/Silica/private/TabBar.qml:230:5: QML 
OpacityRampEffect: possible QQuickItem::polish() loop
[W] unknown:230 - qrc:/Sailfish/Silica/private/TabBar.qml:230:5: QML 
OpacityRampEffect: OpacityRampEffect called polish() inside 
updatePolish() of OpacityRampEffect

OpacityRampEffect is a ShaderEffect, and, in fact, while debugging I've 
reproduced the same issue with a pure QtQuick ShaderEffect. The warnings 
appear even if the ShaderEffect is unused (that is, no source is 
connected to it): it looks like instantiating it is enough to get the 
application stuck. The "live" and "recursive" properties have no effect 
on this.

The way I've fixed it (apparently, with no ill side effects) is this:

==========
--- a/src/quick/items/qquickgenericshadereffect.cpp
+++ b/src/quick/items/qquickgenericshadereffect.cpp
@@ -332,7 +332,7 @@ void QQuickGenericShaderEffect::maybeUpdateShaders()
           // scenegraph ready. Schedule the polish to try again later. 
In case #2
           // the backend probably does not have shadereffect support so 
there is
           // nothing to do for us here.
-        if (!m_item->window() || 
!m_item->window()->isSceneGraphInitialized())
+        if (!m_item->window())
               m_item->polish();
       }
   }
==========

That is, removing the check on isSceneGraphInitialized() and only queue 
a polish if the window has not been set yet. I noticed that the same 
logic is followed on the OpenGL implementation 
(QQuickOpenGLShaderEffect), but the whole logic behind this is not clear 
to me, so that's why I'm writing here. It indeed looks unlikely that 
this is a bug, otherwise it would have broken a lot of other setups as well.

Could there be something wrong in our QPA plugin (which is for the 99% 
the same as https://github.com/mer-hybris/qt5-qpa-hwcomposer-plugin)?
We are also using a scenegraph plugin, but I verified that even with it 
being removed, the issue presents itself.

For the record, this is on Qt 5.15.

Ciao,
   Alberto

-- 
http://www.mardy.it - Geek in un lingua international


More information about the Development mailing list