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