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) {