6#ifndef QQUICK3DPROFILER_P_H
7#define QQUICK3DPROFILER_P_H
20#include <QtCore/private/qabstractanimation_p.h>
21#include <QtQuick/private/qtquickglobal_p.h>
22#include <QtQuick3DUtils/private/qtquick3dutilsglobal_p.h>
25#if QT_CONFIG(qml_debug)
26#include <QtQml/private/qqmlprofilerdefinitions_p.h>
29#include <QtCore/qurl.h>
30#include <QtCore/qsize.h>
31#include <QtCore/qmutex.h>
32#include <QtCore/qthreadstorage.h>
36#if !QT_CONFIG(qml_debug)
38#define Q_QUICK3D_PROFILE_IF_ENABLED(feature, Code)
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)
54#define Q_QUICK3D_PROFILE_IF_ENABLED(feature, Code)
55 if (QQuick3DProfiler::featuresEnabled & (1
<< feature)) {
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)
69#define Q_QUICK3D_PROFILE_ASSIGN_ID(bgnode, obj)
70 (obj)->profilingId = (bgnode)->profilingId;
75 static constexpr int s_numSupportedIds = 2;
76 QQuick3DProfilerData() {}
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);
83 qint32 messageType = 0;
84 qint32 detailType = 0;
87 qint32 ids[s_numSupportedIds] = {0};
92class Q_QUICK3DUTILS_EXPORT QQuick3DProfilerSceneGraphData :
public QQmlProfilerDefinitions {
94 static const uint s_numSceneGraphTimings = 2;
95 static const uint s_numNestedTimings = 5;
98 qint64 values[s_numNestedTimings][s_numSceneGraphTimings + 1] = {};
102 Timings timings[MaximumQuick3DFrameType] = {};
104 static QThreadStorage<TimingData> eventTimings;
106 template<
int type,
bool inc>
111 timings = &eventTimings.localData().timings[type];
113 Q_ASSERT(timings->nesting < s_numNestedTimings);
114 t = timings->values[timings->nesting];
118 t = timings->values[timings->nesting];
124class Q_QUICK3DUTILS_EXPORT QQuick3DProfiler :
public QObject,
public QQmlProfilerDefinitions {
133 template<
int FrameType>
134 static void recordSceneGraphTimestamp(uint position)
136 s_instance->m_sceneGraphData.timings<FrameType,
true>()[position] = s_instance->timestamp();
138 template<
int FrameType>
139 static void reportQuick3DFrame(uint position, quint64 payload)
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],
148 template<
int FrameType>
149 static void reportQuick3DFrame(uint position, quint64 payload,
const QByteArray str)
151 qint64 *timings = s_instance->m_sceneGraphData.timings<FrameType,
false>();
152 timings[position] = s_instance->timestamp();
153 int sid = registerString(str);
156 s_instance->processMessage(QQuick3DProfilerData(
157 timings[position], Quick3DFrame, FrameType,
158 timings[1] - timings[0],
162 template<
int FrameType>
163 static void reportQuick3DFrame(uint position, quint64 payload,
int poid)
165 qint64 *timings = s_instance->m_sceneGraphData.timings<FrameType,
false>();
166 timings[position] = s_instance->timestamp();
169 s_instance->processMessage(QQuick3DProfilerData(
170 timings[position], Quick3DFrame, FrameType,
171 timings[1] - timings[0],
175 template<
int FrameType>
176 static void reportQuick3DFrame(uint position, quint64 payload,
int poid,
const QByteArray str)
178 qint64 *timings = s_instance->m_sceneGraphData.timings<FrameType,
false>();
179 timings[position] = s_instance->timestamp();
180 int sid = registerString(str);
182 poids << poid << sid;
183 s_instance->processMessage(QQuick3DProfilerData(
184 timings[position], Quick3DFrame, FrameType,
185 timings[1] - timings[0],
189 template<
int FrameType>
190 static void reportQuick3DFrame(uint position, quint64 payload,
const QList<
int> &poids)
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],
202 qint64 timestamp() {
return m_timer.nsecsElapsed(); }
204 static quint64 featuresEnabled;
206 static void initialize(QObject *parent);
208 ~QQuick3DProfiler() override;
210 static int registerObject(
const QObject *object);
211 static int registerString(
const QByteArray &string);
214 void dataReady(
const QVector<QQuick3DProfilerData> &data,
const QHash<
int, QByteArray> &eventData);
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;
223 QElapsedTimer m_timer;
224 QVector<QQuick3DProfilerData> m_data;
225 QQuick3DProfilerSceneGraphData m_sceneGraphData;
227 QQuick3DProfiler(QObject *parent);
229 void processMessage(
const QQuick3DProfilerData &message)
231 QMutexLocker lock(&m_dataMutex);
232 m_data.append(message);
235 void startProfilingImpl(quint64 features);
236 void stopProfilingImpl();
237 void reportDataImpl();
238 void setTimer(
const QElapsedTimer &t);
243#define Q_QUICK3D_PROFILE(feature, Method)
246#define Q_QUICK3D_PROFILE_START(Type)
248 (QQuick3DProfiler::recordSceneGraphTimestamp<Type>(QQuick3DProfiler::Quick3DStageBegin)))
250#define Q_QUICK3D_PROFILE_END(Type)
252 (QQuick3DProfiler::reportQuick3DFrame<Type>(QQuick3DProfiler::Quick3DStageEnd, 0
, 0
)))
254#define Q_QUICK3D_PROFILE_END_WITH_PAYLOAD(Type, Payload)
256 (QQuick3DProfiler::reportQuick3DFrame<Type>(QQuick3DProfiler::Quick3DStageEnd,
259#define Q_QUICK3D_PROFILE_END_WITH_STRING(Type, Payload, Str)
261 (QQuick3DProfiler::reportQuick3DFrame<Type>(QQuick3DProfiler::Quick3DStageEnd,
263#define Q_QUICK3D_PROFILE_END_WITH_ID(Type, Payload, POID)
265 (QQuick3DProfiler::reportQuick3DFrame<Type>(QQuick3DProfiler::Quick3DStageEnd,
267#define Q_QUICK3D_PROFILE_END_WITH_IDS(Type, Payload, POIDs)
269 (QQuick3DProfiler::reportQuick3DFrame<Type>(QQuick3DProfiler::Quick3DStageEnd,
271#define Q_QUICK3D_PROFILE_END_WITH_ALL(Type, Payload, POID, Str)
273 (QQuick3DProfiler::reportQuick3DFrame<Type>(QQuick3DProfiler::Quick3DStageEnd,
274 Payload, POID, Str)))
276#define QSSG_RENDERPASS_NAME(passName, level, face)
277 QByteArrayLiteral(passName)+ QByteArrayLiteral("_level_") + QByteArray::number(level)
278 + QByteArrayLiteral("_face_") + QByteArrayView(QSSGBaseTypeHelpers::toString(QSSGRenderTextureCubeFace(face)))
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)