Rework GrSamplerParams to be more compact and use its own wrap mode enum.

The main change is to make GrSamplerParams smaller by making its enums have byte-sized underlying types. The rest is cosmetic.

Change-Id: Ib71ea50612d24619a85e463826c6b8dfb9b445e3
Reviewed-on: https://skia-review.googlesource.com/43200
Commit-Queue: Brian Salomon <bsalomon@google.com>
Reviewed-by: Greg Daniel <egdaniel@google.com>
diff --git a/src/shaders/SkImageShader.cpp b/src/shaders/SkImageShader.cpp
index f5756fe..ded75d4 100644
--- a/src/shaders/SkImageShader.cpp
+++ b/src/shaders/SkImageShader.cpp
@@ -171,6 +171,19 @@
 #include "effects/GrBicubicEffect.h"
 #include "effects/GrSimpleTextureEffect.h"
 
+static GrSamplerState::WrapMode tile_mode_to_wrap_mode(const SkShader::TileMode tileMode) {
+    switch (tileMode) {
+        case SkShader::TileMode::kClamp_TileMode:
+            return GrSamplerState::WrapMode::kClamp;
+        case SkShader::TileMode::kRepeat_TileMode:
+            return GrSamplerState::WrapMode::kRepeat;
+        case SkShader::TileMode::kMirror_TileMode:
+            return GrSamplerState::WrapMode::kMirrorRepeat;
+    }
+    SK_ABORT("Unknown tile mode.");
+    return GrSamplerState::WrapMode::kClamp;
+}
+
 std::unique_ptr<GrFragmentProcessor> SkImageShader::asFragmentProcessor(
         const AsFPArgs& args) const {
     SkMatrix lmInverse;
@@ -185,22 +198,21 @@
         lmInverse.postConcat(inv);
     }
 
-    SkShader::TileMode tm[] = { fTileModeX, fTileModeY };
+    GrSamplerState::WrapMode wrapModes[] = {tile_mode_to_wrap_mode(fTileModeX),
+                                            tile_mode_to_wrap_mode(fTileModeY)};
 
     // Must set wrap and filter on the sampler before requesting a texture. In two places below
     // we check the matrix scale factors to determine how to interpret the filter quality setting.
     // This completely ignores the complexity of the drawVertices case where explicit local coords
     // are provided by the caller.
     bool doBicubic;
-    GrSamplerParams::FilterMode textureFilterMode =
-    GrSkFilterQualityToGrFilterMode(args.fFilterQuality, *args.fViewMatrix, this->getLocalMatrix(),
-                                    &doBicubic);
-    GrSamplerParams params(tm, textureFilterMode);
+    GrSamplerState::Filter textureFilterMode = GrSkFilterQualityToGrFilterMode(
+            args.fFilterQuality, *args.fViewMatrix, this->getLocalMatrix(), &doBicubic);
+    GrSamplerState samplerState(wrapModes, textureFilterMode);
     sk_sp<SkColorSpace> texColorSpace;
     SkScalar scaleAdjust[2] = { 1.0f, 1.0f };
-    sk_sp<GrTextureProxy> proxy(as_IB(fImage)->asTextureProxyRef(args.fContext, params,
-                                                                 args.fDstColorSpace,
-                                                                 &texColorSpace, scaleAdjust));
+    sk_sp<GrTextureProxy> proxy(as_IB(fImage)->asTextureProxyRef(
+            args.fContext, samplerState, args.fDstColorSpace, &texColorSpace, scaleAdjust));
     if (!proxy) {
         return nullptr;
     }
@@ -213,11 +225,11 @@
                                                                        args.fDstColorSpace);
     std::unique_ptr<GrFragmentProcessor> inner;
     if (doBicubic) {
-        inner = GrBicubicEffect::Make(std::move(proxy),
-                                      std::move(colorSpaceXform), lmInverse, tm);
+        inner = GrBicubicEffect::Make(std::move(proxy), std::move(colorSpaceXform), lmInverse,
+                                      wrapModes);
     } else {
-        inner = GrSimpleTextureEffect::Make(std::move(proxy),
-                                            std::move(colorSpaceXform), lmInverse, params);
+        inner = GrSimpleTextureEffect::Make(std::move(proxy), std::move(colorSpaceXform), lmInverse,
+                                            samplerState);
     }
 
     if (isAlphaOnly) {
diff --git a/src/shaders/SkPerlinNoiseShader.cpp b/src/shaders/SkPerlinNoiseShader.cpp
index cc9a569..0d951cd 100644
--- a/src/shaders/SkPerlinNoiseShader.cpp
+++ b/src/shaders/SkPerlinNoiseShader.cpp
@@ -1412,8 +1412,8 @@
     m.setTranslateY(-localMatrix.getTranslateY() + SK_Scalar1);
 
     if (fType == kImprovedNoise_Type) {
-        GrSamplerParams textureParams(SkShader::TileMode::kRepeat_TileMode,
-                                      GrSamplerParams::FilterMode::kNone_FilterMode);
+        GrSamplerState textureParams(GrSamplerState::WrapMode::kRepeat,
+                                     GrSamplerState::Filter::kNearest);
         sk_sp<GrTextureProxy> permutationsTexture(
             GrRefCachedBitmapTextureProxy(args.fContext,
                                           paintingData->getImprovedPermutationsBitmap(),
diff --git a/src/shaders/gradients/SkGradientShader.cpp b/src/shaders/gradients/SkGradientShader.cpp
index 4eb68c9..64d3b48 100644
--- a/src/shaders/gradients/SkGradientShader.cpp
+++ b/src/shaders/gradients/SkGradientShader.cpp
@@ -1530,12 +1530,16 @@
         key |= kHardStopZeroOneOneKey;
     }
 
-    if (SkShader::TileMode::kClamp_TileMode == e.fTileMode) {
-        key |= kClampTileMode;
-    } else if (SkShader::TileMode::kRepeat_TileMode == e.fTileMode) {
-        key |= kRepeatTileMode;
-    } else {
-        key |= kMirrorTileMode;
+    switch (e.fWrapMode) {
+        case GrSamplerState::WrapMode::kClamp:
+            key |= kClampTileMode;
+            break;
+        case GrSamplerState::WrapMode::kRepeat:
+            key |= kRepeatTileMode;
+            break;
+        case GrSamplerState::WrapMode::kMirrorRepeat:
+            key |= kMirrorTileMode;
+            break;
     }
 
     key |= GrColorSpaceXform::XformKey(e.fColorSpaceXform.get()) << kReservedBits;
@@ -1551,17 +1555,17 @@
                                                           const char* outputColor,
                                                           const char* inputColor) {
     // First, apply tiling rules.
-    switch (ge.fTileMode) {
-    case SkShader::kClamp_TileMode:
-        fragBuilder->codeAppendf("float clamp_t = clamp(%s, 0.0, 1.0);", t);
-        break;
-    case SkShader::kRepeat_TileMode:
-        fragBuilder->codeAppendf("float clamp_t = fract(%s);", t);
-        break;
-    case SkShader::kMirror_TileMode:
-        fragBuilder->codeAppendf("float t_1 = %s - 1.0;", t);
-        fragBuilder->codeAppendf("float clamp_t = abs(t_1 - 2.0 * floor(t_1 * 0.5) - 1.0);");
-        break;
+    switch (ge.fWrapMode) {
+        case GrSamplerState::WrapMode::kClamp:
+            fragBuilder->codeAppendf("float clamp_t = clamp(%s, 0.0, 1.0);", t);
+            break;
+        case GrSamplerState::WrapMode::kRepeat:
+            fragBuilder->codeAppendf("float clamp_t = fract(%s);", t);
+            break;
+        case GrSamplerState::WrapMode::kMirrorRepeat:
+            fragBuilder->codeAppendf("float t_1 = %s - 1.0;", t);
+            fragBuilder->codeAppendf("float clamp_t = abs(t_1 - 2.0 * floor(t_1 * 0.5) - 1.0);");
+            break;
     }
 
     // Calculate the color.
@@ -1589,7 +1593,7 @@
         case kHardStopLeftEdged_ColorType: {
             fragBuilder->codeAppendf("float4 colorTemp = mix(%s[1], %s[2], clamp_t);", colors,
                                      colors);
-            if (SkShader::kClamp_TileMode == ge.fTileMode) {
+            if (GrSamplerState::WrapMode::kClamp == ge.fWrapMode) {
                 fragBuilder->codeAppendf("if (%s < 0.0) {", t);
                 fragBuilder->codeAppendf("    colorTemp = %s[0];", colors);
                 fragBuilder->codeAppendf("}");
@@ -1601,7 +1605,7 @@
         case kHardStopRightEdged_ColorType: {
             fragBuilder->codeAppendf("float4 colorTemp = mix(%s[0], %s[1], clamp_t);", colors,
                                      colors);
-            if (SkShader::kClamp_TileMode == ge.fTileMode) {
+            if (GrSamplerState::WrapMode::kClamp == ge.fWrapMode) {
                 fragBuilder->codeAppendf("if (%s > 1.0) {", t);
                 fragBuilder->codeAppendf("    colorTemp = %s[2];", colors);
                 fragBuilder->codeAppendf("}");
@@ -1705,7 +1709,7 @@
         }
     }
 
-    fTileMode = args.fTileMode;
+    fWrapMode = args.fWrapMode;
 
     switch (fColorType) {
         // The two and three color specializations do not currently support tiling.
@@ -1760,18 +1764,16 @@
 
             // We always filter the gradient table. Each table is one row of a texture, always
             // y-clamp.
-            GrSamplerParams params;
-            params.setFilterMode(GrSamplerParams::kBilerp_FilterMode);
-            params.setTileModeX(args.fTileMode);
+            GrSamplerState samplerState(args.fWrapMode, GrSamplerState::Filter::kBilerp);
 
             fRow = fAtlas->lockRow(bitmap);
             if (-1 != fRow) {
                 fYCoord = fAtlas->getYOffset(fRow)+SK_ScalarHalf*fAtlas->getNormalizedTexelHeight();
                 // This is 1/2 places where auto-normalization is disabled
                 fCoordTransform.reset(*args.fMatrix, fAtlas->asTextureProxyRef().get(), false);
-                fTextureSampler.reset(fAtlas->asTextureProxyRef(), params);
+                fTextureSampler.reset(fAtlas->asTextureProxyRef(), samplerState);
             } else {
-                // In this instance we know the params are:
+                // In this instance we know the samplerState state is:
                 //   clampY, bilerp
                 // and the proxy is:
                 //   exact fit, power of two in both dimensions
@@ -1787,7 +1789,7 @@
                 }
                 // This is 2/2 places where auto-normalization is disabled
                 fCoordTransform.reset(*args.fMatrix, proxy.get(), false);
-                fTextureSampler.reset(std::move(proxy), params);
+                fTextureSampler.reset(std::move(proxy), samplerState);
                 fYCoord = SK_ScalarHalf;
             }
 
@@ -1805,7 +1807,7 @@
         , fColors4f(that.fColors4f)
         , fColorSpaceXform(that.fColorSpaceXform)
         , fPositions(that.fPositions)
-        , fTileMode(that.fTileMode)
+        , fWrapMode(that.fWrapMode)
         , fCoordTransform(that.fCoordTransform)
         , fTextureSampler(that.fTextureSampler)
         , fYCoord(that.fYCoord)
@@ -1832,7 +1834,7 @@
 bool GrGradientEffect::onIsEqual(const GrFragmentProcessor& processor) const {
     const GrGradientEffect& ge = processor.cast<GrGradientEffect>();
 
-    if (fTileMode != ge.fTileMode || fColorType != ge.getColorType()) {
+    if (fWrapMode != ge.fWrapMode || fColorType != ge.getColorType()) {
         return false;
     }
     SkASSERT(this->useAtlas() == ge.useAtlas());
diff --git a/src/shaders/gradients/SkGradientShaderPriv.h b/src/shaders/gradients/SkGradientShaderPriv.h
index 6d7c1b8..97c1e84 100644
--- a/src/shaders/gradients/SkGradientShaderPriv.h
+++ b/src/shaders/gradients/SkGradientShaderPriv.h
@@ -340,17 +340,41 @@
                    SkShader::TileMode tileMode,
                    sk_sp<GrColorSpaceXform> colorSpaceXform,
                    bool gammaCorrect)
-            : fContext(context)
-            , fShader(shader)
-            , fMatrix(matrix)
-            , fTileMode(tileMode)
-            , fColorSpaceXform(std::move(colorSpaceXform))
-            , fGammaCorrect(gammaCorrect) {}
+                : fContext(context)
+                , fShader(shader)
+                , fMatrix(matrix)
+                , fColorSpaceXform(std::move(colorSpaceXform))
+                , fGammaCorrect(gammaCorrect) {
+            switch (tileMode) {
+                case SkShader::kClamp_TileMode:
+                    fWrapMode = GrSamplerState::WrapMode::kClamp;
+                    break;
+                case SkShader::kRepeat_TileMode:
+                    fWrapMode = GrSamplerState::WrapMode::kRepeat;
+                    break;
+                case SkShader::kMirror_TileMode:
+                    fWrapMode = GrSamplerState::WrapMode::kMirrorRepeat;
+                    break;
+            }
+        }
+
+        CreateArgs(GrContext* context,
+                   const SkGradientShaderBase* shader,
+                   const SkMatrix* matrix,
+                   GrSamplerState::WrapMode wrapMode,
+                   sk_sp<GrColorSpaceXform> colorSpaceXform,
+                   bool gammaCorrect)
+                : fContext(context)
+                , fShader(shader)
+                , fMatrix(matrix)
+                , fWrapMode(wrapMode)
+                , fColorSpaceXform(std::move(colorSpaceXform))
+                , fGammaCorrect(gammaCorrect) {}
 
         GrContext*                  fContext;
         const SkGradientShaderBase* fShader;
         const SkMatrix*             fMatrix;
-        SkShader::TileMode          fTileMode;
+        GrSamplerState::WrapMode    fWrapMode;
         sk_sp<GrColorSpaceXform>    fColorSpaceXform;
         bool                        fGammaCorrect;
     };
@@ -442,13 +466,13 @@
 
     // If we're in legacy mode, then fColors will be populated. If we're gamma-correct, then
     // fColors4f and fColorSpaceXform will be populated.
-    SkTDArray<SkColor>       fColors;
+    SkTDArray<SkColor> fColors;
 
-    SkTDArray<SkColor4f>     fColors4f;
+    SkTDArray<SkColor4f> fColors4f;
     sk_sp<GrColorSpaceXform> fColorSpaceXform;
 
-    SkTDArray<SkScalar>      fPositions;
-    SkShader::TileMode       fTileMode;
+    SkTDArray<SkScalar> fPositions;
+    GrSamplerState::WrapMode fWrapMode;
 
     GrCoordTransform fCoordTransform;
     TextureSampler fTextureSampler;
diff --git a/src/shaders/gradients/SkTwoPointConicalGradient_gpu.cpp b/src/shaders/gradients/SkTwoPointConicalGradient_gpu.cpp
index caada92..b58ac2a 100644
--- a/src/shaders/gradients/SkTwoPointConicalGradient_gpu.cpp
+++ b/src/shaders/gradients/SkTwoPointConicalGradient_gpu.cpp
@@ -1356,7 +1356,7 @@
         matrix.postConcat(inv);
     }
 
-    GrGradientEffect::CreateArgs newArgs(args.fContext, args.fShader, &matrix, args.fTileMode,
+    GrGradientEffect::CreateArgs newArgs(args.fContext, args.fShader, &matrix, args.fWrapMode,
                                          std::move(args.fColorSpaceXform), args.fGammaCorrect);
 
     if (shader.getStartRadius() < kErrorTol) {