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