1 #include "apitracecall.h"
3 #include "trace_model.hpp"
8 ApiPointer::ApiPointer(int val)
13 QString ApiPointer::toString() const
16 return QString("0x%1").arg(m_value, 0, 16);
18 return QLatin1String("NULL");
21 QString apiVariantToString(const QVariant &variant)
23 if (variant.userType() == QVariant::Double) {
24 return QString::number(variant.toFloat());
26 if (variant.userType() == QVariant::ByteArray) {
27 if (variant.toByteArray().size() < 1024) {
28 int bytes = variant.toByteArray().size();
29 return QObject::tr("[binary data, size = %1 bytes]").arg(bytes);
31 float kb = variant.toByteArray().size()/1024.;
32 return QObject::tr("[binary data, size = %1 kb]").arg(kb);
36 if (variant.userType() < QVariant::UserType) {
37 return variant.toString();
40 if (variant.canConvert<ApiPointer>()) {
41 return variant.value<ApiPointer>().toString();
43 if (variant.canConvert<ApiBitmask>()) {
44 return variant.value<ApiBitmask>().toString();
46 if (variant.canConvert<ApiStruct>()) {
47 return variant.value<ApiStruct>().toString();
49 if (variant.canConvert<ApiArray>()) {
50 return variant.value<ApiArray>().toString();
56 ApiBitmask::ApiBitmask(const Trace::Bitmask *bitmask)
63 void ApiBitmask::init(const Trace::Bitmask *bitmask)
68 m_value = bitmask->value;
69 for (Trace::Bitmask::Signature::const_iterator it = bitmask->sig->begin();
70 it != bitmask->sig->end(); ++it) {
72 QPair<QString, unsigned long long> pair;
74 pair.first = QString::fromStdString(it->first);
75 pair.second = it->second;
81 QString ApiBitmask::toString() const
84 unsigned long long value = m_value;
86 for (Signature::const_iterator it = m_sig.begin();
87 value != 0 && it != m_sig.end(); ++it) {
89 if ((value & it->second) == it->second) {
91 str += QLatin1String(" | ");
100 str += QLatin1String(" | ");
102 str += QString::fromLatin1("0x%1").arg(value, 0, 16);
107 ApiStruct::ApiStruct(const Trace::Struct *s)
112 QString ApiStruct::toString() const
116 str += QLatin1String("{");
117 for (unsigned i = 0; i < m_members.count(); ++i) {
118 str += m_sig.memberNames[i];
119 str += QLatin1String(" = ");
120 str += apiVariantToString(m_members[i]);
121 if (i < m_members.count() - 1)
122 str += QLatin1String(", ");
124 str += QLatin1String("}");
129 void ApiStruct::init(const Trace::Struct *s)
134 m_sig.name = QString::fromStdString(s->sig->name);
135 for (unsigned i = 0; i < s->members.size(); ++i) {
137 m_sig.memberNames.append(
138 QString::fromStdString(s->sig->member_names[i]));
139 s->members[i]->visit(vis);
140 m_members.append(vis.variant());
144 void VariantVisitor::visit(Trace::Null *)
146 m_variant = QVariant(QLatin1String("NULL"));
149 void VariantVisitor::visit(Trace::Bool *node)
151 m_variant = QVariant(node->value);
154 void VariantVisitor::visit(Trace::SInt *node)
156 m_variant = QVariant(node->value);
159 void VariantVisitor::visit(Trace::UInt *node)
161 m_variant = QVariant(node->value);
164 void VariantVisitor::visit(Trace::Float *node)
166 m_variant = QVariant(node->value);
169 void VariantVisitor::visit(Trace::String *node)
171 m_variant = QVariant(QString::fromStdString(node->value));
174 void VariantVisitor::visit(Trace::Enum *e)
176 m_variant = QVariant(QString::fromStdString(e->sig->first));
179 void VariantVisitor::visit(Trace::Bitmask *bitmask)
181 m_variant = QVariant::fromValue(ApiBitmask(bitmask));
184 void VariantVisitor::visit(Trace::Struct *str)
186 m_variant = QVariant::fromValue(ApiStruct(str));
189 void VariantVisitor::visit(Trace::Array *array)
191 m_variant = QVariant::fromValue(ApiArray(array));
194 void VariantVisitor::visit(Trace::Blob *blob)
196 QByteArray barray = QByteArray::fromRawData(blob->buf, blob->size);
197 m_variant = QVariant(barray);
200 void VariantVisitor::visit(Trace::Pointer *ptr)
202 m_variant = QVariant::fromValue(ApiPointer(ptr->value));
205 ApiArray::ApiArray(const Trace::Array *arr)
210 ApiArray::ApiArray(const QList<QVariant> &vals)
215 QString ApiArray::toString() const
218 str += QLatin1String("[");
219 for(int i = 0; i < m_array.count(); ++i) {
220 const QVariant &var = m_array[i];
221 str += apiVariantToString(var);
222 if (i < m_array.count() - 1)
223 str += QLatin1String(", ");
225 str += QLatin1String("]");
230 void ApiArray::init(const Trace::Array *arr)
235 for (int i = 0; i < arr->values.size(); ++i) {
237 arr->values[i]->visit(vis);
239 m_array.append(vis.variant());
243 QStaticText ApiTraceCall::staticText() const
245 if (!m_staticText.text().isEmpty())
248 QString richText = QString::fromLatin1("<span style=\"font-weight:bold\">%1</span>(").arg(m_name);
249 for (int i = 0; i < m_argNames.count(); ++i) {
250 richText += QLatin1String("<span style=\"color:#0000ff\">");
251 QString argText = apiVariantToString(m_argValues[i]);
253 //if arguments are really long (e.g. shader text), cut them
255 if (argText.length() > 40) {
256 QString shortened = argText.mid(0, 40);
257 shortened[argText.length() - 5] = '.';
258 shortened[argText.length() - 4] = '.';
259 shortened[argText.length() - 3] = '.';
260 shortened[argText.length() - 2] = argText[argText.length() - 2];
261 shortened[argText.length() - 1] = argText[argText.length() - 1];
262 richText += shortened;
266 richText += QLatin1String("</span>");
267 if (i < m_argNames.count() - 1)
268 richText += QString::fromLatin1(", ");
270 richText += QLatin1String(")");
271 if (m_returnValue.isValid()) {
272 richText += QLatin1String(" = ");
273 richText += QLatin1String("<span style=\"color:#0000ff\">");
274 richText += apiVariantToString(m_returnValue);
275 richText += QLatin1String("</span>");
278 m_staticText.setText(richText);
280 opt.setWrapMode(QTextOption::NoWrap);
281 m_staticText.setTextOption(opt);
282 m_staticText.prepare();
287 QString ApiTraceCall::toHtml() const
289 if (!m_richText.isEmpty())
292 if (m_helpUrl.isEmpty()) {
293 m_richText = QString::fromLatin1(
294 "%1) <span style=\"font-weight:bold\">%2</span>(")
298 m_richText = QString::fromLatin1(
299 "%1) <span style=\"font-weight:bold\"><a href=\"%2\">%3</a></span>(")
301 .arg(m_helpUrl.toString())
305 for (int i = 0; i < m_argNames.count(); ++i) {
306 m_richText += m_argNames[i];
307 m_richText += QString::fromLatin1(" = ");
308 m_richText += QLatin1String("<span style=\"color:#0000ff\">");
309 m_richText += apiVariantToString(m_argValues[i]);
310 m_richText += QLatin1String("</span>");
311 if (i < m_argNames.count() - 1)
312 m_richText += QString::fromLatin1(", ");
314 m_richText += QLatin1String(")");
316 if (m_returnValue.isValid()) {
317 m_richText += QLatin1String(" = ");
318 m_richText += QLatin1String("<span style=\"color:#0000ff\">");
319 m_richText += apiVariantToString(m_returnValue);
320 m_richText += QLatin1String("</span>");
325 QString ApiTraceCall::filterText() const
327 if (!m_filterText.isEmpty())
330 m_filterText = m_name;
331 m_filterText += QLatin1String("(");
332 for (int i = 0; i < m_argNames.count(); ++i) {
333 m_filterText += m_argNames[i];
334 m_filterText += QString::fromLatin1(" = ");
336 if (m_argValues[i].type() == QVariant::ByteArray) {
337 m_hasBinaryData = true;
338 m_binaryDataIndex = i;
340 m_filterText += apiVariantToString(m_argValues[i]);
341 if (i < m_argNames.count() - 1)
342 m_filterText += QString::fromLatin1(", ");
344 m_filterText += QLatin1String(")");
346 if (m_returnValue.isValid()) {
347 m_filterText += QLatin1String(" = ");
348 m_filterText += apiVariantToString(m_returnValue);
353 QStaticText ApiTraceFrame::staticText() const
355 if (!m_staticText.text().isEmpty())
359 QString::fromLatin1("<span style=\"font-weight:bold\">Frame %1</span>").arg(number);
361 m_staticText.setText(richText);
363 opt.setWrapMode(QTextOption::NoWrap);
364 m_staticText.setTextOption(opt);
365 m_staticText.prepare();
370 int ApiTraceCall::numChildren() const
375 int ApiTraceFrame::numChildren() const
377 return calls.count();
380 ApiTraceFrame::ApiTraceFrame()
381 : ApiTraceEvent(ApiTraceEvent::Frame)
385 ApiTraceCall::ApiTraceCall()
386 : ApiTraceEvent(ApiTraceEvent::Call),
387 m_hasBinaryData(false),
392 ApiTraceEvent::ApiTraceEvent()
393 : m_type(ApiTraceEvent::None)
397 ApiTraceEvent::ApiTraceEvent(Type t)
402 ApiTraceCall::~ApiTraceCall()
406 QVariantMap ApiTraceEvent::stateParameters() const
408 return m_state.parameters();
411 ApiTraceState ApiTraceEvent::state() const
416 void ApiTraceEvent::setState(const ApiTraceState &state)
421 bool ApiTraceCall::hasBinaryData() const
423 return m_hasBinaryData;
426 int ApiTraceCall::binaryDataIndex() const
428 return m_binaryDataIndex;
431 ApiTraceState::ApiTraceState()
435 ApiTraceState::ApiTraceState(const QVariantMap &parsedJson)
437 m_parameters = parsedJson[QLatin1String("parameters")].toMap();
438 QVariantMap attachedShaders =
439 parsedJson[QLatin1String("shaders")].toMap();
440 QVariantMap::const_iterator itr;
443 for (itr = attachedShaders.constBegin(); itr != attachedShaders.constEnd(); ++itr) {
444 QString type = itr.key();
445 QString source = itr.value().toString();
446 m_shaderSources[type] = source;
449 QVariantList textureUnits =
450 parsedJson[QLatin1String("textures")].toList();
451 for (int i = 0; i < textureUnits.count(); ++i) {
452 QVariantMap unit = textureUnits[i].toMap();
453 for (itr = unit.constBegin(); itr != unit.constEnd(); ++itr) {
454 QVariantMap target = itr.value().toMap();
455 if (target.count()) {
456 QVariantList levels = target[QLatin1String("levels")].toList();
457 for (int j = 0; j < levels.count(); ++j) {
458 QVariantMap level = levels[j].toMap();
459 QVariantMap image = level[QLatin1String("image")].toMap();
460 QSize size(image[QLatin1String("__width__")].toInt(),
461 image[QLatin1String("__height__")].toInt());
462 QString cls = image[QLatin1String("__class__")].toString();
463 QString type = image[QLatin1String("__type__")].toString();
465 image[QLatin1String("__normalized__")].toBool();
467 image[QLatin1String("__channels__")].toInt();
469 Q_ASSERT(type == QLatin1String("uint8"));
470 Q_ASSERT(normalized == true);
472 QByteArray dataArray =
473 image[QLatin1String("__data__")].toByteArray();
477 tex.setNumChannels(numChannels);
480 tex.setTarget(itr.key());
481 tex.contentsFromBase64(dataArray);
483 m_textures.append(tex);
490 parsedJson[QLatin1String("framebuffer")].toMap();
491 for (itr = fbos.constBegin(); itr != fbos.constEnd(); ++itr) {
492 QVariantMap buffer = itr.value().toMap();
493 QSize size(buffer[QLatin1String("__width__")].toInt(),
494 buffer[QLatin1String("__height__")].toInt());
495 QString cls = buffer[QLatin1String("__class__")].toString();
496 QString type = buffer[QLatin1String("__type__")].toString();
497 bool normalized = buffer[QLatin1String("__normalized__")].toBool();
498 int numChannels = buffer[QLatin1String("__channels__")].toInt();
500 Q_ASSERT(type == QLatin1String("uint8"));
501 Q_ASSERT(normalized == true);
503 QByteArray dataArray =
504 buffer[QLatin1String("__data__")].toByteArray();
508 fbo.setNumChannels(numChannels);
509 fbo.setType(itr.key());
510 fbo.contentsFromBase64(dataArray);
511 m_framebuffers.append(fbo);
515 QVariantMap ApiTraceState::parameters() const
520 QMap<QString, QString> ApiTraceState::shaderSources() const
522 return m_shaderSources;
525 bool ApiTraceState::isEmpty() const
527 return m_parameters.isEmpty();
530 QList<ApiTexture> ApiTraceState::textures() const
535 QList<ApiFramebuffer> ApiTraceState::framebuffers() const
537 return m_framebuffers;
540 QList<QVariant> ApiArray::values() const
545 int ApiTraceCall::index() const
550 QString ApiTraceCall::name() const
555 QStringList ApiTraceCall::argNames() const
560 QVariantList ApiTraceCall::arguments() const
565 QVariant ApiTraceCall::returnValue() const
567 return m_returnValue;
570 QUrl ApiTraceCall::helpUrl() const
575 ApiTraceCall::ApiTraceCall(const Trace::Call *call)
576 : ApiTraceEvent(ApiTraceEvent::Call),
577 m_hasBinaryData(false),
580 m_name = QString::fromStdString(call->sig->name);
583 QString argumentsText;
584 for (int i = 0; i < call->sig->arg_names.size(); ++i) {
586 QString::fromStdString(call->sig->arg_names[i]);
589 VariantVisitor retVisitor;
590 call->ret->visit(retVisitor);
591 m_returnValue = retVisitor.variant();
593 for (int i = 0; i < call->args.size(); ++i) {
594 VariantVisitor argVisitor;
595 call->args[i]->visit(argVisitor);
596 m_argValues += argVisitor.variant();
600 void ApiTraceCall::setHelpUrl(const QUrl &url)
605 void ApiTraceCall::setParentFrame(ApiTraceFrame *frame)
607 m_parentFrame = frame;
610 ApiTraceFrame * ApiTraceCall::parentFrame()const
612 return m_parentFrame;