Separate MIP filtering from min/mag filtering.

Does not add kNearest as a mip map mode yet.

Bug: skia:10344

Change-Id: Ida80cbf19e2b1eed5209d0680837fb45e54b4261
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/303481
Commit-Queue: Brian Salomon <bsalomon@google.com>
Reviewed-by: Michael Ludwig <michaelludwig@google.com>
Reviewed-by: Greg Daniel <egdaniel@google.com>
diff --git a/src/gpu/SkGr.cpp b/src/gpu/SkGr.cpp
index 1aaeaec..004c160 100644
--- a/src/gpu/SkGr.cpp
+++ b/src/gpu/SkGr.cpp
@@ -23,6 +23,7 @@
 #include "src/core/SkColorSpacePriv.h"
 #include "src/core/SkImagePriv.h"
 #include "src/core/SkMaskFilterBase.h"
+#include "src/core/SkMatrixPriv.h"
 #include "src/core/SkMessageBus.h"
 #include "src/core/SkMipmap.h"
 #include "src/core/SkPaintPriv.h"
@@ -37,6 +38,7 @@
 #include "src/gpu/GrRecordingContextPriv.h"
 #include "src/gpu/GrTextureProxy.h"
 #include "src/gpu/GrXferProcessor.h"
+#include "src/gpu/SkGr.h"
 #include "src/gpu/effects/GrBicubicEffect.h"
 #include "src/gpu/effects/GrPorterDuffXferProcessor.h"
 #include "src/gpu/effects/GrXfermodeFragmentProcessor.h"
@@ -432,21 +434,25 @@
 
 ////////////////////////////////////////////////////////////////////////////////////////////////
 
-GrSamplerState::Filter GrSkFilterQualityToGrFilterMode(int imageWidth, int imageHeight,
-                                                       SkFilterQuality paintFilterQuality,
-                                                       const SkMatrix& viewM,
-                                                       const SkMatrix& localM,
-                                                       bool sharpenMipmappedTextures,
-                                                       bool* doBicubic) {
-    *doBicubic = false;
-    if (imageWidth <= 1 && imageHeight <= 1) {
-        return GrSamplerState::Filter::kNearest;
+std::tuple<GrSamplerState::Filter,
+           GrSamplerState::MipmapMode,
+           bool /*bicubic*/>
+GrInterpretFilterQuality(SkISize imageDims,
+                         SkFilterQuality paintFilterQuality,
+                         const SkMatrix& viewM,
+                         const SkMatrix& localM,
+                         bool sharpenMipmappedTextures) {
+    using Filter = GrSamplerState::Filter;
+    using MipmapMode = GrSamplerState::MipmapMode;
+    if (imageDims.area() <= 1) {
+        // TOOD: should know we're not in decal mode to do this transformation.
+        return {Filter::kNearest, MipmapMode::kNone, false};
     }
     switch (paintFilterQuality) {
         case kNone_SkFilterQuality:
-            return GrSamplerState::Filter::kNearest;
+            return {Filter::kNearest, MipmapMode::kNone, false};
         case kLow_SkFilterQuality:
-            return GrSamplerState::Filter::kLinear;
+            return {Filter::kLinear, MipmapMode::kNone, false};
         case kMedium_SkFilterQuality: {
             SkMatrix matrix;
             matrix.setConcat(viewM, localM);
@@ -460,18 +466,21 @@
             //        2^0.5/2 = s
             SkScalar mipScale = sharpenMipmappedTextures ? SK_ScalarRoot2Over2 : SK_Scalar1;
             if (matrix.getMinScale() < mipScale) {
-                return GrSamplerState::Filter::kMipMap;
+                return {Filter::kLinear, MipmapMode::kLinear, false};
             } else {
-                // Don't trigger MIP level generation unnecessarily.
-                return GrSamplerState::Filter::kLinear;
+                return {Filter::kLinear, MipmapMode::kNone, false};
             }
         }
         case kHigh_SkFilterQuality: {
             SkMatrix matrix;
             matrix.setConcat(viewM, localM);
-            GrSamplerState::Filter textureFilterMode;
-            *doBicubic = GrBicubicEffect::ShouldUseBicubic(matrix, &textureFilterMode);
-            return textureFilterMode;
+            switch (SkMatrixPriv::AdjustHighQualityFilterLevel(matrix)) {
+                case kNone_SkFilterQuality:   return {Filter::kNearest, MipmapMode::kNone  , false};
+                case kLow_SkFilterQuality:    return {Filter::kLinear , MipmapMode::kNone  , false};
+                case kMedium_SkFilterQuality: return {Filter::kLinear , MipmapMode::kLinear, false};
+                case kHigh_SkFilterQuality:   return {Filter::kNearest, MipmapMode::kNone  , true };
+            }
+            SkUNREACHABLE;
         }
     }
     SkUNREACHABLE;