settingsdialog.cpp
shaderssourcewidget.cpp
tracedialog.cpp
+ traceprocess.cpp
vertexdatainterpreter.cpp
)
m_loader->terminate();
m_loader->wait();
}
+ m_frames.clear();
+ m_calls.clear();
emit invalidated();
m_loader->loadFile(m_fileName);
if (m_trace)
disconnect(m_trace);
m_trace = trace;
+ connect(m_trace, SIGNAL(invalidated()),
+ this, SLOT(invalidateFrames()));
connect(m_trace, SIGNAL(framesInvalidated()),
this, SLOT(invalidateFrames()));
connect(m_trace, SIGNAL(framesAdded(int, int)),
#include "settingsdialog.h"
#include "shaderssourcewidget.h"
#include "tracedialog.h"
+#include "traceprocess.h"
#include "ui_retracerdialog.h"
#include "vertexdatainterpreter.h"
{
TraceDialog dialog;
+ if (!m_traceProcess->canTrace()) {
+ QMessageBox::warning(
+ this,
+ tr("Unsupported"),
+ tr("Current configuration doesn't support tracing."));
+ return;
+ }
+
if (dialog.exec() == QDialog::Accepted) {
qDebug()<< "App : " <<dialog.applicationPath();
qDebug()<< " Arguments: "<<dialog.arguments();
+ m_traceProcess->setExecutablePath(dialog.applicationPath());
+ m_traceProcess->setArguments(dialog.arguments());
+ m_traceProcess->start();
}
}
m_ui.centralLayout->addWidget(m_jumpWidget);
m_jumpWidget->hide();
+ m_traceProcess = new TraceProcess(this);
new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_G),
this, SLOT(slotGoTo()));
connect(m_jumpWidget, SIGNAL(jumpTo(int)),
SLOT(slotJumpTo(int)));
+
+ connect(m_traceProcess, SIGNAL(tracedFile(const QString&)),
+ SLOT(createdTrace(const QString&)));
+ connect(m_traceProcess, SIGNAL(error(const QString&)),
+ SLOT(traceError(const QString&)));
}
void MainWindow::replayStateFound(const ApiTraceState &state)
}
}
+void MainWindow::createdTrace(const QString &path)
+{
+ qDebug()<<"Done tracing "<<path;
+ newTraceFile(path);
+}
+
+void MainWindow::traceError(const QString &msg)
+{
+ QMessageBox::warning(
+ this,
+ tr("Tracing Error"),
+ msg);
+}
+
#include "mainwindow.moc"
class QUrl;
class Retracer;
class ShadersSourceWidget;
+class TraceProcess;
class VertexDataInterpreter;
class MainWindow : public QMainWindow
void showSelectedSurface();
void slotGoTo();
void slotJumpTo(int callNum);
+ void createdTrace(const QString &path);
+ void traceError(const QString &msg);
private:
void initObjects();
ImageViewer *m_imageViewer;
JumpWidget *m_jumpWidget;
+
+ TraceProcess *m_traceProcess;
};
QStringList TraceDialog::arguments() const
{
QStringList args =
- argumentsEdit->text().split(';');
+ argumentsEdit->text().split(';', QString::SkipEmptyParts);
return args;
}
--- /dev/null
+#include "traceprocess.h"
+
+#include <QDebug>
+#include <QDir>
+#include <QFile>
+#include <QFileInfo>
+
+static QString
+findPreloader()
+{
+ QString libPath = QString::fromLatin1("%1/libglxtrace.so")
+ .arg(BUILD_DIR);
+
+ QFileInfo fi(libPath);
+ if (fi.exists())
+ return libPath;
+
+ libPath = QString::fromLatin1("/usr/local/lib/libglxtrace.so");
+ fi = QFileInfo(libPath);
+ if (fi.exists())
+ return libPath;
+
+ libPath = QString::fromLatin1("/usr/lib/libglxtrace.so");
+ fi = QFileInfo(libPath);
+ if (fi.exists())
+ return libPath;
+
+ return QString();
+}
+
+TraceProcess::TraceProcess(QObject *parent)
+ : QObject(parent),
+ m_canTrace(true)
+{
+ m_process = new QProcess(this);
+
+ connect(m_process, SIGNAL(finished(int, QProcess::ExitStatus)),
+ this, SLOT(traceFinished()));
+ connect(m_process, SIGNAL(error(QProcess::ProcessError)),
+ this, SLOT(traceError(QProcess::ProcessError)));
+
+#ifdef Q_OS_WIN
+ qWarning()<<"Windows tracing isn't supported right now!";
+ m_canTrace = false;
+#else
+ QString var = QLatin1String("LD_PRELOAD");
+ QString libPath = findPreloader();
+ QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
+
+ if (libPath.isEmpty()) {
+ m_canTrace = false;
+ }
+
+ env.insert("LD_PRELOAD", libPath);
+ qputenv("LD_PRELOAD", env.value("LD_PRELOAD").toLatin1());
+
+ m_process->setProcessEnvironment(env);
+#endif
+}
+
+TraceProcess::~TraceProcess()
+{
+}
+
+void TraceProcess::setExecutablePath(const QString &str)
+{
+ m_execPath = str;
+
+ QFileInfo fi(m_execPath);
+
+ m_process->setWorkingDirectory(fi.absolutePath());
+
+ QString format = QString::fromLatin1("%1%2%3.trace");
+
+ m_tracePath = format
+ .arg(fi.absolutePath())
+ .arg(QDir::separator())
+ .arg(fi.baseName());
+
+ int i = 1;
+ while (QFile::exists(m_tracePath)) {
+ QString format = QString::fromLatin1("%1%2%3.%4.trace");
+ m_tracePath = format
+ .arg(fi.absolutePath())
+ .arg(QDir::separator())
+ .arg(fi.baseName())
+ .arg(i++);
+ }
+}
+
+QString TraceProcess::executablePath() const
+{
+ return m_execPath;
+}
+
+void TraceProcess::setArguments(const QStringList &args)
+{
+ m_args = args;
+}
+
+QStringList TraceProcess::arguments() const
+{
+ return m_args;
+}
+
+void TraceProcess::traceFinished()
+{
+#if 0
+ qDebug()<<"trace finished on " << m_tracePath;
+ qDebug()<<"\terr = "<<m_process->readAllStandardError();
+ qDebug()<<"\tout = "<<m_process->readAllStandardOutput();
+#endif
+ emit tracedFile(m_tracePath);
+}
+
+void TraceProcess::traceError(QProcess::ProcessError err)
+{
+#if 1
+ qDebug()<<"trace error = "<<m_tracePath;
+ qDebug()<<"\terr = "<<m_process->readAllStandardError();
+ qDebug()<<"\tout = "<<m_process->readAllStandardOutput();
+#endif
+ emit error(m_process->readAllStandardError());
+}
+
+
+void TraceProcess::start()
+{
+ m_process->start(m_execPath, m_args);
+}
+
+bool TraceProcess::canTrace() const
+{
+ return m_canTrace;
+}
+
+#include "traceprocess.moc"
--- /dev/null
+#ifndef TRACEPROCESS_H
+#define TRACEPROCESS_H
+
+#include <QObject>
+#include <QProcess>
+
+class TraceProcess : public QObject
+{
+ Q_OBJECT
+public:
+ TraceProcess(QObject *parent=0);
+ ~TraceProcess();
+
+ bool canTrace() const;
+
+ void setExecutablePath(const QString &str);
+ QString executablePath() const;
+
+ void setArguments(const QStringList &args);
+ QStringList arguments() const;
+
+public slots:
+ void start();
+
+signals:
+ void tracedFile(const QString &tracePath);
+ void error(const QString &msg);
+
+private slots:
+ void traceFinished();
+ void traceError(QProcess::ProcessError err);
+
+private:
+ QString m_execPath;
+ QStringList m_args;
+ QString m_tracePath;
+ QProcess *m_process;
+
+ bool m_canTrace;
+};
+
+#endif