Ignore:
Timestamp:
May 5, 2011, 5:36:53 AM (14 years ago)
Author:
Dmitry A. Kuminov
Message:

trunk: Merged in qt 4.7.2 sources from branches/vendor/nokia/qt.

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk

  • trunk/tools/qttracereplay/main.cpp

    r651 r846  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
     
    5050    Q_OBJECT
    5151public:
    52     ReplayWidget(const QString &filename);
     52    ReplayWidget(const QString &filename, int from, int to, bool single, int frame);
    5353
    5454    void paintEvent(QPaintEvent *event);
     
    6767
    6868    QList<uint> visibleUpdates;
    69     QList<uint> iterationTimes;
     69
     70    QVector<uint> iterationTimes;
    7071    QString filename;
     72
     73    int from;
     74    int to;
     75
     76    bool single;
     77
     78    int frame;
     79    int currentCommand;
    7180};
    7281
    7382void ReplayWidget::updateRect()
    7483{
    75     if (!visibleUpdates.isEmpty())
     84    if (frame >= 0 && !updates.isEmpty())
     85        update(updates.at(frame));
     86    else if (!visibleUpdates.isEmpty())
    7687        update(updates.at(visibleUpdates.at(currentFrame)));
    7788}
    7889
     90const int singleFrameRepeatsPerCommand = 100;
     91const int singleFrameIterations = 4;
     92
    7993void ReplayWidget::paintEvent(QPaintEvent *)
    8094{
    8195    QPainter p(this);
    8296
     97    QTimer::singleShot(0, this, SLOT(updateRect()));
     98
    8399//    p.setClipRegion(frames.at(currentFrame).updateRegion);
     100
     101    if (frame >= 0) {
     102        int start = buffer.frameStartIndex(frame);
     103        int end = buffer.frameEndIndex(frame);
     104
     105        iterationTimes.resize(end - start);
     106
     107        int saveRestoreStackDepth = buffer.processCommands(&p, start, start + currentCommand);
     108
     109        for (int i = 0; i < saveRestoreStackDepth; ++i)
     110            p.restore();
     111
     112        const int repeats = currentIteration >= 3 ? singleFrameRepeatsPerCommand : 1;
     113
     114        ++currentFrame;
     115        if (currentFrame == repeats) {
     116            currentFrame = 0;
     117            if (currentIteration >= 3) {
     118                iterationTimes[currentCommand - 1] = qMin(iterationTimes[currentCommand - 1], uint(timer.elapsed()));
     119                timer.restart();
     120            }
     121
     122            if (currentIteration >= singleFrameIterations + 3) {
     123                printf(" #    | ms      | description\n");
     124                printf("------+---------+------------------------------------------------------------\n");
     125
     126                qSort(iterationTimes);
     127
     128                int sum = 0;
     129                for (int i = 0; i < iterationTimes.size(); ++i) {
     130                    int delta = iterationTimes.at(i);
     131                    if (i > 0)
     132                        delta -= iterationTimes.at(i-1);
     133                    sum += delta;
     134                    qreal deltaF = delta / qreal(repeats);
     135                    printf("%.5d | %.5f | %s\n", i, deltaF, qPrintable(buffer.commandDescription(start + i)));
     136                }
     137                printf("Total | %.5f | Total frame time\n", sum / qreal(repeats));
     138                deleteLater();
     139                return;
     140            }
     141
     142            if (start + currentCommand >= end) {
     143                currentCommand = 1;
     144                ++currentIteration;
     145                if (currentIteration == 3) {
     146                    timer.start();
     147                    iterationTimes.fill(uint(-1));
     148                }
     149                if (currentIteration >= 3 && currentIteration < singleFrameIterations + 3)
     150                    printf("Profiling iteration %d of %d\n", currentIteration - 2, singleFrameIterations);
     151            } else {
     152                ++currentCommand;
     153            }
     154        }
     155
     156        return;
     157    }
    84158
    85159    buffer.draw(&p, visibleUpdates.at(currentFrame));
     
    89163        currentFrame = 0;
    90164        ++currentIteration;
     165
     166        if (single) {
     167            deleteLater();
     168            return;
     169        }
    91170
    92171        if (currentIteration == 3)
     
    129208        }
    130209    }
    131 
    132     QTimer::singleShot(0, this, SLOT(updateRect()));
    133 }
    134 
    135 void ReplayWidget::resizeEvent(QResizeEvent *event)
     210}
     211
     212void ReplayWidget::resizeEvent(QResizeEvent *)
    136213{
    137214    visibleUpdates.clear();
    138215
    139216    QRect bounds = rect();
    140     for (int i = 0; i < updates.size(); ++i) {
     217
     218    int first = qMax(0, from);
     219    int last = qMin(unsigned(to), unsigned(updates.size()));
     220    for (int i = first; i < last; ++i) {
    141221        if (updates.at(i).intersects(bounds))
    142222            visibleUpdates << i;
    143223    }
    144224
    145     if (visibleUpdates.size() != updates.size())
    146         printf("Warning: skipped %d frames due to limited resolution\n", updates.size() - visibleUpdates.size());
    147 
    148 }
    149 
    150 ReplayWidget::ReplayWidget(const QString &filename_)
     225    int range = last - first;
     226
     227    if (visibleUpdates.size() != range)
     228        printf("Warning: skipped %d frames due to limited resolution\n", range - visibleUpdates.size());
     229
     230}
     231
     232ReplayWidget::ReplayWidget(const QString &filename_, int from_, int to_, bool single_, int frame_)
    151233    : currentFrame(0)
    152234    , currentIteration(0)
    153235    , filename(filename_)
     236    , from(from_)
     237    , to(to_)
     238    , single(single_)
     239    , frame(frame_)
     240    , currentCommand(1)
    154241{
    155242    setWindowTitle(filename);
     
    166253    uint size;
    167254    in.readBytes(data, size);
    168     bool isTraceFile = size == 7 && qstrncmp(data, "qttrace", 7) == 0;
    169     delete [] data;
     255    bool isTraceFile = size >= 7 && qstrncmp(data, "qttrace", 7) == 0;
     256
     257    uint version = 0;
     258    if (size == 9 && qstrncmp(data, "qttraceV2", 9) == 0) {
     259        in.setFloatingPointPrecision(QDataStream::SinglePrecision);
     260        in >> version;
     261    }
     262
    170263    if (!isTraceFile) {
    171264        printf("File '%s' is not a trace file\n", qPrintable(filename_));
     
    174267
    175268    in >> buffer >> updates;
    176     printf("Read paint buffer with %d frames\n", buffer.numFrames());
     269    printf("Read paint buffer version %d with %d frames\n", version, buffer.numFrames());
    177270
    178271    resize(buffer.boundingRect().size().toSize());
     
    190283    if (argc <= 1 || qstrcmp(argv[1], "-h") == 0 || qstrcmp(argv[1], "--help") == 0) {
    191284        printf("Replays a tracefile generated with '-graphicssystem trace'\n");
    192         printf("Usage:\n  > %s [traceFile]\n", argv[0]);
     285        printf("Usage:\n  > %s [OPTIONS] [traceFile]\n", argv[0]);
     286        printf("OPTIONS\n"
     287               "   --range=from-to to specify a frame range.\n"
     288               "   --singlerun to do only one run (without statistics)\n"
     289               "   --instrumentframe=frame to instrument a single frame\n");
    193290        return 1;
    194291    }
    195292
    196     QFile file(argv[1]);
     293    QFile file(app.arguments().last());
    197294    if (!file.exists()) {
    198         printf("%s does not exist\n", argv[1]);
     295        printf("%s does not exist\n", qPrintable(app.arguments().last()));
    199296        return 1;
    200297    }
    201298
    202     ReplayWidget *widget = new ReplayWidget(argv[1]);
     299    bool single = false;
     300
     301    int frame = -1;
     302
     303    int from = 0;
     304    int to = -1;
     305    for (int i = 1; i < app.arguments().size() - 1; ++i) {
     306        QString arg = app.arguments().at(i);
     307        if (arg.startsWith(QLatin1String("--range="))) {
     308            QString rest = arg.mid(8);
     309            QStringList components = rest.split(QLatin1Char('-'));
     310
     311            bool ok1 = false;
     312            bool ok2 = false;
     313            int fromCandidate = 0;
     314            int toCandidate = 0;
     315            if (components.size() == 2) {
     316                fromCandidate = components.first().toInt(&ok1);
     317                toCandidate = components.last().toInt(&ok2);
     318            }
     319
     320            if (ok1 && ok2) {
     321                from = fromCandidate;
     322                to = toCandidate;
     323            } else {
     324                printf("ERROR: malformed syntax in argument %s\n", qPrintable(arg));
     325            }
     326        } else if (arg == QLatin1String("--singlerun")) {
     327            single = true;
     328        } else if (arg.startsWith(QLatin1String("--instrumentframe="))) {
     329            QString rest = arg.mid(18);
     330            bool ok = false;
     331            int frameCandidate = rest.toInt(&ok);
     332            if (ok) {
     333                frame = frameCandidate;
     334            } else {
     335                printf("ERROR: malformed syntax in argument %s\n", qPrintable(arg));
     336            }
     337        } else {
     338            printf("Unrecognized argument: %s\n", qPrintable(arg));
     339            return 1;
     340        }
     341    }
     342
     343    ReplayWidget *widget = new ReplayWidget(app.arguments().last(), from, to, single, frame);
    203344
    204345    if (!widget->updates.isEmpty()) {
Note: See TracChangeset for help on using the changeset viewer.