-
Bug
-
Resolution: Unresolved
-
P2: Important
-
None
-
6.8.4, 6.10.0 Beta4
-
None
When the first row of a Surface3DSeries contains all NaN, trying to render (default RHI backend on Windows) crashes in (due to Q_ASSERT(isFinite()); in QSSGBounds3::center()) (see stack trace below).
This is easily reproducible using the SurfaceGallery Example (after fixing the missing imports in QML) by changing line #71f in datasource.cpp to
float y = j ? (colWave * ((float(qSin(waveAngleMul * colMod) + 1.0)))) * waveMul + QRandomGenerator::global()->bounded(0.15f) * yRangeMod : std::numeric_limits<float>::quiet_NaN();
so that all data in row 0 is NaN.
This used to work as expected when using Surface3DSeries from QtDataVisualization in Qt 5.15.x.
Stack trace of rendering thread:
# 15 Id: 1ea8.7e2c Suspend: 1 Teb: 00000053`da558000 Unfrozen "QSGRenderThread" Child-SP RetAddr Call Site 00000053`dbbfcc00 00007ffb`e23eb4f8 Qt6Cored!qt_message_fatal<QString &>(QtMsgType __formal = QtFatalMsg (0n3), class QMessageLogContext * context = 0x00000053`dbbfcf08, class QString * message = 0x00000053`dbbfcea8)+0x104 [C:\Users\qt\work\qt\qtbase\src\corelib\global\qlogging.cpp @ 2121] 00000053`dbbfce80 00007ffb`e23e8873 Qt6Cored!qt_message(QtMsgType msgType = QtFatalMsg (0n3), class QMessageLogContext * context = 0x00000053`dbbfcf08, char * msg = 0x00007ffb`e2db1f48 "ASSERT: "%s" in file %s, line %d", char * ap = 0x00000053`dbbfcf80 "???")+0x78 [C:\Users\qt\work\qt\qtbase\src\corelib\global\qlogging.cpp @ 382] 00000053`dbbfcee0 00007ffb`e23d0c79 Qt6Cored!QMessageLogger::fatal(char * msg = 0x00007ffb`e2db1f48 "ASSERT: "%s" in file %s, line %d")+0x73 [C:\Users\qt\work\qt\qtbase\src\corelib\global\qlogging.cpp @ 885] 00000053`dbbfcf70 00007ffb`ea980b4b Qt6Cored!qt_assert(char * assertion = 0x00007ffb`eaa6b0d8 "isFinite()", char * file = 0x00007ffb`eaa6b090 "C:\Users\qt\work\qt\qtquick3d\src\utils\qssgbounds3_p.h", int line = 0n282)+0x59 [C:\Users\qt\work\qt\qtbase\src\corelib\global\qassert.cpp @ 104] 00000053`dbbfcfe0 00007ffb`ea991da1 Qt6Quick3DUtilsd!QSSGBounds3::center(unsigned int axis = 0)+0x3b [C:\Users\qt\work\qt\qtquick3d\src\utils\qssgbounds3_p.h @ 283] 00000053`dbbfd040 00007ffb`ea991b35 Qt6Quick3DUtilsd!QSSGMeshBVHBuilder::getAverageValue(class QSSGMeshBVH * bvh = 0x000001a9`91f76960, unsigned int offset = 0, unsigned int count = 0x872, QSSGMeshBVHBuilder::Axis axis = X (0n0))+0xc1 [C:\Users\qt\work\qt\qtquick3d\src\utils\qssgmeshbvhbuilder.cpp @ 341] 00000053`dbbfd0a0 00007ffb`ea9915ef Qt6Quick3DUtilsd!QSSGMeshBVHBuilder::getOptimalSplit(class QSSGMeshBVH * bvh = 0x000001a9`91f76960, class QSSGBounds3 * nodeBounds = 0x000001a9`920b0680, unsigned int offset = 0, unsigned int count = 0x872)+0x65 [C:\Users\qt\work\qt\qtquick3d\src\utils\qssgmeshbvhbuilder.cpp @ 302] 00000053`dbbfd0f0 00007ffb`ea991278 Qt6Quick3DUtilsd!QSSGMeshBVHBuilder::splitNode(class QSSGMeshBVH * bvh = 0x000001a9`91f76960, class QSSGMeshBVHNode::Handle * node = 0x00000053`dbbfd470, unsigned int offset = 0, unsigned int count = 0x872, unsigned int depth = 0)+0xdf [C:\Users\qt\work\qt\qtquick3d\src\utils\qssgmeshbvhbuilder.cpp @ 244] 00000053`dbbfd280 00007ffb`e736d707 Qt6Quick3DUtilsd!QSSGMeshBVHBuilder::buildTree(void)+0x508 [C:\Users\qt\work\qt\qtquick3d\src\utils\qssgmeshbvhbuilder.cpp @ 106] 00000053`dbbfd500 00007ffb`e727e1db Qt6Quick3DRuntimeRenderd!QSSGBufferManager::loadMeshBVH(class QSSGRenderGeometry * geometry = 0x000001a9`ef8955c0)+0x207 [C:\Users\qt\work\qt\qtquick3d\src\runtimerender\resourcemanager\qssgrenderbuffermanager.cpp @ 1832] 00000053`dbbfd6e0 00007ffb`e727424c Qt6Quick3DRuntimeRenderd!QSSGLayerRenderData::prepareModelMeshes(class QSSGRenderContextInterface * contextInterface = 0x000001a9`e3933d10, class QList<QSSGRenderableNodeEntry> * renderableModels = 0x000001a9`f0526150, bool globalPickingEnabled = false)+0x1db [C:\Users\qt\work\qt\qtquick3d\src\runtimerender\rendererimpl\qssglayerrenderdata.cpp @ 1479] 00000053`dbbfd7c0 00007ffb`e7258f9a Qt6Quick3DRuntimeRenderd!QSSGLayerRenderData::prepareForRender(void)+0x1ebc [C:\Users\qt\work\qt\qtquick3d\src\runtimerender\rendererimpl\qssglayerrenderdata.cpp @ 2481] 00000053`dbbfe980 00007ffb`eacc4fbe Qt6Quick3DRuntimeRenderd!QSSGRenderer::prepareLayerForRender(struct QSSGRenderLayer * inLayer = 0x000001a9`f04f11d0)+0x6a [C:\Users\qt\work\qt\qtquick3d\src\runtimerender\rendererimpl\qssgrenderer.cpp @ 104] 00000053`dbbfe9c0 00007ffb`eaccaeb4 Qt6Quick3Dd!QQuick3DSceneRenderer::rhiPrepare(class QRect * viewport = 0x00000053`dbbfeaa8, double displayPixelRatio = 1.75)+0xee [C:\Users\qt\work\qt\qtquick3d\src\quick3d\qquick3dscenerenderer.cpp @ 536] 00000053`dbbfea70 00007ffb`eacd53fa Qt6Quick3Dd!QQuick3DSGDirectRenderer::prepare(void)+0x3b4 [C:\Users\qt\work\qt\qtquick3d\src\quick3d\qquick3dscenerenderer.cpp @ 1613] 00000053`dbbfeb70 00007ffb`eacd03b9 Qt6Quick3Dd!`QtPrivate::FunctorCall<QtPrivate::IndexesList<>,QtPrivate::List<>,void,void (void)+0x2a [C:\Users\qt\work\install\include\QtCore\qobjectdefs_impl.h @ 153] 00000053`dbbfebb0 00007ffb`eacd73bf Qt6Quick3Dd!QtPrivate::FunctorCallBase::call_internal<void,`QtPrivate::FunctorCall<QtPrivate::IndexesList<>,QtPrivate::List<>,void,void (void ** args = 0x00000053`dbbfed58, class QtPrivate::FunctorCall<QtPrivate::IndexesList<>,QtPrivate::List<>,void,void (__cdecl QQuick3DSGDirectRenderer::*)(void)>::call::__l2::<lambda_1> * fn = 0x00000053`dbbfec00)+0x19 [C:\Users\qt\work\install\include\QtCore\qobjectdefs_impl.h @ 72] 00000053`dbbfebe0 00007ffb`eacd0388 Qt6Quick3Dd!QtPrivate::FunctorCall<QtPrivate::IndexesList<>,QtPrivate::List<>,void,void (<function> * f = 0x00007ffb`eaae286f, class QQuick3DSGDirectRenderer * o = 0x000001a9`e3935420, void ** arg = 0x00000053`dbbfed58)+0x3f [C:\Users\qt\work\install\include\QtCore\qobjectdefs_impl.h @ 154] 00000053`dbbfec20 00007ffb`eacd9c4a Qt6Quick3Dd!QtPrivate::FunctionPointer<void (<function> * f = 0x00007ffb`eaae286f, class QQuick3DSGDirectRenderer * o = 0x000001a9`e3935420, void ** arg = 0x00000053`dbbfed58)+0x28 [C:\Users\qt\work\install\include\QtCore\qobjectdefs_impl.h @ 200] 00000053`dbbfec50 00007ffb`e251a0a3 Qt6Quick3Dd!QtPrivate::QCallableObject<void (int which = 0n1, class QtPrivate::QSlotObjectBase * this_ = 0x000001a9`ef88cad0, class QObject * r = 0x000001a9`e3935420, void ** a = 0x00000053`dbbfed58, bool * ret = 0x00000000`00000000)+0x9a [C:\Users\qt\work\install\include\QtCore\qobjectdefs_impl.h @ 573] 00000053`dbbfecb0 00007ffb`e25d9d70 Qt6Cored!QtPrivate::QSlotObjectBase::call(class QObject * r = 0x000001a9`e3935420, void ** a = 0x00000053`dbbfed58)+0x43 [C:\Users\qt\work\qt\qtbase\src\corelib\kernel\qobjectdefs_impl.h @ 486] 00000053`dbbfed00 00007ffb`e25c0868 Qt6Cored!doActivate<0>(class QObject * sender = 0x00000053`da3cf6f8, int signal_index = 0n27, void ** argv = 0x00000053`dbbfed58)+0x950 [C:\Users\qt\work\qt\qtbase\src\corelib\kernel\qobject.cpp @ 4134] 00000053`dbbfefe0 00007ffb`e4fe0425 Qt6Cored!QMetaObject::activate(class QObject * sender = 0x00000053`da3cf6f8, struct QMetaObject * m = 0x00007ffb`e58524a0, int local_signal_index = 0n5, void ** argv = 0x00000000`00000000)+0x68 [C:\Users\qt\work\qt\qtbase\src\corelib\kernel\qobject.cpp @ 4195] 00000053`dbbff020 00007ffb`e4fe6c28 Qt6Quickd!QQuickWindow::beforeRendering(void)+0x25 [C:\Users\qt\work\qt\qtdeclarative_build\src\quick\Quick_autogen\include_Debug\moc_qquickwindow.cpp @ 626] 00000053`dbbff050 00007ffb`e553f36c Qt6Quickd!QQuickWindowPrivate::renderSceneGraph(void)+0x348 [C:\Users\qt\work\qt\qtdeclarative\src\quick\items\qquickwindow.cpp @ 667] 00000053`dbbff390 00007ffb`e553e091 Qt6Quickd!QSGRenderThread::syncAndRender(void)+0xefc [C:\Users\qt\work\qt\qtdeclarative\src\quick\scenegraph\qsgthreadedrenderloop.cpp @ 781] 00000053`dbbffb20 00007ffb`e29746a0 Qt6Quickd!QSGRenderThread::run(void)+0x171 [C:\Users\qt\work\qt\qtdeclarative\src\quick\scenegraph\qsgthreadedrenderloop.cpp @ 996] 00000053`dbbffcd0 00007ffc`dcf3e8d7 Qt6Cored!QThreadPrivate::start(void * arg = 0x000001a9`e374d830)+0x240 [C:\Users\qt\work\qt\qtbase\src\corelib\thread\qthread_win.cpp @ 287] 00000053`dbbffe10 00007ffc`dea48d9c KERNEL32!BaseThreadInitThunk+0x17 00000053`dbbffe40 00000000`00000000 ntdll!RtlUserThreadStart+0x2c
For Gerrit Dashboard: QTBUG-140240 | ||||||
---|---|---|---|---|---|---|
# | Subject | Branch | Project | Status | CR | V |
679932,1 | Handle NaN values in 3d series | dev | qt/qtgraphs | Status: NEW | 0 | 0 |
679933,1 | Add row sanitization for surface graphs | dev | qt/qtgraphs | Status: NEW | 0 | 0 |