Example #1
0
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;
    }
Example #2
0
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;
}