X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=gui%2Fapitracecall.cpp;h=26f20bacc1dcad9b46b09f67c28c122807642bc7;hb=b25c4b9fccc76976d633bc5b183a84553ab01998;hp=b26514dd3464851e22b8eb020295e05b462b6dfa;hpb=8f98c3a529e7ef88e4111ef22cf8411916a9a065;p=apitrace diff --git a/gui/apitracecall.cpp b/gui/apitracecall.cpp index b26514d..26f20ba 100644 --- a/gui/apitracecall.cpp +++ b/gui/apitracecall.cpp @@ -101,6 +101,10 @@ plainTextToHTML(const QString & plain, bool multiLine) QString apiVariantToString(const QVariant &variant, bool multiLine) { + if (variant.isNull()) { + return QLatin1String("?"); + } + if (variant.userType() == QVariant::Double) { return QString::number(variant.toFloat()); } @@ -129,10 +133,10 @@ apiVariantToString(const QVariant &variant, bool multiLine) return variant.value().toString(); } if (variant.canConvert()) { - return variant.value().toString(); + return variant.value().toString(multiLine); } if (variant.canConvert()) { - return variant.value().toString(); + return variant.value().toString(multiLine); } if (variant.canConvert()) { return variant.value().toString(); @@ -142,37 +146,37 @@ apiVariantToString(const QVariant &variant, bool multiLine) } -void VariantVisitor::visit(Trace::Null *) +void VariantVisitor::visit(trace::Null *) { m_variant = QVariant::fromValue(ApiPointer(0)); } -void VariantVisitor::visit(Trace::Bool *node) +void VariantVisitor::visit(trace::Bool *node) { m_variant = QVariant(node->value); } -void VariantVisitor::visit(Trace::SInt *node) +void VariantVisitor::visit(trace::SInt *node) { m_variant = QVariant(node->value); } -void VariantVisitor::visit(Trace::UInt *node) +void VariantVisitor::visit(trace::UInt *node) { m_variant = QVariant(node->value); } -void VariantVisitor::visit(Trace::Float *node) +void VariantVisitor::visit(trace::Float *node) { m_variant = QVariant(node->value); } -void VariantVisitor::visit(Trace::String *node) +void VariantVisitor::visit(trace::String *node) { m_variant = QVariant(QString::fromStdString(node->value)); } -void VariantVisitor::visit(Trace::Enum *e) +void VariantVisitor::visit(trace::Enum *e) { ApiTraceEnumSignature *sig = 0; @@ -191,37 +195,28 @@ void VariantVisitor::visit(Trace::Enum *e) m_variant = QVariant::fromValue(ApiEnum(sig)); } -void VariantVisitor::visit(Trace::Bitmask *bitmask) +void VariantVisitor::visit(trace::Bitmask *bitmask) { m_variant = QVariant::fromValue(ApiBitmask(bitmask)); } -void VariantVisitor::visit(Trace::Struct *str) +void VariantVisitor::visit(trace::Struct *str) { m_variant = QVariant::fromValue(ApiStruct(str)); } -void VariantVisitor::visit(Trace::Array *array) +void VariantVisitor::visit(trace::Array *array) { m_variant = QVariant::fromValue(ApiArray(array)); } -void VariantVisitor::visit(Trace::Blob *blob) +void VariantVisitor::visit(trace::Blob *blob) { - //XXX - //FIXME: this is a nasty hack. Trace::Blob's can't - // delete the contents in the destructor because - // the data is being used by other calls. We piggy back - // on that assumption and don't deep copy the data. If - // Blob's will start deleting the data we will need to - // start deep copying it or switch to using something like - // Boost's shared_ptr or Qt's QSharedPointer to handle it - blob->toPointer(true); - QByteArray barray = QByteArray::fromRawData(blob->buf, blob->size); + QByteArray barray = QByteArray(blob->buf, blob->size); m_variant = QVariant(barray); } -void VariantVisitor::visit(Trace::Pointer *ptr) +void VariantVisitor::visit(trace::Pointer *ptr) { m_variant = QVariant::fromValue(ApiPointer(ptr->value)); } @@ -298,19 +293,19 @@ QString ApiPointer::toString() const return QLatin1String("NULL"); } -ApiBitmask::ApiBitmask(const Trace::Bitmask *bitmask) +ApiBitmask::ApiBitmask(const trace::Bitmask *bitmask) : m_value(0) { init(bitmask); } -void ApiBitmask::init(const Trace::Bitmask *bitmask) +void ApiBitmask::init(const trace::Bitmask *bitmask) { if (!bitmask) return; m_value = bitmask->value; - for (const Trace::BitmaskFlag *it = bitmask->sig->flags; + for (const trace::BitmaskFlag *it = bitmask->sig->flags; it != bitmask->sig->flags + bitmask->sig->num_flags; ++it) { assert(it->value); QPair pair; @@ -348,12 +343,12 @@ QString ApiBitmask::toString() const return str; } -ApiStruct::ApiStruct(const Trace::Struct *s) +ApiStruct::ApiStruct(const trace::Struct *s) { init(s); } -QString ApiStruct::toString() const +QString ApiStruct::toString(bool multiLine) const { QString str; @@ -361,7 +356,7 @@ QString ApiStruct::toString() const for (unsigned i = 0; i < m_members.count(); ++i) { str += m_sig.memberNames[i] % QLatin1Literal(" = ") % - apiVariantToString(m_members[i]); + apiVariantToString(m_members[i], multiLine); if (i < m_members.count() - 1) str += QLatin1String(", "); } @@ -370,7 +365,7 @@ QString ApiStruct::toString() const return str; } -void ApiStruct::init(const Trace::Struct *s) +void ApiStruct::init(const trace::Struct *s) { if (!s) return; @@ -385,7 +380,7 @@ void ApiStruct::init(const Trace::Struct *s) } } -ApiArray::ApiArray(const Trace::Array *arr) +ApiArray::ApiArray(const trace::Array *arr) { init(arr); } @@ -400,13 +395,13 @@ QVector ApiArray::values() const return m_array; } -QString ApiArray::toString() const +QString ApiArray::toString(bool multiLine) const { QString str; str += QLatin1String("["); for(int i = 0; i < m_array.count(); ++i) { const QVariant &var = m_array[i]; - str += apiVariantToString(var); + str += apiVariantToString(var, multiLine); if (i < m_array.count() - 1) str += QLatin1String(", "); } @@ -415,7 +410,7 @@ QString ApiArray::toString() const return str; } -void ApiArray::init(const Trace::Array *arr) +void ApiArray::init(const trace::Array *arr) { if (!arr) return; @@ -463,6 +458,8 @@ ApiTraceState::ApiTraceState(const QVariantMap &parsedJson) image[QLatin1String("__normalized__")].toBool(); int numChannels = image[QLatin1String("__channels__")].toInt(); + int depth = + image[QLatin1String("__depth__")].toInt(); Q_ASSERT(type == QLatin1String("uint8")); Q_ASSERT(normalized == true); @@ -473,6 +470,7 @@ ApiTraceState::ApiTraceState(const QVariantMap &parsedJson) ApiTexture tex; tex.setSize(size); + tex.setDepth(depth); tex.setNumChannels(numChannels); tex.setLabel(itr.key()); tex.contentsFromBase64(dataArray); @@ -490,6 +488,7 @@ ApiTraceState::ApiTraceState(const QVariantMap &parsedJson) QString type = buffer[QLatin1String("__type__")].toString(); bool normalized = buffer[QLatin1String("__normalized__")].toBool(); int numChannels = buffer[QLatin1String("__channels__")].toInt(); + int depth = buffer[QLatin1String("__depth__")].toInt(); Q_ASSERT(type == QLatin1String("uint8")); Q_ASSERT(normalized == true); @@ -500,6 +499,7 @@ ApiTraceState::ApiTraceState(const QVariantMap &parsedJson) ApiFramebuffer fbo; fbo.setSize(size); + fbo.setDepth(depth); fbo.setNumChannels(numChannels); fbo.setType(itr.key()); fbo.contentsFromBase64(dataArray); @@ -537,6 +537,22 @@ const QList & ApiTraceState::framebuffers() const return m_framebuffers; } +ApiFramebuffer ApiTraceState::colorBuffer() const +{ + foreach (ApiFramebuffer fbo, m_framebuffers) { + if (fbo.type() == QLatin1String("GL_BACK")) { + return fbo; + } + } + foreach (ApiFramebuffer fbo, m_framebuffers) { + if (fbo.type() == QLatin1String("GL_FRONT")) { + return fbo; + } + } + return ApiFramebuffer(); +} + + ApiTraceCallSignature::ApiTraceCallSignature(const QString &name, const QStringList &argNames) : m_name(name), @@ -603,7 +619,7 @@ void ApiTraceEvent::setState(ApiTraceState *state) ApiTraceCall::ApiTraceCall(ApiTraceFrame *parentFrame, TraceLoader *loader, - const Trace::Call *call) + const trace::Call *call) : ApiTraceEvent(ApiTraceEvent::Call), m_parentFrame(parentFrame) { @@ -628,12 +644,16 @@ ApiTraceCall::ApiTraceCall(ApiTraceFrame *parentFrame, } m_argValues.reserve(call->args.size()); for (int i = 0; i < call->args.size(); ++i) { - VariantVisitor argVisitor(loader); - call->args[i]->visit(argVisitor); - m_argValues.append(argVisitor.variant()); - if (m_argValues[i].type() == QVariant::ByteArray) { - m_hasBinaryData = true; - m_binaryDataIndex = i; + if (call->args[i]) { + VariantVisitor argVisitor(loader); + call->args[i]->visit(argVisitor); + m_argValues.append(argVisitor.variant()); + if (m_argValues[i].type() == QVariant::ByteArray) { + m_hasBinaryData = true; + m_binaryDataIndex = i; + } + } else { + m_argValues.append(QVariant()); } } m_argValues.squeeze(); @@ -657,11 +677,8 @@ QString ApiTraceCall::error() const void ApiTraceCall::setError(const QString &msg) { if (m_error != msg) { - ApiTrace *trace = parentTrace(); m_error = msg; m_richText = QString(); - if (trace) - trace->callError(this); } } @@ -932,8 +949,14 @@ ApiTraceFrame::ApiTraceFrame(ApiTrace *parentTrace) m_parentTrace(parentTrace), m_binaryDataSize(0), m_loaded(false), - m_callsToLoad(0) + m_callsToLoad(0), + m_lastCallIndex(0) +{ +} + +ApiTraceFrame::~ApiTraceFrame() { + qDeleteAll(m_calls); } QStaticText ApiTraceFrame::staticText() const @@ -941,23 +964,23 @@ QStaticText ApiTraceFrame::staticText() const if (m_staticText && !m_staticText->text().isEmpty()) return *m_staticText; - QString richText; + QString richText = QObject::tr( + "Frame %1" + "   " + " " + "(%2 calls)") + .arg(number) + .arg(m_loaded ? m_calls.count() : m_callsToLoad); //mark the frame if it uploads more than a meg a frame if (m_binaryDataSize > (1024*1024)) { richText = QObject::tr( - "" - "Frame %1" + "%1" "" "    (%2MB)") - .arg(number) + .arg(richText) .arg(double(m_binaryDataSize / (1024.*1024.)), 0, 'g', 2); - } else { - richText = - QObject::tr( - "Frame %1") - .arg(number); } if (!m_staticText) @@ -1001,6 +1024,18 @@ ApiTraceCall * ApiTraceFrame::call(int idx) const return m_calls.value(idx); } + +ApiTraceCall * ApiTraceFrame::callWithIndex(int index) const +{ + QVector::const_iterator itr; + for (itr = m_calls.constBegin(); itr != m_calls.constEnd(); ++itr) { + if ((*itr)->index() == index) { + return *itr; + } + } + return 0; +} + int ApiTraceFrame::callIndex(ApiTraceCall *call) const { return m_calls.indexOf(call); @@ -1026,9 +1061,11 @@ void ApiTraceFrame::setCalls(const QVector &calls, m_calls = calls; m_binaryDataSize = binaryDataSize; m_loaded = true; + delete m_staticText; + m_staticText = 0; } -bool ApiTraceFrame::loaded() const +bool ApiTraceFrame::isLoaded() const { return m_loaded; } @@ -1096,3 +1133,17 @@ ApiTraceFrame::findPrevCall(ApiTraceCall *from, } return 0; } + +void ApiTraceFrame::setLastCallIndex(unsigned index) +{ + m_lastCallIndex = index; +} + +unsigned ApiTraceFrame::lastCallIndex() const +{ + if (m_loaded && !m_calls.isEmpty()) { + return m_calls.last()->index(); + } else { + return m_lastCallIndex; + } +}