8#include <QtQml/qqmlfile.h>
9#include <QtQml/private/qqmlcontextdata_p.h>
11#include <QtCore/qcoreapplication.h>
12#include <QtCore/qthread.h>
16#if QT_CONFIG(qml_debug)
22QQuick3DProfiler *QQuick3DProfiler::s_instance =
nullptr;
23#ifdef PROFILE_WITHOUT_CLIENT
24quint64 QQuick3DProfiler::featuresEnabled = 0xffffffff;
26quint64 QQuick3DProfiler::featuresEnabled = 0;
28QHash<QByteArray,
int> QQuick3DProfiler::s_eventData = {};
29QHash<
int, QByteArray> QQuick3DProfiler::s_eventDataRev = {};
30QMutex QQuick3DProfiler::s_eventDataMutex;
32QThreadStorage<QQuick3DProfilerSceneGraphData::TimingData> QQuick3DProfilerSceneGraphData::eventTimings = QThreadStorage<QQuick3DProfilerSceneGraphData::TimingData>();
34QQuick3DProfilerData::QQuick3DProfilerData(qint64 time,
int messageType,
int detailType, qint64 d1, qint64 d2,
const QList<
int> &ids)
35 : QQuick3DProfilerData(time, messageType, detailType, d1, d2)
37 static int ID_MARKER = 0xed000000;
38 int size = qMin(ids.size(), s_numSupportedIds);
39 for (
int i = 0; i < size; i++)
40 this->ids[i] = ids[i] | ID_MARKER;
43int QQuick3DProfiler::registerObject(
const QObject *object)
45 QMutexLocker lock(&s_eventDataMutex);
47#ifdef PROFILE_WITHOUT_CLIENT
49 s_instance =
new QQuick3DProfiler(
nullptr);
54 QQmlData *qmlData = QQmlData::get(object);
55 QByteArray typeAndLocation;
58 QQmlType qmlType = QQmlMetaType::qmlType(object->metaObject());
59 QString fileName = qmlData->compilationUnit
60 ? qmlData->compilationUnit->fileName() : (qmlData->outerContext ? qmlData->outerContext->urlString() : QString());
61 typeAndLocation = (qmlType.qmlTypeName() + QLatin1Char(
' ') + fileName + QLatin1Char(
':') + QString::number(qmlData->lineNumber)).toUtf8();
62 if (!s_eventData.contains(typeAndLocation)) {
63 id = s_eventData.size() + 1;
64 s_eventData.insert(typeAndLocation, id);
65 s_eventDataRev.insert(id, typeAndLocation);
66 s_instance->processMessage(QQuick3DProfilerData(s_instance->timestamp(), Quick3DFrame, Quick3DEventData, id, 0));
68 id = s_eventData.value(typeAndLocation);
74int QQuick3DProfiler::registerString(
const QByteArray &string)
76 QMutexLocker lock(&s_eventDataMutex);
77#ifdef PROFILE_WITHOUT_CLIENT
79 s_instance =
new QQuick3DProfiler(
nullptr);
85 if (!s_eventData.contains(string)) {
86 id = s_eventData.size() + 1;
87 s_eventData.insert(string, id);
88 s_eventDataRev.insert(id, string);
89 s_instance->processMessage(QQuick3DProfilerData(s_instance->timestamp(), Quick3DFrame, Quick3DEventData, id, 0));
91 id = s_eventData.value(string);
96void QQuick3DProfiler::initialize(QObject *parent)
98 Q_ASSERT(s_instance ==
nullptr);
99 s_instance =
new QQuick3DProfiler(parent);
102QQuick3DProfiler::QQuick3DProfiler(QObject *parent)
108QQuick3DProfiler::~QQuick3DProfiler()
110 QMutexLocker lock(&m_dataMutex);
112 s_instance =
nullptr;
115void QQuick3DProfiler::startProfilingImpl(quint64 features)
117 QMutexLocker lock(&m_dataMutex);
118 featuresEnabled = features;
121void QQuick3DProfiler::stopProfilingImpl()
123 QMutexLocker lock(&m_dataMutex);
125 emit dataReady(m_data, s_eventDataRev);
129void QQuick3DProfiler::reportDataImpl()
131 QMutexLocker lock(&m_dataMutex);
132 emit dataReady(m_data, s_eventDataRev);
136void QQuick3DProfiler::setTimer(
const QElapsedTimer &t)
138 QMutexLocker lock(&m_dataMutex);
Combined button and popup list for selecting options.