blob: 25ca14080c00b37bd4c5c37d923522dcecc30306 [file] [log] [blame]
Jose Fonseca9653f952015-05-19 16:32:43 +01001#pragma once
Zack Rusin601e8372011-03-24 22:23:21 -04002
Zack Rusin952e9d42011-04-09 23:37:21 -04003#include "apisurface.h"
4
Zack Rusin18eade52011-03-26 14:23:35 -04005#include <QStaticText>
Zack Rusin601e8372011-03-24 22:23:21 -04006#include <QStringList>
Zack Rusinc97fadc2011-04-07 15:16:59 -04007#include <QUrl>
Zack Rusin601e8372011-03-24 22:23:21 -04008#include <QVariant>
9
Zack Rusin91065372011-03-26 01:54:10 -040010#include "trace_model.hpp"
11
12
Zack Rusin7c1793e2011-04-16 23:14:25 -040013class ApiTrace;
Zack Rusinebf971e2011-09-06 17:44:43 -040014class TraceLoader;
Zack Rusin7c1793e2011-04-16 23:14:25 -040015
José Fonsecab4a3d142011-10-27 07:43:19 +010016class VariantVisitor : public trace::Visitor
Zack Rusin91065372011-03-26 01:54:10 -040017{
18public:
Jose Fonseca010f9962016-03-05 14:45:41 +000019 virtual void visit(trace::Null *) override;
20 virtual void visit(trace::Bool *node) override;
21 virtual void visit(trace::SInt *node) override;
22 virtual void visit(trace::UInt *node) override;
23 virtual void visit(trace::Float *node) override;
24 virtual void visit(trace::Double *node) override;
25 virtual void visit(trace::String *node) override;
26 virtual void visit(trace::WString *node) override;
27 virtual void visit(trace::Enum *e) override;
28 virtual void visit(trace::Bitmask *bitmask) override;
29 virtual void visit(trace::Struct *str) override;
30 virtual void visit(trace::Array *array) override;
31 virtual void visit(trace::Blob *blob) override;
32 virtual void visit(trace::Pointer *ptr) override;
33 virtual void visit(trace::Repr *ptr) override;
Zack Rusin91065372011-03-26 01:54:10 -040034
35 QVariant variant() const
36 {
37 return m_variant;
38 }
39private:
40 QVariant m_variant;
41};
42
Zack Rusin10fd4772011-09-14 01:45:12 -040043
44struct ApiTraceError
45{
46 int callIndex;
47 QString type;
48 QString message;
49};
50
Zack Rusind54055e2011-04-17 18:27:28 -040051class ApiEnum
52{
53public:
José Fonseca446ca502014-12-19 16:22:39 +000054 ApiEnum(const trace::EnumSig *sig=0, signed long long value = 0);
Zack Rusind54055e2011-04-17 18:27:28 -040055
56 QString toString() const;
57
58 QVariant value() const;
Zack Rusind54055e2011-04-17 18:27:28 -040059private:
José Fonseca446ca502014-12-19 16:22:39 +000060 const trace::EnumSig *m_sig;
José Fonsecaeb644512011-12-11 10:33:55 +000061 signed long long m_value;
Zack Rusind54055e2011-04-17 18:27:28 -040062};
63Q_DECLARE_METATYPE(ApiEnum);
Zack Rusin91065372011-03-26 01:54:10 -040064
65class ApiPointer
66{
67public:
Zack Rusinc6247dd2011-04-17 22:56:58 -040068 ApiPointer(unsigned long long val=0);
Zack Rusin91065372011-03-26 01:54:10 -040069
70 QString toString() const;
Zack Rusinc6247dd2011-04-17 22:56:58 -040071
72 unsigned long long value() const;
73
Zack Rusin91065372011-03-26 01:54:10 -040074private:
Zack Rusinc6247dd2011-04-17 22:56:58 -040075 unsigned long long m_value;
Zack Rusin91065372011-03-26 01:54:10 -040076};
77Q_DECLARE_METATYPE(ApiPointer);
78
79class ApiBitmask
80{
81public:
82 typedef QList<QPair<QString, unsigned long long> > Signature;
83
José Fonsecab4a3d142011-10-27 07:43:19 +010084 ApiBitmask(const trace::Bitmask *bitmask = 0);
Zack Rusin91065372011-03-26 01:54:10 -040085
86 QString toString() const;
87
Zack Rusinc6247dd2011-04-17 22:56:58 -040088 unsigned long long value() const;
89 Signature signature() const;
90
Zack Rusin91065372011-03-26 01:54:10 -040091private:
José Fonsecab4a3d142011-10-27 07:43:19 +010092 void init(const trace::Bitmask *bitmask);
Zack Rusin91065372011-03-26 01:54:10 -040093private:
94 Signature m_sig;
95 unsigned long long m_value;
96};
97Q_DECLARE_METATYPE(ApiBitmask);
98
99class ApiStruct
100{
101public:
102 struct Signature {
103 QString name;
104 QStringList memberNames;
105 };
106
José Fonsecab4a3d142011-10-27 07:43:19 +0100107 ApiStruct(const trace::Struct *s = 0);
Zack Rusin91065372011-03-26 01:54:10 -0400108
José Fonsecaa596a9e2011-09-27 10:19:28 +0100109 QString toString(bool multiLine = false) const;
Zack Rusinc6247dd2011-04-17 22:56:58 -0400110 Signature signature() const;
111 QList<QVariant> values() const;
Zack Rusin91065372011-03-26 01:54:10 -0400112
113private:
José Fonsecab4a3d142011-10-27 07:43:19 +0100114 void init(const trace::Struct *bitmask);
Zack Rusin91065372011-03-26 01:54:10 -0400115private:
116 Signature m_sig;
117 QList<QVariant> m_members;
118};
119Q_DECLARE_METATYPE(ApiStruct);
120
121class ApiArray
122{
123public:
José Fonsecab4a3d142011-10-27 07:43:19 +0100124 ApiArray(const trace::Array *arr = 0);
Zack Rusin77ff98a2011-08-28 22:30:35 -0400125 ApiArray(const QVector<QVariant> &vals);
Zack Rusin91065372011-03-26 01:54:10 -0400126
José Fonsecaa596a9e2011-09-27 10:19:28 +0100127 QString toString(bool multiLine = false) const;
Zack Rusin91065372011-03-26 01:54:10 -0400128
Zack Rusin77ff98a2011-08-28 22:30:35 -0400129 QVector<QVariant> values() const;
Zack Rusin91065372011-03-26 01:54:10 -0400130private:
José Fonsecab4a3d142011-10-27 07:43:19 +0100131 void init(const trace::Array *arr);
Zack Rusin91065372011-03-26 01:54:10 -0400132private:
Zack Rusin77ff98a2011-08-28 22:30:35 -0400133 QVector<QVariant> m_array;
Zack Rusin91065372011-03-26 01:54:10 -0400134};
135Q_DECLARE_METATYPE(ApiArray);
136
137
José Fonsecae8a1aa92011-04-21 09:13:23 +0100138QString apiVariantToString(const QVariant &variant, bool multiLine = false);
Zack Rusin91065372011-03-26 01:54:10 -0400139
Zack Rusinf6667d12011-03-30 11:03:37 -0400140class ApiTraceFrame;
141
Zack Rusin7c814f12011-04-09 19:20:58 -0400142class ApiTraceState {
143public:
144 ApiTraceState();
145 explicit ApiTraceState(const QVariantMap &parseJson);
146
147 bool isEmpty() const;
José Fonseca6b9d1332011-08-01 00:08:40 +0100148 const QVariantMap & parameters() const;
149 const QMap<QString, QString> & shaderSources() const;
José Fonseca26b34172011-08-01 00:16:35 +0100150 const QVariantMap & uniforms() const;
José Fonsecad1d1ecf2014-10-22 23:55:16 +0100151 const QVariantMap & buffers() const;
Martin Schulzee9e85782016-03-23 17:03:16 +0100152 const QVariantMap & shaderStorageBufferBlocks() const;
José Fonseca6b9d1332011-08-01 00:08:40 +0100153 const QList<ApiTexture> & textures() const;
154 const QList<ApiFramebuffer> & framebuffers() const;
Zack Rusin7c814f12011-04-09 19:20:58 -0400155
Zack Rusin353f0532011-09-15 20:23:27 -0400156 ApiFramebuffer colorBuffer() const;
Zack Rusin7c814f12011-04-09 19:20:58 -0400157private:
158 QVariantMap m_parameters;
José Fonsecaf7a6b622011-04-13 10:37:13 +0100159 QMap<QString, QString> m_shaderSources;
José Fonseca26b34172011-08-01 00:16:35 +0100160 QVariantMap m_uniforms;
José Fonsecad1d1ecf2014-10-22 23:55:16 +0100161 QVariantMap m_buffers;
Martin Schulzee9e85782016-03-23 17:03:16 +0100162 QVariantMap m_shaderStorageBufferBlocks;
Zack Rusin952e9d42011-04-09 23:37:21 -0400163 QList<ApiTexture> m_textures;
Zack Rusina6846412011-04-10 19:51:44 -0400164 QList<ApiFramebuffer> m_framebuffers;
Zack Rusin7c814f12011-04-09 19:20:58 -0400165};
Zack Rusinf389ae82011-04-10 19:27:28 -0400166Q_DECLARE_METATYPE(ApiTraceState);
Zack Rusin7c814f12011-04-09 19:20:58 -0400167
Zack Rusinac4dd9a2011-08-28 00:38:13 -0400168class ApiTraceCallSignature
169{
170public:
171 ApiTraceCallSignature(const QString &name,
172 const QStringList &argNames);
173 ~ApiTraceCallSignature();
174
175 QString name() const
176 {
177 return m_name;
178 }
179 QStringList argNames() const
180 {
181 return m_argNames;
182 }
183
184 QUrl helpUrl() const;
185 void setHelpUrl(const QUrl &url);
186
187private:
188 QString m_name;
189 QStringList m_argNames;
190 QUrl m_helpUrl;
191};
192
Zack Rusind9d9d222013-10-11 18:02:26 -0400193class ApiTraceCall;
194
Zack Rusinf6667d12011-03-30 11:03:37 -0400195class ApiTraceEvent
Zack Rusin601e8372011-03-24 22:23:21 -0400196{
197public:
Zack Rusinf6667d12011-03-30 11:03:37 -0400198 enum Type {
Zack Rusined40bc62011-08-28 17:11:02 -0400199 None = 0,
200 Call = 1 << 0,
201 Frame = 1 << 1
Zack Rusinf6667d12011-03-30 11:03:37 -0400202 };
203public:
204 ApiTraceEvent();
205 ApiTraceEvent(Type t);
Zack Rusin53484b22011-04-16 11:56:19 -0400206 virtual ~ApiTraceEvent();
Zack Rusinf6667d12011-03-30 11:03:37 -0400207
Zack Rusined40bc62011-08-28 17:11:02 -0400208 Type type() const { return (Type)m_type; }
Zack Rusinf6667d12011-03-30 11:03:37 -0400209
210 virtual QStaticText staticText() const = 0;
211 virtual int numChildren() const = 0;
Zack Rusind9d9d222013-10-11 18:02:26 -0400212 virtual int callIndex(ApiTraceCall *call) const = 0;
213 virtual ApiTraceEvent *eventAtRow(int row) const = 0;
Zack Rusinf6667d12011-03-30 11:03:37 -0400214
Zack Rusined40bc62011-08-28 17:11:02 -0400215 ApiTraceState *state() const;
216 void setState(ApiTraceState *state);
217 bool hasState() const
218 {
219 return m_state && !m_state->isEmpty();
220 }
Zack Rusin581e3ff2011-03-31 23:58:07 -0400221
Dan McCabeb6b6d7c2012-06-01 13:40:02 -0700222 void setThumbnail(const QImage & thumbnail);
223 const QImage & thumbnail() const;
224
Dan McCabed1395322012-06-01 13:40:03 -0700225 virtual void missingThumbnail() = 0;
226
Zack Rusinf6667d12011-03-30 11:03:37 -0400227protected:
Zack Rusined40bc62011-08-28 17:11:02 -0400228 int m_type : 4;
Zack Rusined40bc62011-08-28 17:11:02 -0400229 mutable int m_binaryDataIndex:8;
230 ApiTraceState *m_state;
Zack Rusin53484b22011-04-16 11:56:19 -0400231
232 mutable QStaticText *m_staticText;
Dan McCabeb6b6d7c2012-06-01 13:40:02 -0700233
234 QImage m_thumbnail;
Zack Rusinf6667d12011-03-30 11:03:37 -0400235};
236Q_DECLARE_METATYPE(ApiTraceEvent*);
237
238class ApiTraceCall : public ApiTraceEvent
239{
240public:
Zack Rusind9d9d222013-10-11 18:02:26 -0400241 ApiTraceCall(ApiTraceCall *parentCall, TraceLoader *loader,
242 const trace::Call *tcall);
Zack Rusinebf971e2011-09-06 17:44:43 -0400243 ApiTraceCall(ApiTraceFrame *parentFrame, TraceLoader *loader,
José Fonsecab4a3d142011-10-27 07:43:19 +0100244 const trace::Call *tcall);
Zack Rusinf6667d12011-03-30 11:03:37 -0400245 ~ApiTraceCall();
246
Zack Rusinead6aad2011-04-15 22:16:18 -0400247 int index() const;
248 QString name() const;
249 QStringList argNames() const;
Zack Rusinf736a622011-08-28 22:19:46 -0400250 QVector<QVariant> arguments() const;
Zack Rusinead6aad2011-04-15 22:16:18 -0400251 QVariant returnValue() const;
José Fonseca340f5692011-11-30 07:04:44 +0000252 trace::CallFlags flags() const;
Zack Rusinead6aad2011-04-15 22:16:18 -0400253 QUrl helpUrl() const;
254 void setHelpUrl(const QUrl &url);
255 ApiTraceFrame *parentFrame()const;
256 void setParentFrame(ApiTraceFrame *frame);
Zack Rusin18eade52011-03-26 14:23:35 -0400257
Jose Fonseca010f9962016-03-05 14:45:41 +0000258 int callIndex(ApiTraceCall *call) const override;
Zack Rusind9d9d222013-10-11 18:02:26 -0400259
260 ApiTraceEvent *parentEvent() const;
261 ApiTraceCall *parentCall() const;
262 QVector<ApiTraceCall*> children() const;
Jose Fonseca010f9962016-03-05 14:45:41 +0000263 ApiTraceEvent *eventAtRow(int row) const override;
Zack Rusind9d9d222013-10-11 18:02:26 -0400264 void addChild(ApiTraceCall *call);
265 void finishedAddingChildren();
266
Zack Rusinb53b1612011-04-19 01:33:58 -0400267 bool hasError() const;
268 QString error() const;
269 void setError(const QString &msg);
270
Zack Rusinf736a622011-08-28 22:19:46 -0400271 QVector<QVariant> originalValues() const;
Zack Rusin661842d2011-04-17 01:59:16 -0400272
273 bool edited() const;
Zack Rusinf736a622011-08-28 22:19:46 -0400274 void setEditedValues(const QVector<QVariant> &lst);
275 QVector<QVariant> editedValues() const;
Zack Rusine6bc9122011-04-16 23:07:05 -0400276 void revert();
277
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400278 bool contains(const QString &str,
Ruslan Kabatsayev75d69052019-02-20 13:41:18 +0300279 Qt::CaseSensitivity sensitivity,
280 bool useRegex) const;
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400281
Zack Rusinb53b1612011-04-19 01:33:58 -0400282 ApiTrace *parentTrace() const;
283
Zack Rusin27cb2c42011-03-27 23:53:36 -0400284 QString toHtml() const;
Zack Rusindc792082011-08-27 23:29:19 -0400285 QString searchText() const;
Jose Fonseca010f9962016-03-05 14:45:41 +0000286 QStaticText staticText() const override;
287 int numChildren() const override;
Zack Rusin8e7a4ff2011-04-07 01:15:48 -0400288 bool hasBinaryData() const;
289 int binaryDataIndex() const;
Eugene Velesevichaa1b2132013-04-23 17:56:14 +0400290
291 QString backtrace() const;
292 void setBacktrace(QString backtrace);
Dan McCabed1395322012-06-01 13:40:03 -0700293
Jose Fonseca010f9962016-03-05 14:45:41 +0000294 void missingThumbnail() override;
Dan McCabed1395322012-06-01 13:40:03 -0700295
Zack Rusin18eade52011-03-26 14:23:35 -0400296private:
Zack Rusind9d9d222013-10-11 18:02:26 -0400297 void loadData(TraceLoader *loader,
298 const trace::Call *tcall);
299private:
Zack Rusinead6aad2011-04-15 22:16:18 -0400300 int m_index;
Vladimir Vukicevica9c42472013-11-30 13:40:31 -0500301 unsigned m_thread;
Zack Rusinac4dd9a2011-08-28 00:38:13 -0400302 ApiTraceCallSignature *m_signature;
Zack Rusinf736a622011-08-28 22:19:46 -0400303 QVector<QVariant> m_argValues;
Zack Rusinead6aad2011-04-15 22:16:18 -0400304 QVariant m_returnValue;
José Fonseca340f5692011-11-30 07:04:44 +0000305 trace::CallFlags m_flags;
Zack Rusinead6aad2011-04-15 22:16:18 -0400306 ApiTraceFrame *m_parentFrame;
Zack Rusind9d9d222013-10-11 18:02:26 -0400307 ApiTraceCall *m_parentCall;
308 QVector<ApiTraceCall*> m_children;
Zack Rusinead6aad2011-04-15 22:16:18 -0400309
Zack Rusinf736a622011-08-28 22:19:46 -0400310 QVector<QVariant> m_editedValues;
Zack Rusin661842d2011-04-17 01:59:16 -0400311
Zack Rusinb53b1612011-04-19 01:33:58 -0400312 QString m_error;
313
Eugene Velesevichaa1b2132013-04-23 17:56:14 +0400314 QString m_backtrace;
315
Zack Rusin18eade52011-03-26 14:23:35 -0400316 mutable QString m_richText;
Zack Rusindc792082011-08-27 23:29:19 -0400317 mutable QString m_searchText;
Zack Rusin601e8372011-03-24 22:23:21 -0400318};
Zack Rusin96130ac2011-03-27 01:48:36 -0400319Q_DECLARE_METATYPE(ApiTraceCall*);
Zack Rusin601e8372011-03-24 22:23:21 -0400320
Zack Rusinf6667d12011-03-30 11:03:37 -0400321class ApiTraceFrame : public ApiTraceEvent
322{
323public:
Zack Rusinebf971e2011-09-06 17:44:43 -0400324 ApiTraceFrame(ApiTrace *parent=0);
Zack Rusinc1743432011-09-13 17:58:58 -0400325 ~ApiTraceFrame();
Zack Rusinf6667d12011-03-30 11:03:37 -0400326 int number;
Zack Rusin1d31b6c2011-04-26 22:30:25 -0400327
328 bool isEmpty() const;
Zack Rusinf6667d12011-03-30 11:03:37 -0400329
Zack Rusinebf971e2011-09-06 17:44:43 -0400330 void setParentTrace(ApiTrace *parent);
Zack Rusin7c1793e2011-04-16 23:14:25 -0400331 ApiTrace *parentTrace() const;
Zack Rusin7c1793e2011-04-16 23:14:25 -0400332
Zack Rusin20b1f6d2011-09-06 11:50:07 -0400333 void setNumChildren(int num);
Jose Fonseca010f9962016-03-05 14:45:41 +0000334 int numChildren() const override;
Zack Rusin3176ebe2011-09-06 21:11:36 -0400335 int numChildrenToLoad() const;
Zack Rusind9d9d222013-10-11 18:02:26 -0400336 int numTotalCalls() const;
Jose Fonseca010f9962016-03-05 14:45:41 +0000337 QStaticText staticText() const override;
Zack Rusin1d31b6c2011-04-26 22:30:25 -0400338
Jose Fonseca010f9962016-03-05 14:45:41 +0000339 ApiTraceEvent *eventAtRow(int row) const override;
340 int callIndex(ApiTraceCall *call) const override;
Zack Rusinda7579b2011-09-13 17:33:05 -0400341 ApiTraceCall *callWithIndex(int index) const;
Zack Rusin4d0ef5d2011-08-28 22:05:31 -0400342 QVector<ApiTraceCall*> calls() const;
Zack Rusind9d9d222013-10-11 18:02:26 -0400343 void setCalls(const QVector<ApiTraceCall*> &topLevelCalls,
344 const QVector<ApiTraceCall*> &allCalls,
Zack Rusin4d0ef5d2011-08-28 22:05:31 -0400345 quint64 binaryDataSize);
Zack Rusin1d31b6c2011-04-26 22:30:25 -0400346
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400347 ApiTraceCall *findNextCall(ApiTraceCall *from,
348 const QString &str,
Ruslan Kabatsayev75d69052019-02-20 13:41:18 +0300349 Qt::CaseSensitivity sensitivity,
350 bool useRegex) const;
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400351
352 ApiTraceCall *findPrevCall(ApiTraceCall *from,
353 const QString &str,
Ruslan Kabatsayev75d69052019-02-20 13:41:18 +0300354 Qt::CaseSensitivity sensitivity,
355 bool useRegex) const;
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400356
Zack Rusin9e292fc2011-04-26 23:03:42 -0400357 int binaryDataSize() const;
Zack Rusin20b1f6d2011-09-06 11:50:07 -0400358
Zack Rusin1a9f7af2011-09-18 19:40:47 -0400359 bool isLoaded() const;
Zack Rusin851d0b02011-09-14 22:04:07 -0400360
361 void setLastCallIndex(unsigned index);
362 unsigned lastCallIndex() const;
Dan McCabe10bd4242012-03-05 17:20:40 -0800363
Jose Fonseca010f9962016-03-05 14:45:41 +0000364 void missingThumbnail() override;
Dan McCabed1395322012-06-01 13:40:03 -0700365
Zack Rusin7c1793e2011-04-16 23:14:25 -0400366private:
367 ApiTrace *m_parentTrace;
Zack Rusin1d31b6c2011-04-26 22:30:25 -0400368 quint64 m_binaryDataSize;
Zack Rusind9d9d222013-10-11 18:02:26 -0400369 QVector<ApiTraceCall*> m_children;
Zack Rusin4d0ef5d2011-08-28 22:05:31 -0400370 QVector<ApiTraceCall*> m_calls;
Zack Rusin20b1f6d2011-09-06 11:50:07 -0400371 bool m_loaded;
372 unsigned m_callsToLoad;
Zack Rusin851d0b02011-09-14 22:04:07 -0400373 unsigned m_lastCallIndex;
Zack Rusinf6667d12011-03-30 11:03:37 -0400374};
375Q_DECLARE_METATYPE(ApiTraceFrame*);