OpenCoverage

qquickgenericshadereffect.cpp

Absolute File Name:/home/opencoverage/opencoverage/guest-scripts/qtdeclarative/src/qtdeclarative/src/quick/items/qquickgenericshadereffect.cpp
Switch to Source codePreprocessed file
LineSourceCount
1-
2-
3-
4-
5-
6-
7-
8-
9-
10QQuickGenericShaderEffect::QQuickGenericShaderEffect(QQuickShaderEffect *item, QObject *parent)-
11 : QObject(parent)-
12 , m_item(item)-
13 , m_meshResolution(1, 1)-
14 , m_mesh(nullptr)-
15 , m_cullMode(QQuickShaderEffect::NoCulling)-
16 , m_blending(true)-
17 , m_supportsAtlasTextures(false)-
18 , m_mgr(nullptr)-
19 , m_fragNeedsUpdate(true)-
20 , m_vertNeedsUpdate(true)-
21 , m_dirty(nullptr)-
22{-
23 qRegisterMetaType<QSGGuiThreadShaderEffectManager::ShaderInfo::Type>("ShaderInfo::Type");-
24 for (int i = 0; i < NShader
i < NShaderDescription
TRUEnever evaluated
FALSEnever evaluated
; ++i)
0
25 m_inProgress[i] = nullptr;
never executed: m_inProgress[i] = nullptr;
0
26}
never executed: end of block
0
27-
28QQuickGenericShaderEffect::~QQuickGenericShaderEffect()-
29{-
30 for (int i = 0; i < NShader
i < NShaderDescription
TRUEnever evaluated
FALSEnever evaluated
; ++i) {
0
31 disconnectSignals(Shader(i));-
32 for (const auto &sm : qAsConst(m_signalMappers[i]))-
33 delete sm.mapper;
never executed: delete sm.mapper;
0
34 }
never executed: end of block
0
35-
36 delete m_mgr;-
37}
never executed: end of block
0
38-
39void QQuickGenericShaderEffect::setFragmentShader(const QByteArray &src)-
40{-
41-
42-
43-
44-
45 if (m_fragShader == src
m_fragShader == srcDescription
TRUEnever evaluated
FALSEnever evaluated
)
0
46 return;
never executed: return;
0
47-
48 m_fragShader = src;-
49-
50 m_fragNeedsUpdate = true;-
51 if (m_item->isComponentComplete()
m_item->isComponentComplete()Description
TRUEnever evaluated
FALSEnever evaluated
)
0
52 maybeUpdateShaders();
never executed: maybeUpdateShaders();
0
53-
54 m_item->fragmentShaderChanged();-
55}
never executed: end of block
0
56-
57void QQuickGenericShaderEffect::setVertexShader(const QByteArray &src)-
58{-
59 if (m_vertShader == src
m_vertShader == srcDescription
TRUEnever evaluated
FALSEnever evaluated
)
0
60 return;
never executed: return;
0
61-
62 m_vertShader = src;-
63-
64 m_vertNeedsUpdate = true;-
65 if (m_item->isComponentComplete()
m_item->isComponentComplete()Description
TRUEnever evaluated
FALSEnever evaluated
)
0
66 maybeUpdateShaders();
never executed: maybeUpdateShaders();
0
67-
68 m_item->vertexShaderChanged();-
69}
never executed: end of block
0
70-
71void QQuickGenericShaderEffect::setBlending(bool enable)-
72{-
73 if (m_blending == enable
m_blending == enableDescription
TRUEnever evaluated
FALSEnever evaluated
)
0
74 return;
never executed: return;
0
75-
76 m_blending = enable;-
77 m_item->update();-
78 m_item->blendingChanged();-
79}
never executed: end of block
0
80-
81QVariant QQuickGenericShaderEffect::mesh() const-
82{-
83 return
never executed: return m_mesh ? qVariantFromValue(static_cast<QObject *>(m_mesh)) : qVariantFromValue(m_meshResolution);
m_mesh ? qVariantFromValue(static_cast<QObject *>(m_mesh))
never executed: return m_mesh ? qVariantFromValue(static_cast<QObject *>(m_mesh)) : qVariantFromValue(m_meshResolution);
0
84 : qVariantFromValue(m_meshResolution);
never executed: return m_mesh ? qVariantFromValue(static_cast<QObject *>(m_mesh)) : qVariantFromValue(m_meshResolution);
0
85}-
86-
87void QQuickGenericShaderEffect::setMesh(const QVariant &mesh)-
88{-
89 QQuickShaderEffectMesh *newMesh = qobject_cast<QQuickShaderEffectMesh *>(qvariant_cast<QObject *>(mesh));-
90 if (newMesh
newMeshDescription
TRUEnever evaluated
FALSEnever evaluated
&& newMesh == m_mesh
newMesh == m_meshDescription
TRUEnever evaluated
FALSEnever evaluated
)
0
91 return;
never executed: return;
0
92-
93 if (m_mesh
m_meshDescription
TRUEnever evaluated
FALSEnever evaluated
)
0
94 disconnect(m_mesh, qFlagLocation("2""geometryChanged()" "\0" __FILE__ ":" "137"), this, nullptr);
never executed: disconnect(m_mesh, qFlagLocation("2""geometryChanged()" "\0" __FILE__ ":" "137"), this, nullptr);
0
95-
96 m_mesh = newMesh;-
97-
98 if (m_mesh
m_meshDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
99 connect(m_mesh, qFlagLocation("2""geometryChanged()" "\0" __FILE__ ":" "142"), this, qFlagLocation("1""markGeometryDirtyAndUpdate()" "\0" __FILE__ ":" "142"));-
100 }
never executed: end of block
else {
0
101 if (mesh.canConvert<QSize>()
mesh.canConvert<QSize>()Description
TRUEnever evaluated
FALSEnever evaluated
) {
0
102 m_meshResolution = mesh.toSize();-
103 }
never executed: end of block
else {
0
104 QList<QByteArray> res = mesh.toByteArray().split('x');-
105 bool ok = res.size() == 2;-
106 if (ok
okDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
107 int w = res.at(0).toInt(&ok);-
108 if (ok
okDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
109 int h = res.at(1).toInt(&ok);-
110 if (ok
okDescription
TRUEnever evaluated
FALSEnever evaluated
)
0
111 m_meshResolution = QSize(w, h);
never executed: m_meshResolution = QSize(w, h);
0
112 }
never executed: end of block
0
113 }
never executed: end of block
0
114 if (!ok
!okDescription
TRUEnever evaluated
FALSEnever evaluated
)
0
115 QMessageLogger(__FILE__, 158, __PRETTY_FUNCTION__).warning("ShaderEffect: mesh property must be a size or an object deriving from QQuickShaderEffectMesh");
never executed: QMessageLogger(__FILE__, 158, __PRETTY_FUNCTION__).warning("ShaderEffect: mesh property must be a size or an object deriving from QQuickShaderEffectMesh");
0
116 }
never executed: end of block
0
117 m_defaultMesh.setResolution(m_meshResolution);-
118 }
never executed: end of block
0
119-
120 m_dirty |= QSGShaderEffectNode::DirtyShaderMesh;-
121 m_item->update();-
122-
123 m_item->meshChanged();-
124}
never executed: end of block
0
125-
126void QQuickGenericShaderEffect::setCullMode(QQuickShaderEffect::CullMode face)-
127{-
128 if (m_cullMode == face
m_cullMode == faceDescription
TRUEnever evaluated
FALSEnever evaluated
)
0
129 return;
never executed: return;
0
130-
131 m_cullMode = face;-
132 m_item->update();-
133 m_item->cullModeChanged();-
134}
never executed: end of block
0
135-
136void QQuickGenericShaderEffect::setSupportsAtlasTextures(bool supports)-
137{-
138 if (m_supportsAtlasTextures == supports
m_supportsAtla...es == supportsDescription
TRUEnever evaluated
FALSEnever evaluated
)
0
139 return;
never executed: return;
0
140-
141 m_supportsAtlasTextures = supports;-
142 markGeometryDirtyAndUpdate();-
143 m_item->supportsAtlasTexturesChanged();-
144}
never executed: end of block
0
145-
146QString QQuickGenericShaderEffect::parseLog()-
147{-
148 maybeUpdateShaders();-
149 return
never executed: return log();
log();
never executed: return log();
0
150}-
151-
152QString QQuickGenericShaderEffect::log() const-
153{-
154 QSGGuiThreadShaderEffectManager *mgr = shaderEffectManager();-
155 if (!mgr
!mgrDescription
TRUEnever evaluated
FALSEnever evaluated
)
0
156 return
never executed: return QString();
QString();
never executed: return QString();
0
157-
158 return
never executed: return mgr->log();
mgr->log();
never executed: return mgr->log();
0
159}-
160-
161QQuickShaderEffect::Status QQuickGenericShaderEffect::status() const-
162{-
163 QSGGuiThreadShaderEffectManager *mgr = shaderEffectManager();-
164 if (!mgr
!mgrDescription
TRUEnever evaluated
FALSEnever evaluated
)
0
165 return
never executed: return QQuickShaderEffect::Uncompiled;
QQuickShaderEffect::Uncompiled;
never executed: return QQuickShaderEffect::Uncompiled;
0
166-
167 return
never executed: return QQuickShaderEffect::Status(mgr->status());
QQuickShaderEffect::Status(mgr->status());
never executed: return QQuickShaderEffect::Status(mgr->status());
0
168}-
169-
170void QQuickGenericShaderEffect::handleEvent(QEvent *event)-
171{-
172 if (event->type() == QEvent::DynamicPropertyChange
event->type() ...PropertyChangeDescription
TRUEnever evaluated
FALSEevaluated 108 times by 5 tests
Evaluated by:
  • tst_examples
  • tst_qquickborderimage
  • tst_qquickitemlayer
  • tst_qquickshadereffect
  • tst_scenegraph
) {
0-108
173 QDynamicPropertyChangeEvent *e = static_cast<QDynamicPropertyChangeEvent *>(event);-
174 for (int shaderType = 0; shaderType < NShader
shaderType < NShaderDescription
TRUEnever evaluated
FALSEnever evaluated
; ++shaderType) {
0
175 const auto &vars(m_shaders[shaderType].shaderInfo.variables);-
176 for (int idx = 0; idx < vars.count()
idx < vars.count()Description
TRUEnever evaluated
FALSEnever evaluated
; ++idx) {
0
177 if (vars[idx].name == e->propertyName()
vars[idx].name...propertyName()Description
TRUEnever evaluated
FALSEnever evaluated
) {
0
178 propertyChanged((shaderType << 16) | idx);-
179 break;
never executed: break;
0
180 }-
181 }
never executed: end of block
0
182 }
never executed: end of block
0
183 }
never executed: end of block
0
184}
executed 108 times by 5 tests: end of block
Executed by:
  • tst_examples
  • tst_qquickborderimage
  • tst_qquickitemlayer
  • tst_qquickshadereffect
  • tst_scenegraph
108
185-
186void QQuickGenericShaderEffect::handleGeometryChanged(const QRectF &, const QRectF &)-
187{-
188 m_dirty |= QSGShaderEffectNode::DirtyShaderGeometry;-
189}
never executed: end of block
0
190-
191QSGNode *QQuickGenericShaderEffect::handleUpdatePaintNode(QSGNode *oldNode, QQuickItem::UpdatePaintNodeData *)-
192{-
193 QSGShaderEffectNode *node = static_cast<QSGShaderEffectNode *>(oldNode);-
194-
195 if (m_item->width() <= 0
m_item->width() <= 0Description
TRUEnever evaluated
FALSEnever evaluated
|| m_item->height() <= 0
m_item->height() <= 0Description
TRUEnever evaluated
FALSEnever evaluated
) {
0
196 delete node;-
197 return
never executed: return nullptr;
nullptr;
never executed: return nullptr;
0
198 }-
199-
200-
201 if (m_inProgress[Vertex]
m_inProgress[Vertex]Description
TRUEnever evaluated
FALSEnever evaluated
|| m_inProgress[Fragment]
m_inProgress[Fragment]Description
TRUEnever evaluated
FALSEnever evaluated
)
0
202 return
never executed: return node;
node;
never executed: return node;
0
203-
204-
205 QSGGuiThreadShaderEffectManager *mgr = shaderEffectManager();-
206 if (!mgr
!mgrDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
207 delete node;-
208 return
never executed: return nullptr;
nullptr;
never executed: return nullptr;
0
209 }-
210-
211 if (!node
!nodeDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
212 QSGRenderContext *rc = QQuickWindowPrivate::get(m_item->window())->context;-
213 node = rc->sceneGraphContext()->createShaderEffectNode(rc, mgr);-
214 m_dirty = QSGShaderEffectNode::DirtyShaderAll;-
215 }
never executed: end of block
0
216-
217 QSGShaderEffectNode::SyncData sd;-
218 sd.dirty = m_dirty;-
219 sd.cullMode = QSGShaderEffectNode::CullMode(m_cullMode);-
220 sd.blending = m_blending;-
221 sd.vertex.shader = &m_shaders[Vertex];-
222 sd.vertex.dirtyConstants = &m_dirtyConstants[Vertex];-
223 sd.vertex.dirtyTextures = &m_dirtyTextures[Vertex];-
224 sd.fragment.shader = &m_shaders[Fragment];-
225 sd.fragment.dirtyConstants = &m_dirtyConstants[Fragment];-
226 sd.fragment.dirtyTextures = &m_dirtyTextures[Fragment];-
227 node->syncMaterial(&sd);-
228-
229 if (m_dirty & QSGShaderEffectNode::DirtyShaderMesh
m_dirty & QSGS...irtyShaderMeshDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
230 node->setGeometry(nullptr);-
231 m_dirty &= ~QSGShaderEffectNode::DirtyShaderMesh;-
232 m_dirty |= QSGShaderEffectNode::DirtyShaderGeometry;-
233 }
never executed: end of block
0
234-
235 if (m_dirty & QSGShaderEffectNode::DirtyShaderGeometry
m_dirty & QSGS...ShaderGeometryDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
236 const QRectF rect(0, 0, m_item->width(), m_item->height());-
237 QQuickShaderEffectMesh *mesh = m_mesh
m_meshDescription
TRUEnever evaluated
FALSEnever evaluated
? m_mesh : &m_defaultMesh;
0
238 QSGGeometry *geometry = node->geometry();-
239-
240 const QRectF srcRect = node->updateNormalizedTextureSubRect(m_supportsAtlasTextures);-
241 geometry = mesh->updateGeometry(geometry, 2, 0, srcRect, rect);-
242-
243 node->setFlag(QSGNode::OwnsGeometry, false);-
244 node->setGeometry(geometry);-
245 node->setFlag(QSGNode::OwnsGeometry, true);-
246-
247 m_dirty &= ~QSGShaderEffectNode::DirtyShaderGeometry;-
248 }
never executed: end of block
0
249-
250 m_dirty = nullptr;-
251 for (int i = 0; i < NShader
i < NShaderDescription
TRUEnever evaluated
FALSEnever evaluated
; ++i) {
0
252 m_dirtyConstants[i].clear();-
253 m_dirtyTextures[i].clear();-
254 }
never executed: end of block
0
255-
256 return
never executed: return node;
node;
never executed: return node;
0
257}-
258-
259void QQuickGenericShaderEffect::maybeUpdateShaders()-
260{-
261 if (m_vertNeedsUpdate
m_vertNeedsUpdateDescription
TRUEnever evaluated
FALSEnever evaluated
)
0
262 m_vertNeedsUpdate = !updateShader(Vertex, m_vertShader);
never executed: m_vertNeedsUpdate = !updateShader(Vertex, m_vertShader);
0
263 if (m_fragNeedsUpdate
m_fragNeedsUpdateDescription
TRUEnever evaluated
FALSEnever evaluated
)
0
264 m_fragNeedsUpdate = !updateShader(Fragment, m_fragShader);
never executed: m_fragNeedsUpdate = !updateShader(Fragment, m_fragShader);
0
265 if (m_vertNeedsUpdate
m_vertNeedsUpdateDescription
TRUEnever evaluated
FALSEnever evaluated
|| m_fragNeedsUpdate
m_fragNeedsUpdateDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
266-
267-
268-
269-
270-
271-
272 if (!m_item->window()
!m_item->window()Description
TRUEnever evaluated
FALSEnever evaluated
|| !m_item->window()->isSceneGraphInitialized()
!m_item->windo...hInitialized()Description
TRUEnever evaluated
FALSEnever evaluated
)
0
273 m_item->polish();
never executed: m_item->polish();
0
274 }
never executed: end of block
0
275}
never executed: end of block
0
276-
277void QQuickGenericShaderEffect::handleItemChange(QQuickItem::ItemChange change, const QQuickItem::ItemChangeData &value)-
278{-
279-
280 if (change == QQuickItem::ItemSceneChange
change == QQui...temSceneChangeDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
281 for (int shaderType = 0; shaderType < NShader
shaderType < NShaderDescription
TRUEnever evaluated
FALSEnever evaluated
; ++shaderType) {
0
282 for (const auto &vd : qAsConst(m_shaders[shaderType].varData)) {-
283 if (vd.specialType == QSGShaderEffectNode::VariableData::Source
vd.specialType...leData::SourceDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
284 QQuickItem *source = qobject_cast<QQuickItem *>(qvariant_cast<QObject *>(vd.value));-
285 if (source
sourceDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
286 if (value.window
value.windowDescription
TRUEnever evaluated
FALSEnever evaluated
)
0
287 QQuickItemPrivate::get(source)->refWindow(value.window);
never executed: QQuickItemPrivate::get(source)->refWindow(value.window);
0
288 else-
289 QQuickItemPrivate::get(source)->derefWindow();
never executed: QQuickItemPrivate::get(source)->derefWindow();
0
290 }-
291 }
never executed: end of block
0
292 }
never executed: end of block
0
293 }
never executed: end of block
0
294 }
never executed: end of block
0
295}
never executed: end of block
0
296-
297QSGGuiThreadShaderEffectManager *QQuickGenericShaderEffect::shaderEffectManager() const-
298{-
299 if (!m_mgr
!m_mgrDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
300-
301 if (QThread::currentThread() != m_item->thread()
QThread::curre...item->thread()Description
TRUEnever evaluated
FALSEnever evaluated
)
0
302 return
never executed: return m_mgr;
m_mgr;
never executed: return m_mgr;
0
303 QQuickWindow *w = m_item->window();-
304 if (w
wDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
305 m_mgr = QQuickWindowPrivate::get(w)->context->sceneGraphContext()->createGuiThreadShaderEffectManager();-
306 if (m_mgr
m_mgrDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
307 connect(m_mgr, qFlagLocation("2""logAndStatusChanged()" "\0" __FILE__ ":" "350"), m_item, qFlagLocation("2""logChanged()" "\0" __FILE__ ":" "350"));-
308 connect(m_mgr, qFlagLocation("2""logAndStatusChanged()" "\0" __FILE__ ":" "351"), m_item, qFlagLocation("2""statusChanged()" "\0" __FILE__ ":" "351"));-
309 connect(m_mgr, qFlagLocation("2""textureChanged()" "\0" __FILE__ ":" "352"), this, qFlagLocation("1""markGeometryDirtyAndUpdateIfSupportsAtlas()" "\0" __FILE__ ":" "352"));-
310 connect(m_mgr, &QSGGuiThreadShaderEffectManager::shaderCodePrepared, this, &QQuickGenericShaderEffect::shaderCodePrepared);-
311 }
never executed: end of block
0
312 }
never executed: end of block
0
313 }
never executed: end of block
0
314-
315 return
never executed: return m_mgr;
m_mgr;
never executed: return m_mgr;
0
316}-
317-
318void QQuickGenericShaderEffect::disconnectSignals(Shader shaderType)-
319{-
320 for (auto &sm : m_signalMappers[shaderType]) {-
321 if (sm.active
sm.activeDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
322 sm.active = false;-
323 QObject::disconnect(m_item, nullptr, sm.mapper, qFlagLocation("1""map()" "\0" __FILE__ ":" "366"));-
324 QObject::disconnect(sm.mapper, qFlagLocation("2""mapped(int)" "\0" __FILE__ ":" "367"), this, qFlagLocation("1""propertyChanged(int)" "\0" __FILE__ ":" "367"));-
325 }
never executed: end of block
0
326 }
never executed: end of block
0
327 for (const auto &vd : qAsConst(m_shaders[shaderType].varData)) {-
328 if (vd.specialType == QSGShaderEffectNode::VariableData::Source
vd.specialType...leData::SourceDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
329 QQuickItem *source = qobject_cast<QQuickItem *>(qvariant_cast<QObject *>(vd.value));-
330 if (source
sourceDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
331 if (m_item->window()
m_item->window()Description
TRUEnever evaluated
FALSEnever evaluated
)
0
332 QQuickItemPrivate::get(source)->derefWindow();
never executed: QQuickItemPrivate::get(source)->derefWindow();
0
333 QObject::disconnect(source, qFlagLocation("2""destroyed(QObject*)" "\0" __FILE__ ":" "376"), this, qFlagLocation("1""sourceDestroyed(QObject*)" "\0" __FILE__ ":" "376"));-
334 }
never executed: end of block
0
335 }
never executed: end of block
0
336 }
never executed: end of block
0
337}
never executed: end of block
0
338-
339struct ShaderInfoCache-
340{-
341 bool contains(const QByteArray &key) const-
342 {-
343 return
never executed: return m_shaderInfoCache.contains(key);
m_shaderInfoCache.contains(key);
never executed: return m_shaderInfoCache.contains(key);
0
344 }-
345-
346 QSGGuiThreadShaderEffectManager::ShaderInfo value(const QByteArray &key) const-
347 {-
348 return
never executed: return m_shaderInfoCache.value(key);
m_shaderInfoCache.value(key);
never executed: return m_shaderInfoCache.value(key);
0
349 }-
350-
351 void insert(const QByteArray &key, const QSGGuiThreadShaderEffectManager::ShaderInfo &value)-
352 {-
353 m_shaderInfoCache.insert(key, value);-
354 }
never executed: end of block
0
355-
356 QHash<QByteArray, QSGGuiThreadShaderEffectManager::ShaderInfo> m_shaderInfoCache;-
357};-
358-
359namespace { namespace Q_QGS_shaderInfoCache { typedef ShaderInfoCache Type; QBasicAtomicInt guard = { QtGlobalStatic::Uninitialized }; __attribute__((visibility("hidden"))) inline Type *innerFunction() { struct HolderBase { ~HolderBase() noexcept { if (guard.load() == QtGlobalStatic::Initialized
guard.load() =...c::InitializedDescription
TRUEnever evaluated
FALSEnever evaluated
) guard.store(QtGlobalStatic::Destroyed);
never executed: guard.store(QtGlobalStatic::Destroyed);
}
never executed: end of block
}; static struct Holder : public HolderBase { Type value; Holder() noexcept(noexcept(Type ())) : value () { guard.store(QtGlobalStatic::Initialized); } } holder; return
never executed: return &holder.value;
&holder.value;
never executed: return &holder.value;
} } } static QGlobalStatic<ShaderInfoCache, Q_QGS_shaderInfoCache::innerFunction, Q_QGS_shaderInfoCache::guard> shaderInfoCache;
0
360-
361bool QQuickGenericShaderEffect::updateShader(Shader shaderType, const QByteArray &src)-
362{-
363 QSGGuiThreadShaderEffectManager *mgr = shaderEffectManager();-
364 if (!mgr
!mgrDescription
TRUEnever evaluated
FALSEnever evaluated
)
0
365 return
never executed: return false;
false;
never executed: return false;
0
366-
367 const bool texturesSeparate = mgr->hasSeparateSamplerAndTextureObjects();-
368-
369 disconnectSignals(shaderType);-
370-
371 m_shaders[shaderType].shaderInfo = QSGGuiThreadShaderEffectManager::ShaderInfo();-
372 m_shaders[shaderType].varData.clear();-
373-
374 if (!src.isEmpty()
!src.isEmpty()Description
TRUEnever evaluated
FALSEnever evaluated
) {
0
375 if (shaderInfoCache()->contains(src)
shaderInfoCach...>contains(src)Description
TRUEnever evaluated
FALSEnever evaluated
) {
0
376 m_shaders[shaderType].shaderInfo = shaderInfoCache()->value(src);-
377 m_shaders[shaderType].hasShaderCode = true;-
378 }
never executed: end of block
else {
0
379-
380-
381-
382-
383 m_inProgress[shaderType] = new QSGGuiThreadShaderEffectManager::ShaderInfo;-
384 const QSGGuiThreadShaderEffectManager::ShaderInfo::Type typeHint =-
385 shaderType == Vertex
shaderType == VertexDescription
TRUEnever evaluated
FALSEnever evaluated
? QSGGuiThreadShaderEffectManager::ShaderInfo::TypeVertex
0
386 : QSGGuiThreadShaderEffectManager::ShaderInfo::TypeFragment;-
387-
388-
389-
390-
391 mgr->prepareShaderCode(typeHint, src, m_inProgress[shaderType]);-
392-
393 return
never executed: return true;
true;
never executed: return true;
0
394 }-
395 } else {-
396 m_shaders[shaderType].hasShaderCode = false;-
397 if (shaderType == Fragment
shaderType == FragmentDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
398-
399-
400-
401-
402-
403 QSGGuiThreadShaderEffectManager::ShaderInfo::Variable v;-
404 v.name = ([]() -> QByteArray { enum { Size = sizeof("source") - 1 }; static const QStaticByteArrayData<Size> qbytearray_literal = { { { { -1 } }, Size, 0, 0, sizeof(QByteArrayData) }, "source" }; QByteArrayDataPtr holder = { qbytearray_literal.data_ptr() }; const QByteArray ba(holder); return
never executed: return ba;
ba;
never executed: return ba;
}());
0
405 v.bindPoint = 0;-
406 v.type = texturesSeparate
texturesSeparateDescription
TRUEnever evaluated
FALSEnever evaluated
? QSGGuiThreadShaderEffectManager::ShaderInfo::Texture
0
407 : QSGGuiThreadShaderEffectManager::ShaderInfo::Sampler;-
408 m_shaders[shaderType].shaderInfo.variables.append(v);-
409 }
never executed: end of block
0
410 }
never executed: end of block
0
411-
412 updateShaderVars(shaderType);-
413 m_dirty |= QSGShaderEffectNode::DirtyShaders;-
414 m_item->update();-
415 return
never executed: return true;
true;
never executed: return true;
0
416}-
417-
418void QQuickGenericShaderEffect::shaderCodePrepared(bool ok, QSGGuiThreadShaderEffectManager::ShaderInfo::Type typeHint,-
419 const QByteArray &src, QSGGuiThreadShaderEffectManager::ShaderInfo *result)-
420{-
421 const Shader shaderType = typeHint == QSGGuiThreadShaderEffectManager::ShaderInfo::TypeVertex
typeHint == QS...fo::TypeVertexDescription
TRUEnever evaluated
FALSEnever evaluated
? Vertex : Fragment;
0
422-
423-
424-
425 if (result != m_inProgress[shaderType]
result != m_in...ss[shaderType]Description
TRUEnever evaluated
FALSEnever evaluated
) {
0
426 delete result;-
427 return;
never executed: return;
0
428 }-
429-
430 m_shaders[shaderType].shaderInfo = *result;-
431 delete result;-
432 m_inProgress[shaderType] = nullptr;-
433-
434 if (!ok
!okDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
435 QMessageLogger(__FILE__, 478, __PRETTY_FUNCTION__).warning("ShaderEffect: shader preparation failed for %s\n%s\n", src.constData(), QtPrivate::asString(log()).toLocal8Bit().constData());-
436 m_shaders[shaderType].hasShaderCode = false;-
437 return;
never executed: return;
0
438 }-
439-
440 m_shaders[shaderType].hasShaderCode = true;-
441 shaderInfoCache()->insert(src, m_shaders[shaderType].shaderInfo);-
442 updateShaderVars(shaderType);-
443 m_dirty |= QSGShaderEffectNode::DirtyShaders;-
444 m_item->update();-
445}
never executed: end of block
0
446-
447void QQuickGenericShaderEffect::updateShaderVars(Shader shaderType)-
448{-
449 QSGGuiThreadShaderEffectManager *mgr = shaderEffectManager();-
450 if (!mgr
!mgrDescription
TRUEnever evaluated
FALSEnever evaluated
)
0
451 return;
never executed: return;
0
452-
453 const bool texturesSeparate = mgr->hasSeparateSamplerAndTextureObjects();-
454-
455 const int varCount = m_shaders[shaderType].shaderInfo.variables.count();-
456 m_shaders[shaderType].varData.resize(varCount);-
457-
458-
459-
460 if (m_signalMappers[shaderType].count() < varCount
m_signalMapper...t() < varCountDescription
TRUEnever evaluated
FALSEnever evaluated
)
0
461 m_signalMappers[shaderType].resize(varCount);
never executed: m_signalMappers[shaderType].resize(varCount);
0
462-
463-
464-
465 for (int i = 0; i < varCount
i < varCountDescription
TRUEnever evaluated
FALSEnever evaluated
; ++i) {
0
466 const auto &v(m_shaders[shaderType].shaderInfo.variables.at(i));-
467 QSGShaderEffectNode::VariableData &vd(m_shaders[shaderType].varData[i]);-
468 const bool isSpecial = v.name.startsWith("qt_");-
469 if (isSpecial
isSpecialDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
470 if (v.name == "qt_Opacity"
v.name == "qt_Opacity"Description
TRUEnever evaluated
FALSEnever evaluated
)
0
471 vd.specialType = QSGShaderEffectNode::VariableData::Opacity;
never executed: vd.specialType = QSGShaderEffectNode::VariableData::Opacity;
0
472 else if (v.name == "qt_Matrix"
v.name == "qt_Matrix"Description
TRUEnever evaluated
FALSEnever evaluated
)
0
473 vd.specialType = QSGShaderEffectNode::VariableData::Matrix;
never executed: vd.specialType = QSGShaderEffectNode::VariableData::Matrix;
0
474 else if (v.name.startsWith("qt_SubRect_")
v.name.startsW..."qt_SubRect_")Description
TRUEnever evaluated
FALSEnever evaluated
)
0
475 vd.specialType = QSGShaderEffectNode::VariableData::SubRect;
never executed: vd.specialType = QSGShaderEffectNode::VariableData::SubRect;
0
476 continue;
never executed: continue;
0
477 }-
478-
479-
480-
481-
482 if (v.type == QSGGuiThreadShaderEffectManager::ShaderInfo::Sampler
v.type == QSGG...rInfo::SamplerDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
483 if (texturesSeparate
texturesSeparateDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
484 vd.specialType = QSGShaderEffectNode::VariableData::Unused;-
485 continue;
never executed: continue;
0
486 } else {-
487 vd.specialType = QSGShaderEffectNode::VariableData::Source;-
488 }
never executed: end of block
0
489 } else if (v.type == QSGGuiThreadShaderEffectManager::ShaderInfo::Texture
v.type == QSGG...rInfo::TextureDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
490 ((texturesSeparate) ? static_cast<void>(0) : qt_assert("texturesSeparate", __FILE__, 533));-
491 vd.specialType = QSGShaderEffectNode::VariableData::Source;-
492 }
never executed: end of block
else {
0
493 vd.specialType = QSGShaderEffectNode::VariableData::None;-
494 }
never executed: end of block
0
495-
496-
497 const int propIdx = m_item->metaObject()->indexOfProperty(v.name.constData());-
498 if (propIdx >= 0
propIdx >= 0Description
TRUEnever evaluated
FALSEnever evaluated
) {
0
499 QMetaProperty mp = m_item->metaObject()->property(propIdx);-
500 if (!mp.hasNotifySignal()
!mp.hasNotifySignal()Description
TRUEnever evaluated
FALSEnever evaluated
)
0
501 QMessageLogger(__FILE__, 544, __PRETTY_FUNCTION__).warning("ShaderEffect: property '%s' does not have notification method", v.name.constData());
never executed: QMessageLogger(__FILE__, 544, __PRETTY_FUNCTION__).warning("ShaderEffect: property '%s' does not have notification method", v.name.constData());
0
502-
503-
504 auto &sm(m_signalMappers[shaderType][i]);-
505 if (!sm.mapper
!sm.mapperDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
506-
507#pragma GCC diagnostic push-
508-
509-
510#pragma GCC diagnostic ignored "-Wdeprecated-declarations"-
511-
512 sm.mapper = new QSignalMapper;-
513-
514#pragma GCC diagnostic pop-
515-
516 sm.mapper->setMapping(m_item, i | (shaderType << 16));-
517 }
never executed: end of block
0
518 sm.active = true;-
519 const QByteArray signalName = '2' + mp.notifySignal().methodSignature();-
520 QObject::connect(m_item, signalName, sm.mapper, qFlagLocation("1""map()" "\0" __FILE__ ":" "557"));-
521 QObject::connect(sm.mapper, qFlagLocation("2""mapped(int)" "\0" __FILE__ ":" "558"), this, qFlagLocation("1""propertyChanged(int)" "\0" __FILE__ ":" "558"));-
522 }
never executed: end of block
else {
0
523-
524 if (!m_item->property(v.name.constData()).isValid()
!m_item->prope...a()).isValid()Description
TRUEnever evaluated
FALSEnever evaluated
)
0
525 QMessageLogger(__FILE__, 562, __PRETTY_FUNCTION__).warning("ShaderEffect: '%s' does not have a matching property!", v.name.constData());
never executed: QMessageLogger(__FILE__, 562, __PRETTY_FUNCTION__).warning("ShaderEffect: '%s' does not have a matching property!", v.name.constData());
0
526 }
never executed: end of block
0
527-
528 vd.value = m_item->property(v.name.constData());-
529-
530 if (vd.specialType == QSGShaderEffectNode::VariableData::Source
vd.specialType...leData::SourceDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
531 QQuickItem *source = qobject_cast<QQuickItem *>(qvariant_cast<QObject *>(vd.value));-
532 if (source
sourceDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
533 if (m_item->window()
m_item->window()Description
TRUEnever evaluated
FALSEnever evaluated
)
0
534 QQuickItemPrivate::get(source)->refWindow(m_item->window());
never executed: QQuickItemPrivate::get(source)->refWindow(m_item->window());
0
535 QObject::connect(source, qFlagLocation("2""destroyed(QObject*)" "\0" __FILE__ ":" "572"), this, qFlagLocation("1""sourceDestroyed(QObject*)" "\0" __FILE__ ":" "572"));-
536 }
never executed: end of block
0
537 }
never executed: end of block
0
538 }
never executed: end of block
0
539}
never executed: end of block
0
540-
541bool QQuickGenericShaderEffect::sourceIsUnique(QQuickItem *source, Shader typeToSkip, int indexToSkip) const-
542{-
543 for (int shaderType = 0; shaderType < NShader
shaderType < NShaderDescription
TRUEnever evaluated
FALSEnever evaluated
; ++shaderType) {
0
544 for (int idx = 0; idx < m_shaders[shaderType].varData.count()
idx < m_shader...arData.count()Description
TRUEnever evaluated
FALSEnever evaluated
; ++idx) {
0
545 if (shaderType != typeToSkip
shaderType != typeToSkipDescription
TRUEnever evaluated
FALSEnever evaluated
|| idx != indexToSkip
idx != indexToSkipDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
546 const auto &vd(m_shaders[shaderType].varData[idx]);-
547 if (vd.specialType == QSGShaderEffectNode::VariableData::Source
vd.specialType...leData::SourceDescription
TRUEnever evaluated
FALSEnever evaluated
&& qvariant_cast<QObject *>(vd.value) == source
qvariant_cast<...lue) == sourceDescription
TRUEnever evaluated
FALSEnever evaluated
)
0
548 return
never executed: return false;
false;
never executed: return false;
0
549 }
never executed: end of block
0
550 }
never executed: end of block
0
551 }
never executed: end of block
0
552 return
never executed: return true;
true;
never executed: return true;
0
553}-
554-
555void QQuickGenericShaderEffect::propertyChanged(int mappedId)-
556{-
557 const Shader type = Shader(mappedId >> 16);-
558 const int idx = mappedId & 0xFFFF;-
559 const auto &v(m_shaders[type].shaderInfo.variables[idx]);-
560 auto &vd(m_shaders[type].varData[idx]);-
561-
562 if (vd.specialType == QSGShaderEffectNode::VariableData::Source
vd.specialType...leData::SourceDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
563 QQuickItem *source = qobject_cast<QQuickItem *>(qvariant_cast<QObject *>(vd.value));-
564 if (source
sourceDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
565 if (m_item->window()
m_item->window()Description
TRUEnever evaluated
FALSEnever evaluated
)
0
566 QQuickItemPrivate::get(source)->derefWindow();
never executed: QQuickItemPrivate::get(source)->derefWindow();
0
567-
568-
569-
570-
571 if (sourceIsUnique(source, type, idx)
sourceIsUnique...ce, type, idx)Description
TRUEnever evaluated
FALSEnever evaluated
)
0
572 QObject::disconnect(source, qFlagLocation("2""destroyed(QObject*)" "\0" __FILE__ ":" "609"), this, qFlagLocation("1""sourceDestroyed(QObject*)" "\0" __FILE__ ":" "609"));
never executed: QObject::disconnect(source, qFlagLocation("2""destroyed(QObject*)" "\0" __FILE__ ":" "609"), this, qFlagLocation("1""sourceDestroyed(QObject*)" "\0" __FILE__ ":" "609"));
0
573 }
never executed: end of block
0
574-
575 vd.value = m_item->property(v.name.constData());-
576-
577 source = qobject_cast<QQuickItem *>(qvariant_cast<QObject *>(vd.value));-
578 if (source
sourceDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
579-
580-
581-
582-
583 if (m_item->window()
m_item->window()Description
TRUEnever evaluated
FALSEnever evaluated
)
0
584 QQuickItemPrivate::get(source)->refWindow(m_item->window());
never executed: QQuickItemPrivate::get(source)->refWindow(m_item->window());
0
585 QObject::connect(source, qFlagLocation("2""destroyed(QObject*)" "\0" __FILE__ ":" "622"), this, qFlagLocation("1""sourceDestroyed(QObject*)" "\0" __FILE__ ":" "622"));-
586 }
never executed: end of block
0
587-
588 m_dirty |= QSGShaderEffectNode::DirtyShaderTexture;-
589 m_dirtyTextures[type].insert(idx);-
590-
591 }
never executed: end of block
else {
0
592 vd.value = m_item->property(v.name.constData());-
593 m_dirty |= QSGShaderEffectNode::DirtyShaderConstant;-
594 m_dirtyConstants[type].insert(idx);-
595 }
never executed: end of block
0
596-
597 m_item->update();-
598}
never executed: end of block
0
599-
600void QQuickGenericShaderEffect::sourceDestroyed(QObject *object)-
601{-
602 for (int shaderType = 0; shaderType < NShader
shaderType < NShaderDescription
TRUEnever evaluated
FALSEnever evaluated
; ++shaderType) {
0
603 for (auto &vd : m_shaders[shaderType].varData) {-
604 if (vd.specialType == QSGShaderEffectNode::VariableData::Source
vd.specialType...leData::SourceDescription
TRUEnever evaluated
FALSEnever evaluated
&& vd.value.canConvert<QObject *>()
vd.value.canCo...t<QObject *>()Description
TRUEnever evaluated
FALSEnever evaluated
) {
0
605 if (qvariant_cast<QObject *>(vd.value) == object
qvariant_cast<...lue) == objectDescription
TRUEnever evaluated
FALSEnever evaluated
)
0
606 vd.value = QVariant();
never executed: vd.value = QVariant();
0
607 }
never executed: end of block
0
608 }
never executed: end of block
0
609 }
never executed: end of block
0
610}
never executed: end of block
0
611-
612void QQuickGenericShaderEffect::markGeometryDirtyAndUpdate()-
613{-
614 m_dirty |= QSGShaderEffectNode::DirtyShaderGeometry;-
615 m_item->update();-
616}
never executed: end of block
0
617-
618void QQuickGenericShaderEffect::markGeometryDirtyAndUpdateIfSupportsAtlas()-
619{-
620 if (m_supportsAtlasTextures
m_supportsAtlasTexturesDescription
TRUEnever evaluated
FALSEnever evaluated
)
0
621 markGeometryDirtyAndUpdate();
never executed: markGeometryDirtyAndUpdate();
0
622}
never executed: end of block
0
623-
624-
625-
Switch to Source codePreprocessed file

Generated by Squish Coco 4.2.0