6#include <QtQml/qqmlfile.h>
8#include <QtCore/qcoreapplication.h>
9#include <QtCore/qthread.h>
13#if QT_CONFIG(qml_debug)
19QQuick3DProfiler *QQuick3DProfiler::s_instance =
nullptr;
20#ifdef PROFILE_WITHOUT_CLIENT
21quint64 QQuick3DProfiler::featuresEnabled = 0xffffffff;
23quint64 QQuick3DProfiler::featuresEnabled = 0;
25QHash<QByteArray,
int> QQuick3DProfiler::s_eventData = {};
26QHash<
int, QByteArray> QQuick3DProfiler::s_eventDataRev = {};
27QMutex QQuick3DProfiler::s_eventDataMutex;
29QThreadStorage<QQuick3DProfilerSceneGraphData::TimingData> QQuick3DProfilerSceneGraphData::eventTimings = QThreadStorage<QQuick3DProfilerSceneGraphData::TimingData>();
31QQuick3DProfilerData::QQuick3DProfilerData(qint64 time,
int messageType,
int detailType, qint64 d1, qint64 d2,
const QList<
int> &ids)
32 : QQuick3DProfilerData(time, messageType, detailType, d1, d2)
34 static int ID_MARKER = 0xed000000;
35 int size = qMin(ids.size(), s_numSupportedIds);
36 for (
int i = 0; i < size; i++)
37 this->ids[i] = ids[i] | ID_MARKER;
40int QQuick3DProfiler::registerObject(
const QObject *object)
42 QMutexLocker lock(&s_eventDataMutex);
44#ifdef PROFILE_WITHOUT_CLIENT
46 s_instance =
new QQuick3DProfiler(
nullptr);
51 QQmlData *qmlData = QQmlData::get(object);
52 QByteArray typeAndLocation;
55 QQmlType qmlType = QQmlMetaType::qmlType(object->metaObject());
56 QString fileName = qmlData->compilationUnit->fileName();
57 typeAndLocation = (qmlType.qmlTypeName() + QLatin1Char(
' ') + fileName + QLatin1Char(
':') + QString::number(qmlData->lineNumber)).toUtf8();
58 if (!s_eventData.contains(typeAndLocation)) {
59 id = s_eventData.size() + 1;
60 s_eventData.insert(typeAndLocation, id);
61 s_eventDataRev.insert(id, typeAndLocation);
62 s_instance->processMessage(QQuick3DProfilerData(s_instance->timestamp(), Quick3DFrame, Quick3DEventData, id, 0));
64 id = s_eventData.value(typeAndLocation);
70int QQuick3DProfiler::registerString(
const QByteArray &string)
72 QMutexLocker lock(&s_eventDataMutex);
73#ifdef PROFILE_WITHOUT_CLIENT
75 s_instance =
new QQuick3DProfiler(
nullptr);
81 if (!s_eventData.contains(string)) {
82 id = s_eventData.size() + 1;
83 s_eventData.insert(string, id);
84 s_eventDataRev.insert(id, string);
85 s_instance->processMessage(QQuick3DProfilerData(s_instance->timestamp(), Quick3DFrame, Quick3DEventData, id, 0));
87 id = s_eventData.value(string);
92void QQuick3DProfiler::initialize(QObject *parent)
94 Q_ASSERT(s_instance ==
nullptr);
95 s_instance =
new QQuick3DProfiler(parent);
98QQuick3DProfiler::QQuick3DProfiler(QObject *parent)
104QQuick3DProfiler::~QQuick3DProfiler()
106 QMutexLocker lock(&m_dataMutex);
108 s_instance =
nullptr;
111void QQuick3DProfiler::startProfilingImpl(quint64 features)
113 QMutexLocker lock(&m_dataMutex);
114 featuresEnabled = features;
117void QQuick3DProfiler::stopProfilingImpl()
119 QMutexLocker lock(&m_dataMutex);
121 emit dataReady(m_data, s_eventDataRev);
125void QQuick3DProfiler::reportDataImpl()
127 QMutexLocker lock(&m_dataMutex);
128 emit dataReady(m_data, s_eventDataRev);
132void QQuick3DProfiler::setTimer(
const QElapsedTimer &t)
134 QMutexLocker lock(&m_dataMutex);