Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qquick3dprofiler.cpp
Go to the documentation of this file.
1// Copyright (C) 2021 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
3
5
6#include <QtQml/qqmlfile.h>
7
8#include <QtCore/qcoreapplication.h>
9#include <QtCore/qthread.h>
10
12
13#if QT_CONFIG(qml_debug)
14
15// Enable to debug profiling without client app.
16//#define PROFILE_WITHOUT_CLIENT
17
18// instance will be set, unset in constructor. Allows static methods to be inlined.
19QQuick3DProfiler *QQuick3DProfiler::s_instance = nullptr;
20#ifdef PROFILE_WITHOUT_CLIENT
21quint64 QQuick3DProfiler::featuresEnabled = 0xffffffff;
22#else
23quint64 QQuick3DProfiler::featuresEnabled = 0;
24#endif
25QHash<QByteArray, int> QQuick3DProfiler::s_eventData = {};
26QHash<int, QByteArray> QQuick3DProfiler::s_eventDataRev = {};
27QMutex QQuick3DProfiler::s_eventDataMutex;
28
29QThreadStorage<QQuick3DProfilerSceneGraphData::TimingData> QQuick3DProfilerSceneGraphData::eventTimings = QThreadStorage<QQuick3DProfilerSceneGraphData::TimingData>();
30
31QQuick3DProfilerData::QQuick3DProfilerData(qint64 time, int messageType, int detailType, qint64 d1, qint64 d2, const QList<int> &ids)
32 : QQuick3DProfilerData(time, messageType, detailType, d1, d2)
33{
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;
38}
39
40int QQuick3DProfiler::registerObject(const QObject *object)
41{
42 QMutexLocker lock(&s_eventDataMutex);
43
44#ifdef PROFILE_WITHOUT_CLIENT
45 if (!s_instance)
46 s_instance = new QQuick3DProfiler(nullptr);
47#else
48 if (!s_instance)
49 return 0;
50#endif
51 QQmlData *qmlData = QQmlData::get(object);
52 QByteArray typeAndLocation;
53 int id = 0;
54 if (qmlData) {
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));
63 } else {
64 id = s_eventData.value(typeAndLocation);
65 }
66 }
67 return id;
68}
69
70int QQuick3DProfiler::registerString(const QByteArray &string)
71{
72 QMutexLocker lock(&s_eventDataMutex);
73#ifdef PROFILE_WITHOUT_CLIENT
74 if (!s_instance)
75 s_instance = new QQuick3DProfiler(nullptr);
76#else
77 if (!s_instance)
78 return 0;
79#endif
80 int id = 0;
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));
86 } else {
87 id = s_eventData.value(string);
88 }
89 return id;
90}
91
92void QQuick3DProfiler::initialize(QObject *parent)
93{
94 Q_ASSERT(s_instance == nullptr);
95 s_instance = new QQuick3DProfiler(parent);
96}
97
98QQuick3DProfiler::QQuick3DProfiler(QObject *parent)
99 : QObject(parent)
100{
101 m_timer.start();
102}
103
104QQuick3DProfiler::~QQuick3DProfiler()
105{
106 QMutexLocker lock(&m_dataMutex);
107 featuresEnabled = 0;
108 s_instance = nullptr;
109}
110
111void QQuick3DProfiler::startProfilingImpl(quint64 features)
112{
113 QMutexLocker lock(&m_dataMutex);
114 featuresEnabled = features;
115}
116
117void QQuick3DProfiler::stopProfilingImpl()
118{
119 QMutexLocker lock(&m_dataMutex);
120 featuresEnabled = 0;
121 emit dataReady(m_data, s_eventDataRev);
122 m_data.clear();
123}
124
125void QQuick3DProfiler::reportDataImpl()
126{
127 QMutexLocker lock(&m_dataMutex);
128 emit dataReady(m_data, s_eventDataRev);
129 m_data.clear();
130}
131
132void QQuick3DProfiler::setTimer(const QElapsedTimer &t)
133{
134 QMutexLocker lock(&m_dataMutex);
135 m_timer = t;
136}
137
138#endif
139QT_END_NAMESPACE