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// Qt-Security score:significant reason:default
4
5
7
8#include <QtQml/qqmlfile.h>
9
10#include <QtCore/qcoreapplication.h>
11#include <QtCore/qthread.h>
12
14
15#if QT_CONFIG(qml_debug)
16
17// Enable to debug profiling without client app.
18//#define PROFILE_WITHOUT_CLIENT
19
20// instance will be set, unset in constructor. Allows static methods to be inlined.
21QQuick3DProfiler *QQuick3DProfiler::s_instance = nullptr;
22#ifdef PROFILE_WITHOUT_CLIENT
23quint64 QQuick3DProfiler::featuresEnabled = 0xffffffff;
24#else
25quint64 QQuick3DProfiler::featuresEnabled = 0;
26#endif
27QHash<QByteArray, int> QQuick3DProfiler::s_eventData = {};
28QHash<int, QByteArray> QQuick3DProfiler::s_eventDataRev = {};
29QMutex QQuick3DProfiler::s_eventDataMutex;
30
31QThreadStorage<QQuick3DProfilerSceneGraphData::TimingData> QQuick3DProfilerSceneGraphData::eventTimings = QThreadStorage<QQuick3DProfilerSceneGraphData::TimingData>();
32
33QQuick3DProfilerData::QQuick3DProfilerData(qint64 time, int messageType, int detailType, qint64 d1, qint64 d2, const QList<int> &ids)
34 : QQuick3DProfilerData(time, messageType, detailType, d1, d2)
35{
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;
40}
41
42int QQuick3DProfiler::registerObject(const QObject *object)
43{
44 QMutexLocker lock(&s_eventDataMutex);
45
46#ifdef PROFILE_WITHOUT_CLIENT
47 if (!s_instance)
48 s_instance = new QQuick3DProfiler(nullptr);
49#else
50 if (!s_instance)
51 return 0;
52#endif
53 QQmlData *qmlData = QQmlData::get(object);
54 QByteArray typeAndLocation;
55 int id = 0;
56 if (qmlData) {
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));
65 } else {
66 id = s_eventData.value(typeAndLocation);
67 }
68 }
69 return id;
70}
71
72int QQuick3DProfiler::registerString(const QByteArray &string)
73{
74 QMutexLocker lock(&s_eventDataMutex);
75#ifdef PROFILE_WITHOUT_CLIENT
76 if (!s_instance)
77 s_instance = new QQuick3DProfiler(nullptr);
78#else
79 if (!s_instance)
80 return 0;
81#endif
82 int id = 0;
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));
88 } else {
89 id = s_eventData.value(string);
90 }
91 return id;
92}
93
94void QQuick3DProfiler::initialize(QObject *parent)
95{
96 Q_ASSERT(s_instance == nullptr);
97 s_instance = new QQuick3DProfiler(parent);
98}
99
100QQuick3DProfiler::QQuick3DProfiler(QObject *parent)
101 : QObject(parent)
102{
103 m_timer.start();
104}
105
106QQuick3DProfiler::~QQuick3DProfiler()
107{
108 QMutexLocker lock(&m_dataMutex);
109 featuresEnabled = 0;
110 s_instance = nullptr;
111}
112
113void QQuick3DProfiler::startProfilingImpl(quint64 features)
114{
115 QMutexLocker lock(&m_dataMutex);
116 featuresEnabled = features;
117}
118
119void QQuick3DProfiler::stopProfilingImpl()
120{
121 QMutexLocker lock(&m_dataMutex);
122 featuresEnabled = 0;
123 emit dataReady(m_data, s_eventDataRev);
124 m_data.clear();
125}
126
127void QQuick3DProfiler::reportDataImpl()
128{
129 QMutexLocker lock(&m_dataMutex);
130 emit dataReady(m_data, s_eventDataRev);
131 m_data.clear();
132}
133
134void QQuick3DProfiler::setTimer(const QElapsedTimer &t)
135{
136 QMutexLocker lock(&m_dataMutex);
137 m_timer = t;
138}
139
140#endif
141QT_END_NAMESPACE
Combined button and popup list for selecting options.