Coverage Report

Created: 2018-09-25 14:53

/src/mozilla-central/gfx/layers/composite/Diagnostics.cpp
Line
Count
Source (jump to first uncovered line)
1
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
3
/* This Source Code Form is subject to the terms of the Mozilla Public
4
 * License, v. 2.0. If a copy of the MPL was not distributed with this
5
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6
7
#include "Diagnostics.h"
8
#include "mozilla/layers/LayersMessages.h"
9
#include "nsPrintfCString.h"
10
11
namespace mozilla {
12
namespace layers {
13
14
float
15
TimedMetric::Average() const
16
0
{
17
0
  // We take at most 2 seconds of history.
18
0
  TimeStamp latest = TimeStamp::Now();
19
0
  float total = 0.0f;
20
0
  size_t count = 0;
21
0
  for (auto iter = mHistory.rbegin(); iter != mHistory.rend(); iter++) {
22
0
    if ((latest - iter->second).ToSeconds() > 2.0f) {
23
0
      break;
24
0
    }
25
0
    total += iter->first;
26
0
    count++;
27
0
  }
28
0
29
0
  if (!count) {
30
0
    return 0.0f;
31
0
  }
32
0
  return total / float(count);
33
0
}
34
35
Diagnostics::Diagnostics()
36
 : mCompositeFps("Compositor"),
37
   mTransactionFps("LayerTransactions")
38
0
{
39
0
}
40
41
void
42
Diagnostics::RecordPaintTimes(const PaintTiming& aPaintTimes)
43
0
{
44
0
  mDlbMs.Add(aPaintTimes.dlMs());
45
0
  mDlb2Ms.Add(aPaintTimes.dl2Ms());
46
0
  mFlbMs.Add(aPaintTimes.flbMs());
47
0
  mRasterMs.Add(aPaintTimes.rasterMs());
48
0
  mSerializeMs.Add(aPaintTimes.serializeMs());
49
0
  mSendMs.Add(aPaintTimes.sendMs());
50
0
}
51
52
std::string
53
Diagnostics::GetFrameOverlayString(const GPUStats& aStats)
54
0
{
55
0
  TimeStamp now = TimeStamp::Now();
56
0
  unsigned fps = unsigned(mCompositeFps.AddFrameAndGetFps(now));
57
0
  unsigned txnFps = unsigned(mTransactionFps.GetFPS(now));
58
0
59
0
  float pixelFillRatio = aStats.mInvalidPixels
60
0
                         ? float(aStats.mPixelsFilled) / float(aStats.mInvalidPixels)
61
0
                         : 0.0f;
62
0
  float screenFillRatio = aStats.mScreenPixels
63
0
                          ? float(aStats.mPixelsFilled) / float(aStats.mScreenPixels)
64
0
                          : 0.0f;
65
0
66
0
  if (aStats.mDrawTime) {
67
0
    mGPUDrawMs.Add(aStats.mDrawTime.value());
68
0
  }
69
0
70
0
  std::string gpuTimeString;
71
0
  if (mGPUDrawMs.Empty()) {
72
0
    gpuTimeString = "N/A";
73
0
  } else {
74
0
    gpuTimeString = nsPrintfCString("%0.1fms", mGPUDrawMs.Average()).get();
75
0
  }
76
0
77
0
  // DL  = nsDisplayListBuilder
78
0
  // FLB = FrameLayerBuilder
79
0
  // R   = ClientLayerManager::EndTransaction
80
0
  // CP  = ShadowLayerForwarder::EndTransaction (txn build)
81
0
  // TX  = LayerTransactionChild::SendUpdate (IPDL serialize+send)
82
0
  // UP  = LayerTransactionParent::RecvUpdate (IPDL deserialize, update, APZ update)
83
0
  // CC_BUILD = Container prepare/composite frame building
84
0
  // CC_EXEC  = Container render/composite drawing
85
0
  nsPrintfCString line1("FPS: %d (TXN: %d)", fps, txnFps);
86
0
  nsPrintfCString line2("[CC] Build: %0.1fms Exec: %0.1fms GPU: %s Fill Ratio: %0.1f/%0.1f",
87
0
    mPrepareMs.Average(),
88
0
    mCompositeMs.Average(),
89
0
    gpuTimeString.c_str(),
90
0
    pixelFillRatio,
91
0
    screenFillRatio);
92
0
  nsCString line3;
93
0
  if (mDlb2Ms.Average() != 0.0f) {
94
0
    line3 += nsPrintfCString("[Content] DL: %0.1f/%0.1fms FLB: %0.1fms Raster: %0.1fms",
95
0
    mDlb2Ms.Average(),
96
0
    mDlbMs.Average(),
97
0
    mFlbMs.Average(),
98
0
    mRasterMs.Average());
99
0
  } else {
100
0
    line3 += nsPrintfCString("[Content] DL: %0.1fms FLB: %0.1fms Raster: %0.1fms",
101
0
    mDlbMs.Average(),
102
0
    mFlbMs.Average(),
103
0
    mRasterMs.Average());
104
0
  }
105
0
  nsPrintfCString line4("[IPDL] Build: %0.1fms Send: %0.1fms Update: %0.1fms",
106
0
    mSerializeMs.Average(),
107
0
    mSendMs.Average(),
108
0
    mUpdateMs.Average());
109
0
110
0
  return std::string(line1.get()) + "\n" +
111
0
         std::string(line2.get()) + "\n" +
112
0
         std::string(line3.get()) + "\n" +
113
0
         std::string(line4.get());
114
0
}
115
116
} // namespace layers
117
} // namespace mozilla