]> git.cworth.org Git - apitrace/blobdiff - gui/apitracecall.cpp
Add a state tab that list uniforms.
[apitrace] / gui / apitracecall.cpp
index 8f6f4200cb3c015e4444856e6a68a5d13d188699..c3f883147fe9f743a8135e08421229e3d93ef301 100644 (file)
@@ -4,6 +4,7 @@
 #include "trace_model.hpp"
 
 #include <QDebug>
+#include <QLocale>
 #include <QObject>
 #define QT_USE_FAST_OPERATOR_PLUS
 #include <QStringBuilder>
@@ -163,13 +164,13 @@ void ApiBitmask::init(const Trace::Bitmask *bitmask)
         return;
 
     m_value = bitmask->value;
-    for (Trace::Bitmask::Signature::const_iterator it = bitmask->sig->begin();
-         it != bitmask->sig->end(); ++it) {
-        assert(it->second);
+    for (const Trace::BitmaskFlag *it = bitmask->sig->flags;
+         it != bitmask->sig->flags + bitmask->sig->num_flags; ++it) {
+        assert(it->value);
         QPair<QString, unsigned long long> pair;
 
-        pair.first = QString::fromStdString(it->first);
-        pair.second = it->second;
+        pair.first = QString::fromStdString(it->name);
+        pair.second = it->value;
 
         m_sig.append(pair);
     }
@@ -229,7 +230,7 @@ void ApiStruct::init(const Trace::Struct *s)
         return;
 
     m_sig.name = QString::fromStdString(s->sig->name);
-    for (unsigned i = 0; i < s->members.size(); ++i) {
+    for (unsigned i = 0; i < s->sig->num_members; ++i) {
         VariantVisitor vis;
         m_sig.memberNames.append(
             QString::fromStdString(s->sig->member_names[i]));
@@ -270,13 +271,10 @@ void VariantVisitor::visit(Trace::String *node)
 
 void VariantVisitor::visit(Trace::Enum *e)
 {
-    VariantVisitor vis;
-    e->sig->second->visit(vis);
-
-    QVariant val = vis.variant();
+    QVariant val = QVariant(e->sig->value);
 
     m_variant = QVariant::fromValue(
-        ApiEnum(QString::fromStdString(e->sig->first), val));
+        ApiEnum(QString::fromStdString(e->sig->name), val));
 }
 
 void VariantVisitor::visit(Trace::Bitmask *bitmask)
@@ -477,10 +475,6 @@ QString ApiTraceCall::filterText() const
         m_filterText += m_argNames[i] +
                         QLatin1Literal(" = ") +
                         apiVariantToString(argValues[i]);
-        if (argValues[i].type() == QVariant::ByteArray) {
-            m_hasBinaryData = true;
-            m_binaryDataIndex = i;
-        }
         if (i < m_argNames.count() - 1)
             m_filterText += QLatin1String(", ");
     }
@@ -499,8 +493,24 @@ QStaticText ApiTraceFrame::staticText() const
     if (m_staticText && !m_staticText->text().isEmpty())
         return *m_staticText;
 
-    QString richText =
-        QString::fromLatin1("<span style=\"font-weight:bold\">Frame %1</span>").arg(number);
+    QString richText;
+
+    //mark the frame if it uploads more than a meg a frame
+    if (m_binaryDataSize > (1024*1024)) {
+        richText =
+            QObject::tr(
+                "<span style=\"font-weight:bold;\">"
+                "Frame&nbsp;%1</span>"
+                "<span style=\"font-style:italic;\">"
+                "&nbsp;&nbsp;&nbsp;&nbsp;(%2MB)</span>")
+            .arg(number)
+            .arg(double(m_binaryDataSize / (1024.*1024.)), 0, 'g', 2);
+    } else {
+        richText =
+            QObject::tr(
+                "<span style=\"font-weight:bold\">Frame %1</span>")
+            .arg(number);
+    }
 
     if (!m_staticText)
         m_staticText = new QStaticText(richText);
@@ -520,12 +530,13 @@ int ApiTraceCall::numChildren() const
 
 int ApiTraceFrame::numChildren() const
 {
-    return calls.count();
+    return m_calls.count();
 }
 
 ApiTraceFrame::ApiTraceFrame()
     : ApiTraceEvent(ApiTraceEvent::Frame),
-      m_parentTrace(0)
+      m_parentTrace(0),
+      m_binaryDataSize(0)
 {
 }
 
@@ -596,44 +607,34 @@ ApiTraceState::ApiTraceState(const QVariantMap &parsedJson)
         m_shaderSources[type] = source;
     }
 
-    QVariantList textureUnits =
-        parsedJson[QLatin1String("textures")].toList();
-    for (int i = 0; i < textureUnits.count(); ++i) {
-        QVariantMap unit = textureUnits[i].toMap();
-        for (itr = unit.constBegin(); itr != unit.constEnd(); ++itr) {
-            QVariantMap target = itr.value().toMap();
-            if (target.count()) {
-                QVariantList levels = target[QLatin1String("levels")].toList();
-                for (int j = 0; j < levels.count(); ++j) {
-                    QVariantMap level = levels[j].toMap();
-                    QVariantMap image = level[QLatin1String("image")].toMap();
-                    QSize size(image[QLatin1String("__width__")].toInt(),
-                               image[QLatin1String("__height__")].toInt());
-                    QString cls = image[QLatin1String("__class__")].toString();
-                    QString type = image[QLatin1String("__type__")].toString();
-                    bool normalized =
-                        image[QLatin1String("__normalized__")].toBool();
-                    int numChannels =
-                        image[QLatin1String("__channels__")].toInt();
-
-                    Q_ASSERT(type == QLatin1String("uint8"));
-                    Q_ASSERT(normalized == true);
-
-                    QByteArray dataArray =
-                        image[QLatin1String("__data__")].toByteArray();
-
-                    ApiTexture tex;
-                    tex.setSize(size);
-                    tex.setNumChannels(numChannels);
-                    tex.setLevel(j);
-                    tex.setUnit(i);
-                    tex.setTarget(itr.key());
-                    tex.contentsFromBase64(dataArray);
-
-                    m_textures.append(tex);
-                }
-            }
-        }
+    m_uniforms = parsedJson[QLatin1String("uniforms")].toMap();
+
+    QVariantMap textures =
+        parsedJson[QLatin1String("textures")].toMap();
+    for (itr = textures.constBegin(); itr != textures.constEnd(); ++itr) {
+        QVariantMap image = itr.value().toMap();
+        QSize size(image[QLatin1String("__width__")].toInt(),
+                   image[QLatin1String("__height__")].toInt());
+        QString cls = image[QLatin1String("__class__")].toString();
+        QString type = image[QLatin1String("__type__")].toString();
+        bool normalized =
+            image[QLatin1String("__normalized__")].toBool();
+        int numChannels =
+            image[QLatin1String("__channels__")].toInt();
+
+        Q_ASSERT(type == QLatin1String("uint8"));
+        Q_ASSERT(normalized == true);
+
+        QByteArray dataArray =
+            image[QLatin1String("__data__")].toByteArray();
+
+        ApiTexture tex;
+        tex.setSize(size);
+        tex.setNumChannels(numChannels);
+        tex.setLabel(itr.key());
+        tex.contentsFromBase64(dataArray);
+
+        m_textures.append(tex);
     }
 
     QVariantMap fbos =
@@ -662,27 +663,32 @@ ApiTraceState::ApiTraceState(const QVariantMap &parsedJson)
     }
 }
 
-QVariantMap ApiTraceState::parameters() const
+const QVariantMap & ApiTraceState::parameters() const
 {
     return m_parameters;
 }
 
-QMap<QString, QString> ApiTraceState::shaderSources() const
+const QMap<QString, QString> & ApiTraceState::shaderSources() const
 {
     return m_shaderSources;
 }
 
+const QVariantMap & ApiTraceState::uniforms() const
+{
+    return m_uniforms;
+}
+
 bool ApiTraceState::isEmpty() const
 {
     return m_parameters.isEmpty();
 }
 
-QList<ApiTexture> ApiTraceState::textures() const
+const QList<ApiTexture> & ApiTraceState::textures() const
 {
     return m_textures;
 }
 
-QList<ApiFramebuffer> ApiTraceState::framebuffers() const
+const QList<ApiFramebuffer> & ApiTraceState::framebuffers() const
 {
     return m_framebuffers;
 }
@@ -734,7 +740,7 @@ ApiTraceCall::ApiTraceCall(const Trace::Call *call)
     m_index = call->no;
 
     QString argumentsText;
-    for (int i = 0; i < call->sig->arg_names.size(); ++i) {
+    for (int i = 0; i < call->sig->num_args; ++i) {
         m_argNames +=
             QString::fromStdString(call->sig->arg_names[i]);
     }
@@ -747,6 +753,10 @@ ApiTraceCall::ApiTraceCall(const Trace::Call *call)
         VariantVisitor argVisitor;
         call->args[i]->visit(argVisitor);
         m_argValues += argVisitor.variant();
+        if (m_argValues[i].type() == QVariant::ByteArray) {
+            m_hasBinaryData = true;
+            m_binaryDataIndex = i;
+        }
     }
 }
 
@@ -894,3 +904,38 @@ ApiTrace * ApiTraceCall::parentTrace() const
     return NULL;
 }
 
+void ApiTraceFrame::addCall(ApiTraceCall *call)
+{
+    m_calls.append(call);
+    if (call->hasBinaryData()) {
+        QByteArray data =
+            call->arguments()[call->binaryDataIndex()].toByteArray();
+        m_binaryDataSize += data.size();
+    }
+}
+
+QList<ApiTraceCall*> ApiTraceFrame::calls() const
+{
+    return m_calls;
+}
+
+ApiTraceCall * ApiTraceFrame::call(int idx) const
+{
+    return m_calls.value(idx);
+}
+
+int ApiTraceFrame::callIndex(ApiTraceCall *call) const
+{
+    return m_calls.indexOf(call);
+}
+
+bool ApiTraceFrame::isEmpty() const
+{
+    return m_calls.isEmpty();
+}
+
+int ApiTraceFrame::binaryDataSize() const
+{
+    return m_binaryDataSize;
+}
+