4#ifndef QQUICK3DPROFILER_P_H
5#define QQUICK3DPROFILER_P_H
18#include <QtCore/private/qabstractanimation_p.h>
19#include <QtQuick/private/qtquickglobal_p.h>
20#include <QtQuick3DUtils/private/qtquick3dutilsglobal_p.h>
23#if QT_CONFIG(qml_debug)
24#include <QtQml/private/qqmlprofilerdefinitions_p.h>
27#include <QtCore/qurl.h>
28#include <QtCore/qsize.h>
29#include <QtCore/qmutex.h>
30#include <QtCore/qthreadstorage.h>
34#if !QT_CONFIG(qml_debug)
36#define Q_QUICK3D_PROFILE_IF_ENABLED(feature, Code)
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)
52#define Q_QUICK3D_PROFILE_IF_ENABLED(feature, Code)
53 if (QQuick3DProfiler::featuresEnabled & (1
<< feature)) {
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)
67#define Q_QUICK3D_PROFILE_ASSIGN_ID(bgnode, obj)
68 (obj)->profilingId = (bgnode)->profilingId;
73 static constexpr int s_numSupportedIds = 2;
74 QQuick3DProfilerData() {}
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);
81 qint32 messageType = 0;
82 qint32 detailType = 0;
85 qint32 ids[s_numSupportedIds] = {0};
90class Q_QUICK3DUTILS_EXPORT QQuick3DProfilerSceneGraphData :
public QQmlProfilerDefinitions {
92 static const uint s_numSceneGraphTimings = 2;
93 static const uint s_numNestedTimings = 5;
96 qint64 values[s_numNestedTimings][s_numSceneGraphTimings + 1] = {};
100 Timings timings[MaximumQuick3DFrameType] = {};
102 static QThreadStorage<TimingData> eventTimings;
104 template<
int type,
bool inc>
109 timings = &eventTimings.localData().timings[type];
111 Q_ASSERT(timings->nesting < s_numNestedTimings);
112 t = timings->values[timings->nesting];
116 t = timings->values[timings->nesting];
122class Q_QUICK3DUTILS_EXPORT QQuick3DProfiler :
public QObject,
public QQmlProfilerDefinitions {
131 template<
int FrameType>
132 static void recordSceneGraphTimestamp(uint position)
134 s_instance->m_sceneGraphData.timings<FrameType,
true>()[position] = s_instance->timestamp();
136 template<
int FrameType>
137 static void reportQuick3DFrame(uint position, quint64 payload)
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],
146 template<
int FrameType>
147 static void reportQuick3DFrame(uint position, quint64 payload,
const QByteArray str)
149 qint64 *timings = s_instance->m_sceneGraphData.timings<FrameType,
false>();
150 timings[position] = s_instance->timestamp();
151 int sid = registerString(str);
154 s_instance->processMessage(QQuick3DProfilerData(
155 timings[position], Quick3DFrame, FrameType,
156 timings[1] - timings[0],
160 template<
int FrameType>
161 static void reportQuick3DFrame(uint position, quint64 payload,
int poid)
163 qint64 *timings = s_instance->m_sceneGraphData.timings<FrameType,
false>();
164 timings[position] = s_instance->timestamp();
167 s_instance->processMessage(QQuick3DProfilerData(
168 timings[position], Quick3DFrame, FrameType,
169 timings[1] - timings[0],
173 template<
int FrameType>
174 static void reportQuick3DFrame(uint position, quint64 payload,
int poid,
const QByteArray str)
176 qint64 *timings = s_instance->m_sceneGraphData.timings<FrameType,
false>();
177 timings[position] = s_instance->timestamp();
178 int sid = registerString(str);
180 poids << poid << sid;
181 s_instance->processMessage(QQuick3DProfilerData(
182 timings[position], Quick3DFrame, FrameType,
183 timings[1] - timings[0],
187 template<
int FrameType>
188 static void reportQuick3DFrame(uint position, quint64 payload,
const QList<
int> &poids)
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],
200 qint64 timestamp() {
return m_timer.nsecsElapsed(); }
202 static quint64 featuresEnabled;
204 static void initialize(QObject *parent);
206 ~QQuick3DProfiler() override;
208 static int registerObject(
const QObject *object);
209 static int registerString(
const QByteArray &string);
212 void dataReady(
const QVector<QQuick3DProfilerData> &data,
const QHash<
int, QByteArray> &eventData);
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;
221 QElapsedTimer m_timer;
222 QVector<QQuick3DProfilerData> m_data;
223 QQuick3DProfilerSceneGraphData m_sceneGraphData;
225 QQuick3DProfiler(QObject *parent);
227 void processMessage(
const QQuick3DProfilerData &message)
229 QMutexLocker lock(&m_dataMutex);
230 m_data.append(message);
233 void startProfilingImpl(quint64 features);
234 void stopProfilingImpl();
235 void reportDataImpl();
236 void setTimer(
const QElapsedTimer &t);
241#define Q_QUICK3D_PROFILE(feature, Method)
244#define Q_QUICK3D_PROFILE_START(Type)
246 (QQuick3DProfiler::recordSceneGraphTimestamp<Type>(QQuick3DProfiler::Quick3DStageBegin)))
248#define Q_QUICK3D_PROFILE_END(Type)
250 (QQuick3DProfiler::reportQuick3DFrame<Type>(QQuick3DProfiler::Quick3DStageEnd, 0
, 0
)))
252#define Q_QUICK3D_PROFILE_END_WITH_PAYLOAD(Type, Payload)
254 (QQuick3DProfiler::reportQuick3DFrame<Type>(QQuick3DProfiler::Quick3DStageEnd,
257#define Q_QUICK3D_PROFILE_END_WITH_STRING(Type, Payload, Str)
259 (QQuick3DProfiler::reportQuick3DFrame<Type>(QQuick3DProfiler::Quick3DStageEnd,
261#define Q_QUICK3D_PROFILE_END_WITH_ID(Type, Payload, POID)
263 (QQuick3DProfiler::reportQuick3DFrame<Type>(QQuick3DProfiler::Quick3DStageEnd,
265#define Q_QUICK3D_PROFILE_END_WITH_IDS(Type, Payload, POIDs)
267 (QQuick3DProfiler::reportQuick3DFrame<Type>(QQuick3DProfiler::Quick3DStageEnd,
269#define Q_QUICK3D_PROFILE_END_WITH_ALL(Type, Payload, POID, Str)
271 (QQuick3DProfiler::reportQuick3DFrame<Type>(QQuick3DProfiler::Quick3DStageEnd,
272 Payload, POID, Str)))
274#define QSSG_RENDERPASS_NAME(passName, level, face)
275 QByteArrayLiteral(passName)+ QByteArrayLiteral("_level_") + QByteArray::number(level)
276 + QByteArrayLiteral("_face_") + QByteArrayView(QSSGBaseTypeHelpers::toString(QSSGRenderTextureCubeFace(face)))
Q_DECLARE_TYPEINFO(QByteArrayView, Q_PRIMITIVE_TYPE)
#define Q_QUICK3D_PROFILE_GET_ID
#define Q_QUICK3D_PROFILE_IF_ENABLED(feature, Code)