a77dc69f061b5083b88c8b58f2908c3c495064c4
[WebKit-https.git] / Source / WebCore / platform / graphics / chromium / cc / CCOverdrawMetrics.cpp
1 /*
2  * Copyright (C) 2012 Google Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1.  Redistributions of source code must retain the above copyright
8  *     notice, this list of conditions and the following disclaimer.
9  * 2.  Redistributions in binary form must reproduce the above copyright
10  *     notice, this list of conditions and the following disclaimer in the
11  *     documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
15  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
16  * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
17  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
18  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
19  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
20  * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
21  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
22  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23  */
24
25 #include "config.h"
26
27 #if USE(ACCELERATED_COMPOSITING)
28
29 #include "cc/CCOverdrawMetrics.h"
30
31 #include "FloatQuad.h"
32 #include "IntRect.h"
33 #include "TraceEvent.h"
34 #include "TransformationMatrix.h"
35 #include "cc/CCLayerTreeHost.h"
36 #include "cc/CCLayerTreeHostImpl.h"
37
38 namespace WebCore {
39
40 CCOverdrawMetrics::CCOverdrawMetrics()
41     : m_pixelsDrawnOpaque(0)
42     , m_pixelsDrawnTranslucent(0)
43     , m_pixelsCulled(0)
44 {
45 }
46
47 static inline float wedgeProduct(const FloatPoint& p1, const FloatPoint& p2)
48 {
49     return p1.x() * p2.y() - p1.y() * p2.x();
50 }
51
52 // Computes area of quads that are possibly non-rectangular. Can be easily extended to polygons.
53 static inline float quadArea(const FloatQuad& quad)
54 {
55     return fabs(0.5 * (wedgeProduct(quad.p1(), quad.p2()) +
56                        wedgeProduct(quad.p2(), quad.p3()) +
57                        wedgeProduct(quad.p3(), quad.p4()) +
58                        wedgeProduct(quad.p4(), quad.p1())));
59 }
60
61 void CCOverdrawMetrics::didCull(const TransformationMatrix& transformToTarget, const IntRect& beforeCullRect, const IntRect& afterCullRect)
62 {
63     float beforeCullArea = quadArea(transformToTarget.mapQuad(FloatQuad(beforeCullRect)));
64     float afterCullArea = quadArea(transformToTarget.mapQuad(FloatQuad(afterCullRect)));
65
66     m_pixelsCulled += beforeCullArea - afterCullArea;
67 }
68
69 void CCOverdrawMetrics::didDraw(const TransformationMatrix& transformToTarget, const IntRect& afterCullRect, const IntRect& opaqueRect)
70 {
71     float afterCullArea = quadArea(transformToTarget.mapQuad(FloatQuad(afterCullRect)));
72     float afterCullOpaqueArea = quadArea(transformToTarget.mapQuad(FloatQuad(intersection(opaqueRect, afterCullRect))));
73
74     m_pixelsDrawnOpaque += afterCullOpaqueArea;
75     m_pixelsDrawnTranslucent += afterCullArea - afterCullOpaqueArea;
76 }
77
78 void CCOverdrawMetrics::recordMetrics(const CCLayerTreeHost* layerTreeHost) const
79 {
80     recordMetricsInternal<CCLayerTreeHost>(UPLOADING, layerTreeHost);
81 }
82
83 void CCOverdrawMetrics::recordMetrics(const CCLayerTreeHostImpl* layerTreeHost) const
84 {
85     recordMetricsInternal<CCLayerTreeHostImpl>(DRAWING, layerTreeHost);
86 }
87
88 template<typename LayerTreeHostType>
89 void CCOverdrawMetrics::recordMetricsInternal(MetricsType metricsType, const LayerTreeHostType* layerTreeHost) const
90 {
91     const char* histogramOpaqueName = 0;
92     const char* histogramTranslucentName = 0;
93     const char* histogramCulledName = 0;
94     const char* cullCounterName = 0;
95     const char* opaqueCounterName = 0;
96     const char* translucentCounterName = 0;
97     switch (metricsType) {
98     case DRAWING:
99         histogramOpaqueName = "Renderer4.drawPixelCountOpaque";
100         histogramTranslucentName = "Renderer4.drawPixelCountTranslucent";
101         histogramCulledName = "Renderer4.drawPixelCountCulled";
102         cullCounterName = "DrawPixelsCulled";
103         opaqueCounterName = "PixelsDrawnOpaque";
104         translucentCounterName = "PixelsDrawnTranslucent";
105         break;
106     case UPLOADING:
107         histogramOpaqueName = "Renderer4.uploadPixelCountOpaque";
108         histogramTranslucentName = "Renderer4.uploadPixelCountTranslucent";
109         histogramCulledName = "Renderer4.uploadPixelCountCulled";
110         cullCounterName = "UploadPixelsCulled";
111         opaqueCounterName = "PixelsUploadedOpaque";
112         translucentCounterName = "PixelsUploadedTranslucent";
113         break;
114     }
115     ASSERT(histogramOpaqueName);
116
117     float normalization = 1000.f / (layerTreeHost->viewportSize().width() * layerTreeHost->viewportSize().height());
118     PlatformSupport::histogramCustomCounts(histogramOpaqueName, static_cast<int>(normalization * m_pixelsDrawnOpaque), 100, 1000000, 50);
119     PlatformSupport::histogramCustomCounts(histogramTranslucentName, static_cast<int>(normalization * m_pixelsDrawnTranslucent), 100, 1000000, 50);
120     PlatformSupport::histogramCustomCounts(histogramCulledName, static_cast<int>(normalization * m_pixelsCulled), 100, 1000000, 50);
121
122     TRACE_COUNTER_ID1("webkit", cullCounterName, layerTreeHost, m_pixelsCulled);
123     TRACE_EVENT2("webkit", "CCOverdrawMetrics", opaqueCounterName, m_pixelsDrawnOpaque, translucentCounterName, m_pixelsDrawnTranslucent);
124 }
125
126 } // namespace WebCore
127
128 #endif