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_p.h
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
4#ifndef QQUICK3DPROFILER_P_H
5#define QQUICK3DPROFILER_P_H
6
7//
8// W A R N I N G
9// -------------
10//
11// This file is not part of the Qt API. It exists purely as an
12// implementation detail. This header file may change from version to
13// version without notice, or even be removed.
14//
15// We mean it.
16//
17
18#include <QtCore/private/qabstractanimation_p.h>
19#include <QtQuick/private/qtquickglobal_p.h>
20#include <QtQuick3DUtils/private/qtquick3dutilsglobal_p.h>
21
22
23#if QT_CONFIG(qml_debug)
24#include <QtQml/private/qqmlprofilerdefinitions_p.h>
25#endif
26
27#include <QtCore/qurl.h>
28#include <QtCore/qsize.h>
29#include <QtCore/qmutex.h>
30#include <QtCore/qthreadstorage.h>
31
33
34#if !QT_CONFIG(qml_debug)
35
36#define Q_QUICK3D_PROFILE_IF_ENABLED(feature, Code)
37
39
40};
41
42#define Q_QUICK3D_PROFILING_ENABLED false
43#define Q_QUICK3D_PROFILE_REGISTER_D(obj)
44#define Q_QUICK3D_PROFILE_REGISTER(obj)
45#define Q_QUICK3D_PROFILE_ID
46#define Q_QUICK3D_PROFILE_GET_ID
47#define Q_QUICK3D_PROFILE_ASSIGN_ID_SG(obj, bgnode)
48#define Q_QUICK3D_PROFILE_ASSIGN_ID(bgnode, obj)
49
50#else
51
52#define Q_QUICK3D_PROFILE_IF_ENABLED(feature, Code)
53 if (QQuick3DProfiler::featuresEnabled & (1 << feature)) {
54 Code;
55 } else
56 (void)0
57
58#define Q_QUICK3D_PROFILING_ENABLED (QQuick3DProfiler::featuresEnabled > 0)
59#define Q_QUICK3D_PROFILE_REGISTER_D(obj) d->profilingId = QQuick3DProfiler::registerObject(obj)
60#define Q_QUICK3D_PROFILE_REGISTER(obj) profilingId = QQuick3DProfiler::registerObject(obj)
61#define Q_QUICK3D_PROFILE_ID int profilingId = -1;
62#define Q_QUICK3D_PROFILE_GET_ID(Object)
63 QQuick3DObjectPrivate::get(Object)->profilingId
64#define Q_QUICK3D_PROFILE_ASSIGN_ID_SG(obj, bgnode)
65 if (bgnode)
66 (bgnode)->profilingId = Q_QUICK3D_PROFILE_GET_ID(obj);
67#define Q_QUICK3D_PROFILE_ASSIGN_ID(bgnode, obj)
68 (obj)->profilingId = (bgnode)->profilingId;
69
70
72{
73 static constexpr int s_numSupportedIds = 2;
74 QQuick3DProfilerData() {}
75
76 QQuick3DProfilerData(qint64 time, int messageType, int detailType, qint64 d1, qint64 d2)
77 : time(time), messageType(messageType), detailType(detailType), subdata1(d1), subdata2(d2) {}
78 QQuick3DProfilerData(qint64 time, int messageType, int detailType, qint64 d1, qint64 d2, const QList<int> &ids);
79
80 qint64 time = 0;
81 qint32 messageType = 0;
82 qint32 detailType = 0;
83 qint64 subdata1 = 0;
84 qint64 subdata2 = 0;
85 qint32 ids[s_numSupportedIds] = {0}; // keep this even sized
86};
87
88Q_DECLARE_TYPEINFO(QQuick3DProfilerData, Q_RELOCATABLE_TYPE);
89
90class Q_QUICK3DUTILS_EXPORT QQuick3DProfilerSceneGraphData : public QQmlProfilerDefinitions {
91private:
92 static const uint s_numSceneGraphTimings = 2;
93 static const uint s_numNestedTimings = 5;
94 struct Timings {
95 uint nesting = 0;
96 qint64 values[s_numNestedTimings][s_numSceneGraphTimings + 1] = {};
97 };
98 struct TimingData
99 {
100 Timings timings[MaximumQuick3DFrameType] = {};
101 };
102 static QThreadStorage<TimingData> eventTimings;
103public:
104 template<int type, bool inc>
105 qint64 *timings()
106 {
107 Timings *timings;
108 qint64 *t;
109 timings = &eventTimings.localData().timings[type];
110 if (inc) {
111 Q_ASSERT(timings->nesting < s_numNestedTimings);
112 t = timings->values[timings->nesting];
113 timings->nesting++;
114 } else {
115 timings->nesting--;
116 t = timings->values[timings->nesting];
117 }
118 return t;
119 }
120};
121
122class Q_QUICK3DUTILS_EXPORT QQuick3DProfiler : public QObject, public QQmlProfilerDefinitions {
123 Q_OBJECT
124public:
125
126 enum Quick3DStage {
127 Quick3DStageBegin,
128 Quick3DStageEnd
129 };
130
131 template<int FrameType>
132 static void recordSceneGraphTimestamp(uint position)
133 {
134 s_instance->m_sceneGraphData.timings<FrameType, true>()[position] = s_instance->timestamp();
135 }
136 template<int FrameType>
137 static void reportQuick3DFrame(uint position, quint64 payload)
138 {
139 qint64 *timings = s_instance->m_sceneGraphData.timings<FrameType, false>();
140 timings[position] = s_instance->timestamp();
141 s_instance->processMessage(QQuick3DProfilerData(
142 timings[position], Quick3DFrame, FrameType,
143 timings[1] - timings[0],
144 payload));
145 }
146 template<int FrameType>
147 static void reportQuick3DFrame(uint position, quint64 payload, const QByteArray str)
148 {
149 qint64 *timings = s_instance->m_sceneGraphData.timings<FrameType, false>();
150 timings[position] = s_instance->timestamp();
151 int sid = registerString(str);
152 QList<int> poids;
153 poids << sid;
154 s_instance->processMessage(QQuick3DProfilerData(
155 timings[position], Quick3DFrame, FrameType,
156 timings[1] - timings[0],
157 payload,
158 poids));
159 }
160 template<int FrameType>
161 static void reportQuick3DFrame(uint position, quint64 payload, int poid)
162 {
163 qint64 *timings = s_instance->m_sceneGraphData.timings<FrameType, false>();
164 timings[position] = s_instance->timestamp();
165 QList<int> poids;
166 poids << poid;
167 s_instance->processMessage(QQuick3DProfilerData(
168 timings[position], Quick3DFrame, FrameType,
169 timings[1] - timings[0],
170 payload,
171 poids));
172 }
173 template<int FrameType>
174 static void reportQuick3DFrame(uint position, quint64 payload, int poid, const QByteArray str)
175 {
176 qint64 *timings = s_instance->m_sceneGraphData.timings<FrameType, false>();
177 timings[position] = s_instance->timestamp();
178 int sid = registerString(str);
179 QList<int> poids;
180 poids << poid << sid;
181 s_instance->processMessage(QQuick3DProfilerData(
182 timings[position], Quick3DFrame, FrameType,
183 timings[1] - timings[0],
184 payload,
185 poids));
186 }
187 template<int FrameType>
188 static void reportQuick3DFrame(uint position, quint64 payload, const QList<int> &poids)
189 {
190 qint64 *timings = s_instance->m_sceneGraphData.timings<FrameType, false>();
191 timings[position] = s_instance->timestamp();
192 s_instance->processMessage(QQuick3DProfilerData(
193 timings[position], Quick3DFrame, FrameType,
194 timings[1] - timings[0],
195 payload,
196 poids));
197 }
198
199
200 qint64 timestamp() { return m_timer.nsecsElapsed(); }
201
202 static quint64 featuresEnabled;
203
204 static void initialize(QObject *parent);
205
206 ~QQuick3DProfiler() override;
207
208 static int registerObject(const QObject *object);
209 static int registerString(const QByteArray &string);
210
211signals:
212 void dataReady(const QVector<QQuick3DProfilerData> &data, const QHash<int, QByteArray> &eventData);
213
214protected:
215 friend class QQuick3DProfilerAdapter;
216 static QMutex s_eventDataMutex;
217 static QHash<QByteArray, int> s_eventData;
218 static QHash<int, QByteArray> s_eventDataRev;
219 static QQuick3DProfiler *s_instance;
220 QMutex m_dataMutex;
221 QElapsedTimer m_timer;
222 QVector<QQuick3DProfilerData> m_data;
223 QQuick3DProfilerSceneGraphData m_sceneGraphData;
224
225 QQuick3DProfiler(QObject *parent);
226
227 void processMessage(const QQuick3DProfilerData &message)
228 {
229 QMutexLocker lock(&m_dataMutex);
230 m_data.append(message);
231 }
232
233 void startProfilingImpl(quint64 features);
234 void stopProfilingImpl();
235 void reportDataImpl();
236 void setTimer(const QElapsedTimer &t);
237};
238
239#endif // QT_CONFIG(qml_debug)
240
241#define Q_QUICK3D_PROFILE(feature, Method)
242 Q_QUICK3D_PROFILE_IF_ENABLED(feature, QQuick3DProfiler::Method)
243
244#define Q_QUICK3D_PROFILE_START(Type)
245 Q_QUICK3D_PROFILE_IF_ENABLED(QQuick3DProfiler::ProfileQuick3D,
246 (QQuick3DProfiler::recordSceneGraphTimestamp<Type>(QQuick3DProfiler::Quick3DStageBegin)))
247
248#define Q_QUICK3D_PROFILE_END(Type)
249 Q_QUICK3D_PROFILE_IF_ENABLED(QQuick3DProfiler::ProfileQuick3D,
250 (QQuick3DProfiler::reportQuick3DFrame<Type>(QQuick3DProfiler::Quick3DStageEnd, 0, 0)))
251
252#define Q_QUICK3D_PROFILE_END_WITH_PAYLOAD(Type, Payload)
253 Q_QUICK3D_PROFILE_IF_ENABLED(QQuick3DProfiler::ProfileQuick3D,
254 (QQuick3DProfiler::reportQuick3DFrame<Type>(QQuick3DProfiler::Quick3DStageEnd,
255 Payload)))
256
257#define Q_QUICK3D_PROFILE_END_WITH_STRING(Type, Payload, Str)
258 Q_QUICK3D_PROFILE_IF_ENABLED(QQuick3DProfiler::ProfileQuick3D,
259 (QQuick3DProfiler::reportQuick3DFrame<Type>(QQuick3DProfiler::Quick3DStageEnd,
260 Payload, Str)))
261#define Q_QUICK3D_PROFILE_END_WITH_ID(Type, Payload, POID)
262 Q_QUICK3D_PROFILE_IF_ENABLED(QQuick3DProfiler::ProfileQuick3D,
263 (QQuick3DProfiler::reportQuick3DFrame<Type>(QQuick3DProfiler::Quick3DStageEnd,
264 Payload, POID)))
265#define Q_QUICK3D_PROFILE_END_WITH_IDS(Type, Payload, POIDs)
266 Q_QUICK3D_PROFILE_IF_ENABLED(QQuick3DProfiler::ProfileQuick3D,
267 (QQuick3DProfiler::reportQuick3DFrame<Type>(QQuick3DProfiler::Quick3DStageEnd,
268 Payload, POIDs)))
269#define Q_QUICK3D_PROFILE_END_WITH_ALL(Type, Payload, POID, Str)
270 Q_QUICK3D_PROFILE_IF_ENABLED(QQuick3DProfiler::ProfileQuick3D,
271 (QQuick3DProfiler::reportQuick3DFrame<Type>(QQuick3DProfiler::Quick3DStageEnd,
272 Payload, POID, Str)))
273
274#define QSSG_RENDERPASS_NAME(passName, level, face)
275 QByteArrayLiteral(passName)+ QByteArrayLiteral("_level_") + QByteArray::number(level)
276 + QByteArrayLiteral("_face_") + QByteArrayView(QSSGBaseTypeHelpers::toString(QSSGRenderTextureCubeFace(face)))
277
278QT_END_NAMESPACE
279
280#endif
Q_DECLARE_TYPEINFO(QByteArrayView, Q_PRIMITIVE_TYPE)
#define Q_QUICK3D_PROFILE_GET_ID
#define Q_QUICK3D_PROFILE_IF_ENABLED(feature, Code)