Qt 6.x
The Qt SDK
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 LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
5
6#include <QtQml/private/qqmlabstractprofileradapter_p.h>
7#include <QtQml/qqmlfile.h>
8
9#include <QtCore/qcoreapplication.h>
10#include <QtCore/qthread.h>
11
13
14// Enable to debug profiling without client app.
15//#define PROFILE_WITHOUT_CLIENT
16
17// instance will be set, unset in constructor. Allows static methods to be inlined.
18QQuick3DProfiler *QQuick3DProfiler::s_instance = nullptr;
19#ifdef PROFILE_WITHOUT_CLIENT
20quint64 QQuick3DProfiler::featuresEnabled = 0xffffffff;
21#else
22quint64 QQuick3DProfiler::featuresEnabled = 0;
23#endif
24QHash<QByteArray, int> QQuick3DProfiler::s_eventData = {};
25QHash<int, QByteArray> QQuick3DProfiler::s_eventDataRev = {};
26QMutex QQuick3DProfiler::s_eventDataMutex;
27
28QQuick3DProfilerData::QQuick3DProfilerData(qint64 time, int messageType, int detailType, qint64 d1, qint64 d2, const QList<int> &ids)
29 : QQuick3DProfilerData(time, messageType, detailType, d1, d2)
30{
31 static int ID_MARKER = 0xed000000;
32 int size = qMin(ids.size(), s_numSupportedIds);
33 for (int i = 0; i < size; i++)
34 this->ids[i] = ids[i] | ID_MARKER;
35}
36
37int QQuick3DProfiler::registerObject(const QObject *object)
38{
39 QMutexLocker lock(&s_eventDataMutex);
40
41#ifdef PROFILE_WITHOUT_CLIENT
42 if (!s_instance)
43 s_instance = new QQuick3DProfiler(nullptr);
44#else
45 if (!s_instance)
46 return 0;
47#endif
48 QQmlData *qmlData = QQmlData::get(object);
49 QByteArray typeAndLocation;
50 int id = 0;
51 if (qmlData) {
52 QQmlType qmlType = QQmlMetaType::qmlType(object->metaObject());
54 typeAndLocation = (qmlType.qmlTypeName() + QLatin1Char(' ') + fileName + QLatin1Char(':') + QString::number(qmlData->lineNumber)).toUtf8();
55 if (!s_eventData.contains(typeAndLocation)) {
56 id = s_eventData.size() + 1;
57 s_eventData.insert(typeAndLocation, id);
58 s_eventDataRev.insert(id, typeAndLocation);
59 s_instance->processMessage(QQuick3DProfilerData(s_instance->timestamp(), Quick3DFrame, Quick3DEventData, id, 0));
60 } else {
61 id = s_eventData.value(typeAndLocation);
62 }
63 }
64 return id;
65}
66
67int QQuick3DProfiler::registerString(const QByteArray &string)
68{
69 QMutexLocker lock(&s_eventDataMutex);
70#ifdef PROFILE_WITHOUT_CLIENT
71 if (!s_instance)
72 s_instance = new QQuick3DProfiler(nullptr);
73#else
74 if (!s_instance)
75 return 0;
76#endif
77 int id = 0;
78 if (!s_eventData.contains(string)) {
79 id = s_eventData.size() + 1;
80 s_eventData.insert(string, id);
81 s_eventDataRev.insert(id, string);
82 s_instance->processMessage(QQuick3DProfilerData(s_instance->timestamp(), Quick3DFrame, Quick3DEventData, id, 0));
83 } else {
84 id = s_eventData.value(string);
85 }
86 return id;
87}
88
89void QQuick3DProfiler::initialize(QObject *parent)
90{
91 Q_ASSERT(s_instance == nullptr);
92 s_instance = new QQuick3DProfiler(parent);
93}
94
95QQuick3DProfiler::QQuick3DProfiler(QObject *parent)
97{
98 m_timer.start();
99}
100
101QQuick3DProfiler::~QQuick3DProfiler()
102{
103 QMutexLocker lock(&m_dataMutex);
104 featuresEnabled = 0;
105 s_instance = nullptr;
106}
107
108void QQuick3DProfiler::startProfilingImpl(quint64 features)
109{
110 QMutexLocker lock(&m_dataMutex);
111 featuresEnabled = features;
112}
113
114void QQuick3DProfiler::stopProfilingImpl()
115{
116 QMutexLocker lock(&m_dataMutex);
117 featuresEnabled = 0;
118 emit dataReady(m_data, s_eventDataRev);
119 m_data.clear();
120}
121
122void QQuick3DProfiler::reportDataImpl()
123{
124 QMutexLocker lock(&m_dataMutex);
125 emit dataReady(m_data, s_eventDataRev);
126 m_data.clear();
127}
128
129void QQuick3DProfiler::setTimer(const QElapsedTimer &t)
130{
131 QMutexLocker lock(&m_dataMutex);
132 m_timer = t;
133}
134
NSData * m_data
\inmodule QtCore
Definition qbytearray.h:57
\inmodule QtCore
\inmodule QtCore
Definition qhash.h:818
Definition qlist.h:74
\inmodule QtCore
Definition qmutex.h:317
\inmodule QtCore
Definition qmutex.h:285
\inmodule QtCore
Definition qobject.h:90
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:449
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:127
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:7822
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:56
long long qint64
Definition qtypes.h:55
QReadWriteLock lock
[0]
QDate d1(1995, 5, 17)
[0]
QDate d2(1995, 5, 20)
\inmodule QtCore \reentrant
Definition qchar.h:17
IUIAutomationTreeWalker __RPC__deref_out_opt IUIAutomationElement ** parent