Skia Filter Quality and Scaling Metrics
authorericrk <ericrk@chromium.org>
Thu, 25 Feb 2016 19:21:57 +0000 (11:21 -0800)
committerCommit bot <commit-bot@chromium.org>
Thu, 25 Feb 2016 19:21:57 +0000 (11:21 -0800)
Adds histogram metrics to log the filter quality and scale factor of
each image draw. To make the data easier to consume, this is broken
down into a number of individual histograms:
- Filter quality across all draw calls
- Scale amount across all draw calls
- Scale amount per filter quality (4 histograms total)

BUG=skia:
GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1686203002

Review URL: https://codereview.chromium.org/1686203002

include/core/SkDevice.h
include/core/SkPostConfig.h
src/core/SkBitmapDevice.cpp
src/core/SkDevice.cpp
src/gpu/SkGpuDevice.cpp
src/gpu/SkGpuDevice_drawTexture.cpp

index 65ec56f902fb87ea9926957db6b099438f90ecba..01bf7f944f449d1d850f708209de6b99a0bb68a7 100644 (file)
@@ -376,6 +376,9 @@ protected:
         return NULL;
     }
 
+    // A helper function used by derived classes to log the scale factor of a bitmap or image draw.
+    static void LogDrawScaleFactor(const SkMatrix&, SkFilterQuality);
+
 private:
     friend class SkCanvas;
     friend struct DeviceCM; //for setMatrixClip
index a7fbba7c787967b5196262800e06bb5efa2f0803..c3255b87681630e0fd7e552bdabebdc2d904d5a8 100644 (file)
 
 //////////////////////////////////////////////////////////////////////
 
+#if defined(SK_HISTOGRAM_ENUMERATION) && defined(SK_HISTOGRAM_BOOLEAN)
+#  define SK_HISTOGRAMS_ENABLED 1
+#else
+#  define SK_HISTOGRAMS_ENABLED 0
+#endif
+
 #ifndef SK_HISTOGRAM_BOOLEAN
 #  define SK_HISTOGRAM_BOOLEAN(name, value)
 #endif
index 8c3c5621814f6b9155036c1412ce9b3a9f5bd7e7..97aed212db0661fabc2abcb7fedb614eb7fd2960 100644 (file)
@@ -247,6 +247,7 @@ void SkBitmapDevice::drawPath(const SkDraw& draw, const SkPath& path,
 
 void SkBitmapDevice::drawBitmap(const SkDraw& draw, const SkBitmap& bitmap,
                                 const SkMatrix& matrix, const SkPaint& paint) {
+    LogDrawScaleFactor(SkMatrix::Concat(*draw.fMatrix, matrix), paint.getFilterQuality());
     draw.drawBitmap(bitmap, matrix, nullptr, paint);
 }
 
@@ -267,6 +268,8 @@ void SkBitmapDevice::drawBitmapRect(const SkDraw& draw, const SkBitmap& bitmap,
     }
     matrix.setRectToRect(tmpSrc, dst, SkMatrix::kFill_ScaleToFit);
 
+    LogDrawScaleFactor(SkMatrix::Concat(*draw.fMatrix, matrix), paint.getFilterQuality());
+
     const SkRect* dstPtr = &dst;
     const SkBitmap* bitmapPtr = &bitmap;
 
index 7adb0f4b3cf4b91173f36867ca3ad6fd04976a43..6b481e8e1cc7ce406dbf64dac8a2fa9f3f8359b1 100644 (file)
@@ -442,3 +442,57 @@ uint32_t SkBaseDevice::filterTextFlags(const SkPaint& paint) const {
     return flags;
 }
 
+//////////////////////////////////////////////////////////////////////////////////////////
+
+void SkBaseDevice::LogDrawScaleFactor(const SkMatrix& matrix, SkFilterQuality filterQuality) {
+#if SK_HISTOGRAMS_ENABLED
+    enum ScaleFactor {
+        kUpscale_ScaleFactor,
+        kNoScale_ScaleFactor,
+        kDownscale_ScaleFactor,
+        kLargeDownscale_ScaleFactor,
+    };
+
+    SkASSERT(filterQuality != kNone_SkFilterQuality);
+    enum { kScaleFactorCount = kLargeDownscale_ScaleFactor + 1 };
+    float rawScaleFactor = matrix.getMinScale();
+
+    ScaleFactor scaleFactor;
+    if (rawScaleFactor < 0.5f) {
+        scaleFactor = kLargeDownscale_ScaleFactor;
+    } else if (rawScaleFactor < 1.0f) {
+        scaleFactor = kDownscale_ScaleFactor;
+    } else if (rawScaleFactor > 1.0f) {
+        scaleFactor = kUpscale_ScaleFactor;
+    } else {
+        scaleFactor = kNoScale_ScaleFactor;
+    }
+
+    switch (filterQuality) {
+        case kNone_SkFilterQuality:
+            SK_HISTOGRAM_ENUMERATION("DrawScaleFactor.NoneFilterQuality", scaleFactor,
+                                     kScaleFactorCount);
+            break;
+        case kLow_SkFilterQuality:
+            SK_HISTOGRAM_ENUMERATION("DrawScaleFactor.LowFilterQuality", scaleFactor,
+                                     kScaleFactorCount);
+            break;
+        case kMedium_SkFilterQuality:
+            SK_HISTOGRAM_ENUMERATION("DrawScaleFactor.MediumFilterQuality", scaleFactor,
+                                     kScaleFactorCount);
+            break;
+        case kHigh_SkFilterQuality:
+            SK_HISTOGRAM_ENUMERATION("DrawScaleFactor.HighFilterQuality", scaleFactor,
+                                     kScaleFactorCount);
+            break;
+    }
+
+    // Also log filter quality independent scale factor.
+    SK_HISTOGRAM_ENUMERATION("DrawScaleFactor.AnyFilterQuality", scaleFactor, kScaleFactorCount);
+
+    // Also log an overall histogram of filter quality.
+    enum { kFilterQualityCount = kHigh_SkFilterQuality + 1 };
+    SK_HISTOGRAM_ENUMERATION("FilterQuality", filterQuality, kFilterQualityCount);
+#endif
+}
+
index b3761e2d7105e9db8797c74de096305435cdc5d8..db249b38f28a218d6ca3cc8845d53c387487554a 100644 (file)
@@ -988,8 +988,9 @@ void SkGpuDevice::drawTiledBitmap(const SkBitmap& bitmap,
                                   bool bicubic) {
     ASSERT_SINGLE_OWNER
 
-    // This is the funnel for all paths that draw tiled bitmaps/images. Log histogram entry.
+    // This is the funnel for all paths that draw tiled bitmaps/images. Log histogram entries.
     SK_HISTOGRAM_BOOLEAN("DrawTiled", true);
+    LogDrawScaleFactor(viewMatrix, origPaint.getFilterQuality());
 
     // The following pixel lock is technically redundant, but it is desirable
     // to lock outside of the tile loop to prevent redecoding the whole image
index 5c5fb124214346841e24b6cef408d78ff8046ac0..f6a5847c5c602b328f9f7ed8cb75e6a30656fd75 100644 (file)
@@ -137,6 +137,9 @@ void SkGpuDevice::drawTextureProducer(GrTextureProducer* producer,
         }
     }
 
+    // Now that we have both the view and srcToDst matrices, log our scale factor.
+    LogDrawScaleFactor(SkMatrix::Concat(viewMatrix, srcToDstMatrix), paint.getFilterQuality());
+
     this->drawTextureProducerImpl(producer, clippedSrcRect, clippedDstRect, constraint, viewMatrix,
                                   srcToDstMatrix, clip, paint);
 }