vktraceviewer::vktraceviewer(QWidget *parent) : QMainWindow(parent), ui(new Ui::vktraceviewer), m_settingsDialog(this), m_pTraceFileModel(NULL), m_pProxyModel(NULL), m_pController(NULL), m_pGenerateTraceButton(NULL), m_pTimeline(NULL), m_pGenerateTraceDialog(NULL), m_bDelayUpdateUIForContext(false), m_bGeneratingTrace(false) { ui->setupUi(this); qRegisterMetaType<uint64_t>("uint64_t"); qRegisterMetaType<VktraceLogLevel>("VktraceLogLevel"); m_pTraceStatsTab = new QWidget(); m_pTraceStatsTab->setObjectName(QStringLiteral("m_pTraceStatsTab")); m_pTraceStatsTabLayout = new QGridLayout(m_pTraceStatsTab); m_pTraceStatsTabLayout->setSpacing(6); m_pTraceStatsTabLayout->setContentsMargins(11,11,11,11); m_pTraceStatsTabLayout->setObjectName(QStringLiteral("m_pTraceStatsTabLayout")); m_pTraceStatsTabText = new QTextBrowser(m_pTraceStatsTab); m_pTraceStatsTabText->setObjectName(QStringLiteral("m_pTraceStatsTabText")); m_pTraceStatsTabText->setLineWrapMode(QTextEdit::NoWrap); m_pTraceStatsTabLayout->addWidget(m_pTraceStatsTabText, 0, 0, 1, 1); QFont font("monospace", 10); m_pTraceStatsTabText->setFont(font); ui->outputTextBrowser->setFont(font); // Hide unused, default tab ui->stateTabWidget->removeTab(0); memset(&m_traceFileInfo, 0, sizeof(vktraceviewer_trace_file_info)); m_settingsDialog.resize(g_settings.settings_dialog_width, g_settings.settings_dialog_height); connect(&m_settingsDialog, SIGNAL(SaveSettings(vktrace_SettingGroup*, unsigned int)), this, SLOT(on_settingsSaved(vktrace_SettingGroup*, unsigned int))); connect(&m_settingsDialog, SIGNAL(Resized(unsigned int, unsigned int)), this, SLOT(on_settingsDialogResized(unsigned int, unsigned int))); this->move(g_settings.window_position_left, g_settings.window_position_top); this->resize(g_settings.window_size_width, g_settings.window_size_height); connect(ui->outputTextBrowser, SIGNAL(anchorClicked(const QUrl&)), this, SLOT(on_hyperlinkClicked(const QUrl&))); // setup Output Window vktraceviewer_output_init(ui->outputTextBrowser); vktrace_LogSetCallback(loggingCallback); vktrace_LogSetLevel(VKTRACE_LOG_ERROR); vktrace_LogAlways("Welcome to VkTraceViewer!"); // cache the original background color of the search text box m_searchTextboxBackgroundColor = ui->searchTextBox->palette().base().color(); // add buttons to toolbar m_pGenerateTraceButton = new QToolButton(ui->mainToolBar); m_pGenerateTraceButton->setText("Generate Trace..."); m_pGenerateTraceButton->setEnabled(true); connect(m_pGenerateTraceButton, SIGNAL(clicked()), this, SLOT(prompt_generate_trace())); ui->mainToolBar->addWidget(m_pGenerateTraceButton); ui->treeView->setModel(NULL); ui->treeView->setContextMenuPolicy(Qt::ActionsContextMenu); ui->treeView->setUniformRowHeights(true); // setup timeline m_pTimeline = new vktraceviewer_QTimelineView(); if (m_pTimeline != NULL) { m_pTimeline->setMinimumHeight(100); connect(m_pTimeline, SIGNAL(clicked(const QModelIndex &)), this, SLOT(slot_timeline_clicked(const QModelIndex &))); ui->timelineLayout->addWidget(m_pTimeline); ui->timelineLayout->removeWidget(ui->timelineViewPlaceholder); delete ui->timelineViewPlaceholder; ui->timelineViewPlaceholder = NULL; }
int main_loop(Sequencer &seq, vktrace_trace_packet_replay_library *replayerArray[], vkreplayer_settings settings) { int err = 0; vktrace_trace_packet_header *packet; unsigned int res; vktrace_trace_packet_replay_library *replayer = NULL; vktrace_trace_packet_message* msgPacket; struct seqBookmark startingPacket; bool trace_running = true; int prevFrameNumber = -1; // record the location of looping start packet seq.record_bookmark(); seq.get_bookmark(startingPacket); while (settings.numLoops > 0) { while ((packet = seq.get_next_packet()) != NULL && trace_running) { switch (packet->packet_id) { case VKTRACE_TPI_MESSAGE: msgPacket = vktrace_interpret_body_as_trace_packet_message(packet); vktrace_LogAlways("Packet %lu: Traced Message (%s): %s", packet->global_packet_index, vktrace_LogLevelToShortString(msgPacket->type), msgPacket->message); break; case VKTRACE_TPI_MARKER_CHECKPOINT: break; case VKTRACE_TPI_MARKER_API_BOUNDARY: break; case VKTRACE_TPI_MARKER_API_GROUP_BEGIN: break; case VKTRACE_TPI_MARKER_API_GROUP_END: break; case VKTRACE_TPI_MARKER_TERMINATE_PROCESS: break; //TODO processing code for all the above cases default: { if (packet->tracer_id >= VKTRACE_MAX_TRACER_ID_ARRAY_SIZE || packet->tracer_id == VKTRACE_TID_RESERVED) { vktrace_LogError("Tracer_id from packet num packet %d invalid.", packet->packet_id); continue; } replayer = replayerArray[packet->tracer_id]; if (replayer == NULL) { vktrace_LogWarning("Tracer_id %d has no valid replayer.", packet->tracer_id); continue; } if (packet->packet_id >= VKTRACE_TPI_BEGIN_API_HERE) { // replay the API packet res = replayer->Replay(replayer->Interpret(packet)); if (res != VKTRACE_REPLAY_SUCCESS) { vktrace_LogError("Failed to replay packet_id %d.",packet->packet_id); return -1; } // frame control logic int frameNumber = replayer->GetFrameNumber(); if (prevFrameNumber != frameNumber) { prevFrameNumber = frameNumber; if (frameNumber == settings.loopStartFrame) { // record the location of looping start packet seq.record_bookmark(); seq.get_bookmark(startingPacket); } if (frameNumber == settings.loopEndFrame) { trace_running = false; } } } else { vktrace_LogError("Bad packet type id=%d, index=%d.", packet->packet_id, packet->global_packet_index); return -1; } } } } settings.numLoops--; seq.set_bookmark(startingPacket); trace_running = true; if (replayer != NULL) { replayer->ResetFrameNumber(); } } return err; }