Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
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
29QQuick3DProfilerData::QQuick3DProfilerData(qint64 time, int messageType, int detailType, qint64 d1, qint64 d2, const QList<int> &ids)
30 : QQuick3DProfilerData(time, messageType, detailType, d1, d2)
31{
32 static int ID_MARKER = 0xed000000;
33 int size = qMin(ids.size(), s_numSupportedIds);
34 for (int i = 0; i < size; i++)
35 this->ids[i] = ids[i] | ID_MARKER;
36}
37
38int QQuick3DProfiler::registerObject(const QObject *object)
39{
40 QMutexLocker lock(&s_eventDataMutex);
41
42#ifdef PROFILE_WITHOUT_CLIENT
43 if (!s_instance)
44 s_instance = new QQuick3DProfiler(nullptr);
45#else
46 if (!s_instance)
47 return 0;
48#endif
49 QQmlData *qmlData = QQmlData::get(object);
50 QByteArray typeAndLocation;
51 int id = 0;
52 if (qmlData) {
53 QQmlType qmlType = QQmlMetaType::qmlType(object->metaObject());
55 typeAndLocation = (qmlType.qmlTypeName() + QLatin1Char(' ') + fileName + QLatin1Char(':') + QString::number(qmlData->lineNumber)).toUtf8();
56 if (!s_eventData.contains(typeAndLocation)) {
57 id = s_eventData.size() + 1;
58 s_eventData.insert(typeAndLocation, id);
59 s_eventDataRev.insert(id, typeAndLocation);
60 s_instance->processMessage(QQuick3DProfilerData(s_instance->timestamp(), Quick3DFrame, Quick3DEventData, id, 0));
61 } else {
62 id = s_eventData.value(typeAndLocation);
63 }
64 }
65 return id;
66}
67
68int QQuick3DProfiler::registerString(const QByteArray &string)
69{
70 QMutexLocker lock(&s_eventDataMutex);
71#ifdef PROFILE_WITHOUT_CLIENT
72 if (!s_instance)
73 s_instance = new QQuick3DProfiler(nullptr);
74#else
75 if (!s_instance)
76 return 0;
77#endif
78 int id = 0;
79 if (!s_eventData.contains(string)) {
80 id = s_eventData.size() + 1;
81 s_eventData.insert(string, id);
82 s_eventDataRev.insert(id, string);
83 s_instance->processMessage(QQuick3DProfilerData(s_instance->timestamp(), Quick3DFrame, Quick3DEventData, id, 0));
84 } else {
85 id = s_eventData.value(string);
86 }
87 return id;
88}
89
90void QQuick3DProfiler::initialize(QObject *parent)
91{
92 Q_ASSERT(s_instance == nullptr);
93 s_instance = new QQuick3DProfiler(parent);
94}
95
96QQuick3DProfiler::QQuick3DProfiler(QObject *parent)
97 : QObject(parent)
98{
99 m_timer.start();
100}
101
102QQuick3DProfiler::~QQuick3DProfiler()
103{
104 QMutexLocker lock(&m_dataMutex);
105 featuresEnabled = 0;
106 s_instance = nullptr;
107}
108
109void QQuick3DProfiler::startProfilingImpl(quint64 features)
110{
111 QMutexLocker lock(&m_dataMutex);
112 featuresEnabled = features;
113}
114
115void QQuick3DProfiler::stopProfilingImpl()
116{
117 QMutexLocker lock(&m_dataMutex);
118 featuresEnabled = 0;
119 emit dataReady(m_data, s_eventDataRev);
120 m_data.clear();
121}
122
123void QQuick3DProfiler::reportDataImpl()
124{
125 QMutexLocker lock(&m_dataMutex);
126 emit dataReady(m_data, s_eventDataRev);
127 m_data.clear();
128}
129
130void QQuick3DProfiler::setTimer(const QElapsedTimer &t)
131{
132 QMutexLocker lock(&m_dataMutex);
133 m_timer = t;
134}
135
136#endif
NSData * m_data
\inmodule QtCore
Definition qbytearray.h:57
\inmodule QtCore
\inmodule QtCore
Definition qmutex.h:313
\inmodule QtCore
Definition qmutex.h:281
\inmodule QtCore
Definition qobject.h:103
QQmlRefPointer< QV4::ExecutableCompilationUnit > compilationUnit
Definition qqmldata_p.h:186
static QQmlData * get(QObjectPrivate *priv, bool create)
Definition qqmldata_p.h:199
quint16 lineNumber
Definition qqmldata_p.h:168
static QQmlType qmlType(const QString &qualifiedName, QTypeRevision version)
Returns the type (if any) of URI-qualified named qualifiedName and version specified by version_major...
QString qmlTypeName() const
Definition qqmltype.cpp:469
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:129
static QString number(int, int base=10)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition qstring.cpp:8084
Combined button and popup list for selecting options.
int toUtf8(char16_t u, OutputPtr &dst, InputPtr &src, InputPtr end)
constexpr const T & qMin(const T &a, const T &b)
Definition qminmax.h:40
GLenum GLuint GLintptr GLsizeiptr size
[1]
GLenum GLenum GLsizei const GLuint * ids
GLenum GLuint id
[7]
GLuint object
[3]
GLdouble GLdouble t
Definition qopenglext.h:243
#define Q_ASSERT(cond)
Definition qrandom.cpp:47
#define emit
unsigned long long quint64
Definition qtypes.h:61
long long qint64
Definition qtypes.h:60
QReadWriteLock lock
[0]
QDate d1(1995, 5, 17)
[0]
QDate d2(1995, 5, 20)
\inmodule QtCore \reentrant
Definition qchar.h:18