8#include <QtQml/qqmlfile.h>
10#include <QtCore/qcoreapplication.h>
11#include <QtCore/qthread.h>
15#if QT_CONFIG(qml_debug)
21QQuick3DProfiler *QQuick3DProfiler::s_instance =
nullptr;
22#ifdef PROFILE_WITHOUT_CLIENT
23quint64 QQuick3DProfiler::featuresEnabled = 0xffffffff;
25quint64 QQuick3DProfiler::featuresEnabled = 0;
27QHash<QByteArray,
int> QQuick3DProfiler::s_eventData = {};
28QHash<
int, QByteArray> QQuick3DProfiler::s_eventDataRev = {};
29QMutex QQuick3DProfiler::s_eventDataMutex;
31QThreadStorage<QQuick3DProfilerSceneGraphData::TimingData> QQuick3DProfilerSceneGraphData::eventTimings = QThreadStorage<QQuick3DProfilerSceneGraphData::TimingData>();
33QQuick3DProfilerData::QQuick3DProfilerData(qint64 time,
int messageType,
int detailType, qint64 d1, qint64 d2,
const QList<
int> &ids)
34 : QQuick3DProfilerData(time, messageType, detailType, d1, d2)
36 static int ID_MARKER = 0xed000000;
37 int size = qMin(ids.size(), s_numSupportedIds);
38 for (
int i = 0; i < size; i++)
39 this->ids[i] = ids[i] | ID_MARKER;
42int QQuick3DProfiler::registerObject(
const QObject *object)
44 QMutexLocker lock(&s_eventDataMutex);
46#ifdef PROFILE_WITHOUT_CLIENT
48 s_instance =
new QQuick3DProfiler(
nullptr);
53 QQmlData *qmlData = QQmlData::get(object);
54 QByteArray typeAndLocation;
57 QQmlType qmlType = QQmlMetaType::qmlType(object->metaObject());
58 QString fileName = qmlData->compilationUnit->fileName();
59 typeAndLocation = (qmlType.qmlTypeName() + QLatin1Char(
' ') + fileName + QLatin1Char(
':') + QString::number(qmlData->lineNumber)).toUtf8();
60 if (!s_eventData.contains(typeAndLocation)) {
61 id = s_eventData.size() + 1;
62 s_eventData.insert(typeAndLocation, id);
63 s_eventDataRev.insert(id, typeAndLocation);
64 s_instance->processMessage(QQuick3DProfilerData(s_instance->timestamp(), Quick3DFrame, Quick3DEventData, id, 0));
66 id = s_eventData.value(typeAndLocation);
72int QQuick3DProfiler::registerString(
const QByteArray &string)
74 QMutexLocker lock(&s_eventDataMutex);
75#ifdef PROFILE_WITHOUT_CLIENT
77 s_instance =
new QQuick3DProfiler(
nullptr);
83 if (!s_eventData.contains(string)) {
84 id = s_eventData.size() + 1;
85 s_eventData.insert(string, id);
86 s_eventDataRev.insert(id, string);
87 s_instance->processMessage(QQuick3DProfilerData(s_instance->timestamp(), Quick3DFrame, Quick3DEventData, id, 0));
89 id = s_eventData.value(string);
94void QQuick3DProfiler::initialize(QObject *parent)
96 Q_ASSERT(s_instance ==
nullptr);
97 s_instance =
new QQuick3DProfiler(parent);
100QQuick3DProfiler::QQuick3DProfiler(QObject *parent)
106QQuick3DProfiler::~QQuick3DProfiler()
108 QMutexLocker lock(&m_dataMutex);
110 s_instance =
nullptr;
113void QQuick3DProfiler::startProfilingImpl(quint64 features)
115 QMutexLocker lock(&m_dataMutex);
116 featuresEnabled = features;
119void QQuick3DProfiler::stopProfilingImpl()
121 QMutexLocker lock(&m_dataMutex);
123 emit dataReady(m_data, s_eventDataRev);
127void QQuick3DProfiler::reportDataImpl()
129 QMutexLocker lock(&m_dataMutex);
130 emit dataReady(m_data, s_eventDataRev);
134void QQuick3DProfiler::setTimer(
const QElapsedTimer &t)
136 QMutexLocker lock(&m_dataMutex);
Combined button and popup list for selecting options.