blob: 25ca14080c00b37bd4c5c37d923522dcecc30306 [file] [log] [blame]
#pragma once
#include "apisurface.h"
#include <QStaticText>
#include <QStringList>
#include <QUrl>
#include <QVariant>
#include "trace_model.hpp"
class ApiTrace;
class TraceLoader;
class VariantVisitor : public trace::Visitor
{
public:
virtual void visit(trace::Null *) override;
virtual void visit(trace::Bool *node) override;
virtual void visit(trace::SInt *node) override;
virtual void visit(trace::UInt *node) override;
virtual void visit(trace::Float *node) override;
virtual void visit(trace::Double *node) override;
virtual void visit(trace::String *node) override;
virtual void visit(trace::WString *node) override;
virtual void visit(trace::Enum *e) override;
virtual void visit(trace::Bitmask *bitmask) override;
virtual void visit(trace::Struct *str) override;
virtual void visit(trace::Array *array) override;
virtual void visit(trace::Blob *blob) override;
virtual void visit(trace::Pointer *ptr) override;
virtual void visit(trace::Repr *ptr) override;
QVariant variant() const
{
return m_variant;
}
private:
QVariant m_variant;
};
struct ApiTraceError
{
int callIndex;
QString type;
QString message;
};
class ApiEnum
{
public:
ApiEnum(const trace::EnumSig *sig=0, signed long long value = 0);
QString toString() const;
QVariant value() const;
private:
const trace::EnumSig *m_sig;
signed long long m_value;
};
Q_DECLARE_METATYPE(ApiEnum);
class ApiPointer
{
public:
ApiPointer(unsigned long long val=0);
QString toString() const;
unsigned long long value() const;
private:
unsigned long long m_value;
};
Q_DECLARE_METATYPE(ApiPointer);
class ApiBitmask
{
public:
typedef QList<QPair<QString, unsigned long long> > Signature;
ApiBitmask(const trace::Bitmask *bitmask = 0);
QString toString() const;
unsigned long long value() const;
Signature signature() const;
private:
void init(const trace::Bitmask *bitmask);
private:
Signature m_sig;
unsigned long long m_value;
};
Q_DECLARE_METATYPE(ApiBitmask);
class ApiStruct
{
public:
struct Signature {
QString name;
QStringList memberNames;
};
ApiStruct(const trace::Struct *s = 0);
QString toString(bool multiLine = false) const;
Signature signature() const;
QList<QVariant> values() const;
private:
void init(const trace::Struct *bitmask);
private:
Signature m_sig;
QList<QVariant> m_members;
};
Q_DECLARE_METATYPE(ApiStruct);
class ApiArray
{
public:
ApiArray(const trace::Array *arr = 0);
ApiArray(const QVector<QVariant> &vals);
QString toString(bool multiLine = false) const;
QVector<QVariant> values() const;
private:
void init(const trace::Array *arr);
private:
QVector<QVariant> m_array;
};
Q_DECLARE_METATYPE(ApiArray);
QString apiVariantToString(const QVariant &variant, bool multiLine = false);
class ApiTraceFrame;
class ApiTraceState {
public:
ApiTraceState();
explicit ApiTraceState(const QVariantMap &parseJson);
bool isEmpty() const;
const QVariantMap & parameters() const;
const QMap<QString, QString> & shaderSources() const;
const QVariantMap & uniforms() const;
const QVariantMap & buffers() const;
const QVariantMap & shaderStorageBufferBlocks() const;
const QList<ApiTexture> & textures() const;
const QList<ApiFramebuffer> & framebuffers() const;
ApiFramebuffer colorBuffer() const;
private:
QVariantMap m_parameters;
QMap<QString, QString> m_shaderSources;
QVariantMap m_uniforms;
QVariantMap m_buffers;
QVariantMap m_shaderStorageBufferBlocks;
QList<ApiTexture> m_textures;
QList<ApiFramebuffer> m_framebuffers;
};
Q_DECLARE_METATYPE(ApiTraceState);
class ApiTraceCallSignature
{
public:
ApiTraceCallSignature(const QString &name,
const QStringList &argNames);
~ApiTraceCallSignature();
QString name() const
{
return m_name;
}
QStringList argNames() const
{
return m_argNames;
}
QUrl helpUrl() const;
void setHelpUrl(const QUrl &url);
private:
QString m_name;
QStringList m_argNames;
QUrl m_helpUrl;
};
class ApiTraceCall;
class ApiTraceEvent
{
public:
enum Type {
None = 0,
Call = 1 << 0,
Frame = 1 << 1
};
public:
ApiTraceEvent();
ApiTraceEvent(Type t);
virtual ~ApiTraceEvent();
Type type() const { return (Type)m_type; }
virtual QStaticText staticText() const = 0;
virtual int numChildren() const = 0;
virtual int callIndex(ApiTraceCall *call) const = 0;
virtual ApiTraceEvent *eventAtRow(int row) const = 0;
ApiTraceState *state() const;
void setState(ApiTraceState *state);
bool hasState() const
{
return m_state && !m_state->isEmpty();
}
void setThumbnail(const QImage & thumbnail);
const QImage & thumbnail() const;
virtual void missingThumbnail() = 0;
protected:
int m_type : 4;
mutable int m_binaryDataIndex:8;
ApiTraceState *m_state;
mutable QStaticText *m_staticText;
QImage m_thumbnail;
};
Q_DECLARE_METATYPE(ApiTraceEvent*);
class ApiTraceCall : public ApiTraceEvent
{
public:
ApiTraceCall(ApiTraceCall *parentCall, TraceLoader *loader,
const trace::Call *tcall);
ApiTraceCall(ApiTraceFrame *parentFrame, TraceLoader *loader,
const trace::Call *tcall);
~ApiTraceCall();
int index() const;
QString name() const;
QStringList argNames() const;
QVector<QVariant> arguments() const;
QVariant returnValue() const;
trace::CallFlags flags() const;
QUrl helpUrl() const;
void setHelpUrl(const QUrl &url);
ApiTraceFrame *parentFrame()const;
void setParentFrame(ApiTraceFrame *frame);
int callIndex(ApiTraceCall *call) const override;
ApiTraceEvent *parentEvent() const;
ApiTraceCall *parentCall() const;
QVector<ApiTraceCall*> children() const;
ApiTraceEvent *eventAtRow(int row) const override;
void addChild(ApiTraceCall *call);
void finishedAddingChildren();
bool hasError() const;
QString error() const;
void setError(const QString &msg);
QVector<QVariant> originalValues() const;
bool edited() const;
void setEditedValues(const QVector<QVariant> &lst);
QVector<QVariant> editedValues() const;
void revert();
bool contains(const QString &str,
Qt::CaseSensitivity sensitivity,
bool useRegex) const;
ApiTrace *parentTrace() const;
QString toHtml() const;
QString searchText() const;
QStaticText staticText() const override;
int numChildren() const override;
bool hasBinaryData() const;
int binaryDataIndex() const;
QString backtrace() const;
void setBacktrace(QString backtrace);
void missingThumbnail() override;
private:
void loadData(TraceLoader *loader,
const trace::Call *tcall);
private:
int m_index;
unsigned m_thread;
ApiTraceCallSignature *m_signature;
QVector<QVariant> m_argValues;
QVariant m_returnValue;
trace::CallFlags m_flags;
ApiTraceFrame *m_parentFrame;
ApiTraceCall *m_parentCall;
QVector<ApiTraceCall*> m_children;
QVector<QVariant> m_editedValues;
QString m_error;
QString m_backtrace;
mutable QString m_richText;
mutable QString m_searchText;
};
Q_DECLARE_METATYPE(ApiTraceCall*);
class ApiTraceFrame : public ApiTraceEvent
{
public:
ApiTraceFrame(ApiTrace *parent=0);
~ApiTraceFrame();
int number;
bool isEmpty() const;
void setParentTrace(ApiTrace *parent);
ApiTrace *parentTrace() const;
void setNumChildren(int num);
int numChildren() const override;
int numChildrenToLoad() const;
int numTotalCalls() const;
QStaticText staticText() const override;
ApiTraceEvent *eventAtRow(int row) const override;
int callIndex(ApiTraceCall *call) const override;
ApiTraceCall *callWithIndex(int index) const;
QVector<ApiTraceCall*> calls() const;
void setCalls(const QVector<ApiTraceCall*> &topLevelCalls,
const QVector<ApiTraceCall*> &allCalls,
quint64 binaryDataSize);
ApiTraceCall *findNextCall(ApiTraceCall *from,
const QString &str,
Qt::CaseSensitivity sensitivity,
bool useRegex) const;
ApiTraceCall *findPrevCall(ApiTraceCall *from,
const QString &str,
Qt::CaseSensitivity sensitivity,
bool useRegex) const;
int binaryDataSize() const;
bool isLoaded() const;
void setLastCallIndex(unsigned index);
unsigned lastCallIndex() const;
void missingThumbnail() override;
private:
ApiTrace *m_parentTrace;
quint64 m_binaryDataSize;
QVector<ApiTraceCall*> m_children;
QVector<ApiTraceCall*> m_calls;
bool m_loaded;
unsigned m_callsToLoad;
unsigned m_lastCallIndex;
};
Q_DECLARE_METATYPE(ApiTraceFrame*);