blob: c7e5683bd6b84aba1a61300c42325d8c2daf4df0 [file] [log] [blame]
Jose Fonseca9653f952015-05-19 16:32:43 +01001#pragma once
Zack Rusin601e8372011-03-24 22:23:21 -04002
3#include "ui_mainwindow.h"
4
José Fonseca62997b42011-11-27 15:16:34 +00005#include "trace_api.hpp"
Zack Rusin8f98c3a2011-09-11 18:21:29 -04006#include "apitrace.h"
7
Zack Rusin96130ac2011-03-27 01:48:36 -04008#include <QMainWindow>
Zack Rusin27cb2c42011-03-27 23:53:36 -04009#include <QProcess>
Dan McCabe66dfdda2012-03-05 17:20:39 -080010#include <QList>
11#include <QImage>
Zack Rusin96130ac2011-03-27 01:48:36 -040012
Zack Rusinf6667d12011-03-30 11:03:37 -040013class ApiTrace;
Zack Rusincc0b4912011-04-19 01:59:20 -040014class ApiTraceCall;
Zack Rusin581e3ff2011-03-31 23:58:07 -040015class ApiTraceEvent;
16class ApiTraceFilter;
Zack Rusin2caa06d2011-03-30 18:30:20 -040017class ApiTraceFrame;
Zack Rusin601e8372011-03-24 22:23:21 -040018class ApiTraceModel;
Zack Rusinf389ae82011-04-10 19:27:28 -040019class ApiTraceState;
Zack Rusin963102f2011-04-15 01:45:05 -040020class ArgumentsEditor;
Zack Rusinc52d18a2011-04-11 00:15:07 -040021class JumpWidget;
Zack Rusin96130ac2011-03-27 01:48:36 -040022class QModelIndex;
Zack Rusinde4ea412011-03-30 11:30:08 -040023class QProgressBar;
Zack Rusind9239342011-04-19 23:43:06 -040024class QTreeWidgetItem;
Zack Rusinc97fadc2011-04-07 15:16:59 -040025class QUrl;
Zack Rusin10fd4772011-09-14 01:45:12 -040026struct ApiTraceError;
Zack Rusin3acde362011-04-06 01:11:55 -040027class Retracer;
Zack Rusinf04cf8a2011-04-12 23:21:52 -040028class SearchWidget;
Zack Rusin7c814f12011-04-09 19:20:58 -040029class ShadersSourceWidget;
Zack Rusinca164112011-04-11 02:23:09 -040030class TraceProcess;
Dan McCabe1c3ddde2012-03-21 09:53:45 -070031class TrimProcess;
James Bentonfc4f55a2012-08-08 17:09:07 +010032class ProfileDialog;
Zack Rusin8e7a4ff2011-04-07 01:15:48 -040033class VertexDataInterpreter;
Zack Rusin601e8372011-03-24 22:23:21 -040034
James Bentonfc4f55a2012-08-08 17:09:07 +010035namespace trace { struct Profile; }
36
Zack Rusin601e8372011-03-24 22:23:21 -040037class MainWindow : public QMainWindow
38{
39 Q_OBJECT
40public:
Piotr Podsiadły654787e2016-09-13 09:53:48 +020041 struct RecentLaunch
42 {
43 QString api;
44 QString execPath;
45 QString workingDir;
46 QStringList args;
47 };
48
Zack Rusin601e8372011-03-24 22:23:21 -040049 MainWindow();
Zack Rusin11f7e632011-03-30 22:47:51 -040050 ~MainWindow();
Zack Rusin601e8372011-03-24 22:23:21 -040051
52public slots:
José Fonsecab7eb1522011-11-27 15:15:33 +000053 void loadTrace(const QString &fileName, int callNum = -1);
Zack Rusin601e8372011-03-24 22:23:21 -040054
Carl Worth7257dfc2012-08-09 08:21:42 -070055 void setRemoteTarget(const QString &host);
56
Zack Rusin601e8372011-03-24 22:23:21 -040057private slots:
Zack Rusin96130ac2011-03-27 01:48:36 -040058 void callItemSelected(const QModelIndex &index);
José Fonseca63d59402011-10-30 10:56:04 +000059 void callItemActivated(const QModelIndex &index);
Piotr Podsiadły654787e2016-09-13 09:53:48 +020060 void createTrace(const RecentLaunch* optionalLaunch = nullptr);
Zack Rusin601e8372011-03-24 22:23:21 -040061 void openTrace();
Alexander Trukhind99ab922015-03-27 23:38:01 +030062 void saveTrace();
Zack Rusin27cb2c42011-03-27 23:53:36 -040063 void replayStart();
James Bentonfc4f55a2012-08-08 17:09:07 +010064 void replayProfile();
Zack Rusin27cb2c42011-03-27 23:53:36 -040065 void replayStop();
José Fonseca126f64b2012-03-28 00:13:55 +010066 void replayFinished(const QString &message);
Zack Rusined40bc62011-08-28 17:11:02 -040067 void replayStateFound(ApiTraceState *state);
James Bentonfc4f55a2012-08-08 17:09:07 +010068 void replayProfileFound(trace::Profile *state);
Dan McCabec6f924e2012-06-01 13:40:05 -070069 void replayThumbnailsFound(const ImageHash &thumbnails);
Zack Rusin3acde362011-04-06 01:11:55 -040070 void replayError(const QString &msg);
Jose Fonseca8f0846c2015-11-10 19:53:55 +000071 void loadError(const QString &msg);
Zack Rusinde4ea412011-03-30 11:30:08 -040072 void startedLoadingTrace();
Zack Rusinebf971e2011-09-06 17:44:43 -040073 void loadProgess(int percent);
Zack Rusinde4ea412011-03-30 11:30:08 -040074 void finishedLoadingTrace();
Zack Rusin2caa06d2011-03-30 18:30:20 -040075 void lookupState();
José Fonsecae5fa5412012-03-24 09:27:27 +000076 void showThumbnails();
Dan McCabe1c3ddde2012-03-21 09:53:45 -070077 void trim();
Zack Rusine1745572011-04-03 14:30:19 -040078 void showSettings();
Jose Fonsecaa20a7952016-01-19 14:16:24 +000079 void leakTrace();
80 void leakTraceFinished();
Zack Rusin09ec4842011-04-10 01:57:17 -040081 void showSurfacesMenu(const QPoint &pos);
82 void showSelectedSurface();
Zack Rusinfd638e52011-06-20 19:46:17 -040083 void saveSelectedSurface();
Edward Rudd14158b92014-07-07 17:46:05 -040084 void exportBufferData();
Zack Rusinc52d18a2011-04-11 00:15:07 -040085 void slotGoTo();
86 void slotJumpTo(int callNum);
Zack Rusinca164112011-04-11 02:23:09 -040087 void createdTrace(const QString &path);
88 void traceError(const QString &msg);
Dan McCabe1c3ddde2012-03-21 09:53:45 -070089 void createdTrim(const QString &path);
90 void trimError(const QString &msg);
Zack Rusinf04cf8a2011-04-12 23:21:52 -040091 void slotSearch();
Ruslan Kabatsayev75d69052019-02-20 13:41:18 +030092 void slotSearchNext(const QString &str, Qt::CaseSensitivity sensitivity, bool useRegex);
93 void slotSearchPrev(const QString &str, Qt::CaseSensitivity sensitivity, bool useRegex);
Zack Rusine2dfa2e2011-04-13 01:35:03 -040094 void fillState(bool nonDefaults);
Zack Rusinfb23ba12011-04-15 19:29:45 -040095 void customContextMenuRequested(QPoint pos);
96 void editCall();
Zack Rusin9af5bff2011-04-18 01:05:50 -040097 void slotStartedSaving();
98 void slotSaved();
Zack Rusin9623daf2011-04-18 18:03:34 -040099 void slotGoFrameStart();
100 void slotGoFrameEnd();
Dan McCabe10bd4242012-03-05 17:20:40 -0800101 void slotTraceChanged(ApiTraceEvent *event);
Zack Rusin10fd4772011-09-14 01:45:12 -0400102 void slotRetraceErrors(const QList<ApiTraceError> &errors);
Zack Rusind9239342011-04-19 23:43:06 -0400103 void slotErrorSelected(QTreeWidgetItem *current);
Zack Rusinad513b32011-09-25 14:33:41 -0400104 void slotSearchResult(const ApiTrace::SearchRequest &request,
105 ApiTrace::SearchResult result,
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400106 ApiTraceCall *call);
Zack Rusin93e4d152011-09-13 02:23:39 -0400107 void slotFoundFrameStart(ApiTraceFrame *frame);
108 void slotFoundFrameEnd(ApiTraceFrame *frame);
Zack Rusinda7579b2011-09-13 17:33:05 -0400109 void slotJumpToResult(ApiTraceCall *call);
Martin Schulzeb44232b2016-04-16 19:06:16 +0200110 void updateSurfacesView();
Zack Rusin27cb2c42011-03-27 23:53:36 -0400111
112private:
velorums9bef95e2020-05-23 21:57:30 +0200113 void initWindowState();
114 void saveWindowState();
Zack Rusin46678422011-04-10 12:15:46 -0400115 void initObjects();
116 void initConnections();
Alexandr Akulich1af94092012-12-07 16:59:52 +0600117 void updateActionsState(bool traceLoaded, bool stopped = true);
Zack Rusin27cb2c42011-03-27 23:53:36 -0400118 void newTraceFile(const QString &fileName);
Jose Fonseca65d26052017-07-30 13:48:40 +0100119 void replayTrace(bool dumpState, bool dumpThumbnails);
Dan McCabe1c3ddde2012-03-21 09:53:45 -0700120 void trimEvent();
Martin Schulzeb44232b2016-04-16 19:06:16 +0200121 void updateSurfacesView(const ApiTraceState &state);
Zack Rusin11f7e632011-03-30 22:47:51 -0400122 void fillStateForFrame();
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400123
124 /* there's a difference between selected frame/call and
125 * current call/frame. the former implies actual selection
126 * the latter might be just a highlight, e.g. during searching
127 */
128 ApiTraceFrame *selectedFrame() const;
129 ApiTraceCall *selectedCall() const;
Zack Rusin9623daf2011-04-18 18:03:34 -0400130 ApiTraceFrame *currentFrame() const;
Zack Rusinbe547732011-04-23 17:16:34 -0400131 ApiTraceCall *currentCall() const;
Zack Rusin601e8372011-03-24 22:23:21 -0400132
Dan McCabe88938852012-06-01 13:40:04 -0700133 static void thumbnailCallback(void *object, int thumbnailIdx);
134
Martin Schulze638ec442015-10-11 12:37:42 +0200135 void addSurface(const ApiTexture &image, QTreeWidgetItem *parent);
136 void addSurface(const ApiFramebuffer &image, QTreeWidgetItem *parent);
Martin Schulzeb44232b2016-04-16 19:06:16 +0200137 void addSurface(const ApiSurface &surface, const QString &label, QTreeWidgetItem *parent);
Martin Schulze638ec442015-10-11 12:37:42 +0200138 template <typename Surface>
139 void addSurfaces(const QList<Surface> &images, const char *label);
BogDan Vatraa9f9e642015-02-10 14:31:17 +0200140
Piotr Podsiadły654787e2016-09-13 09:53:48 +0200141 void addRecentLaunch(const RecentLaunch& launch);
142 QList<RecentLaunch> readRecentLaunches() const;
143 void updateRecentLaunchesMenu();
144
James Bentonfc4f55a2012-08-08 17:09:07 +0100145protected:
Jose Fonseca010f9962016-03-05 14:45:41 +0000146 virtual void closeEvent(QCloseEvent * event) override;
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400147
Zack Rusin601e8372011-03-24 22:23:21 -0400148private:
149 Ui_MainWindow m_ui;
Zack Rusin7c814f12011-04-09 19:20:58 -0400150 ShadersSourceWidget *m_sourcesWidget;
151
José Fonseca62997b42011-11-27 15:16:34 +0000152 trace::API m_api;
153
Zack Rusinf6667d12011-03-30 11:03:37 -0400154 ApiTrace *m_trace;
Zack Rusin601e8372011-03-24 22:23:21 -0400155 ApiTraceModel *m_model;
Zack Rusin91065372011-03-26 01:54:10 -0400156 ApiTraceFilter *m_proxyModel;
José Fonsecab7eb1522011-11-27 15:15:33 +0000157 int m_initalCallNum;
Zack Rusin27cb2c42011-03-27 23:53:36 -0400158
Zack Rusinde4ea412011-03-30 11:30:08 -0400159 QProgressBar *m_progressBar;
160
Zack Rusin581e3ff2011-03-31 23:58:07 -0400161 ApiTraceEvent *m_selectedEvent;
Zack Rusin11f7e632011-03-30 22:47:51 -0400162
Zack Rusin581e3ff2011-03-31 23:58:07 -0400163 ApiTraceEvent *m_stateEvent;
Zack Rusin11f7e632011-03-30 22:47:51 -0400164
Dan McCabe1c3ddde2012-03-21 09:53:45 -0700165 ApiTraceEvent *m_trimEvent;
166
Zack Rusin3acde362011-04-06 01:11:55 -0400167 Retracer *m_retracer;
Zack Rusin8e7a4ff2011-04-07 01:15:48 -0400168
169 VertexDataInterpreter *m_vdataInterpreter;
Zack Rusin09ec4842011-04-10 01:57:17 -0400170
Zack Rusinc52d18a2011-04-11 00:15:07 -0400171 JumpWidget *m_jumpWidget;
Zack Rusinf04cf8a2011-04-12 23:21:52 -0400172 SearchWidget *m_searchWidget;
Zack Rusinca164112011-04-11 02:23:09 -0400173
174 TraceProcess *m_traceProcess;
Zack Rusin963102f2011-04-15 01:45:05 -0400175
Dan McCabe1c3ddde2012-03-21 09:53:45 -0700176 TrimProcess *m_trimProcess;
177
Zack Rusin963102f2011-04-15 01:45:05 -0400178 ArgumentsEditor *m_argsEditor;
Zack Rusin3b7fbd72011-04-27 23:48:16 -0400179
180 ApiTraceEvent *m_nonDefaultsLookupEvent;
James Bentonfc4f55a2012-08-08 17:09:07 +0100181
182 ProfileDialog* m_profileDialog;
Zack Rusin601e8372011-03-24 22:23:21 -0400183};