Make SkGpuBlurUtils take SkTileMode
This is to get ready for moving all of our texture domain
implementation into GrTextureEffect.
This may cause a short term perf regression we might make GrDomainEffect
with unnecessary shader clamping.
Change-Id: I04d9c4c6999539cfd35bda07b943c3b7eb224df8
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/264397
Commit-Queue: Brian Salomon <bsalomon@google.com>
Reviewed-by: Michael Ludwig <michaelludwig@google.com>
diff --git a/src/gpu/effects/GrGaussianConvolutionFragmentProcessor.cpp b/src/gpu/effects/GrGaussianConvolutionFragmentProcessor.cpp
index 9a66a07..35dfcd0 100644
--- a/src/gpu/effects/GrGaussianConvolutionFragmentProcessor.cpp
+++ b/src/gpu/effects/GrGaussianConvolutionFragmentProcessor.cpp
@@ -229,15 +229,49 @@
, fRadius(radius)
, fDirection(direction)
, fMode(mode) {
- // Make sure the sampler's ctor uses the clamp wrap mode
- SkASSERT(fTextureSampler.samplerState().wrapModeX() == GrSamplerState::WrapMode::kClamp &&
- fTextureSampler.samplerState().wrapModeY() == GrSamplerState::WrapMode::kClamp);
this->addCoordTransform(&fCoordTransform);
this->setTextureSamplerCnt(1);
SkASSERT(radius <= kMaxKernelRadius);
fill_in_1D_gaussian_kernel(fKernel, this->width(), gaussianSigma, this->radius());
-
+ // SkGpuBlurUtils is not as aggressive as it once was about avoiding domains. So we check
+ // here if we can omit the domain. TODO: remove this when this effect uses a child to
+ // sample the texture.
+ auto samplerProxy = fTextureSampler.proxy();
+ if (!samplerProxy->isFullyLazy()) {
+ int wh = (fDirection == Direction::kX) ? samplerProxy->backingStoreDimensions().width()
+ : samplerProxy->backingStoreDimensions().height();
+ if (bounds[0] == 0 && bounds[1] == wh) {
+ bool useSampler = false;
+ GrSamplerState::WrapMode samplerMode = GrSamplerState::WrapMode::kClamp;
+ switch (fMode) {
+ case GrTextureDomain::kClamp_Mode:
+ case GrTextureDomain::kIgnore_Mode:
+ useSampler = true;
+ break;
+ case GrTextureDomain::kRepeat_Mode:
+ useSampler = true;
+ samplerMode = GrSamplerState::WrapMode::kRepeat;
+ break;
+ case GrTextureDomain::kMirrorRepeat_Mode:
+ useSampler = true;
+ samplerMode = GrSamplerState::WrapMode::kMirrorRepeat;
+ break;
+ case GrTextureDomain::kDecal_Mode:
+ // Not sure if we support this in HW without having GrCaps here.
+ // Just wait until we replace this with GrTextureEffect.
+ break;
+ }
+ if (useSampler) {
+ fMode = GrTextureDomain::kIgnore_Mode;
+ if (fDirection == Direction::kX) {
+ fTextureSampler.samplerState().setWrapModeX(samplerMode);
+ } else {
+ fTextureSampler.samplerState().setWrapModeY(samplerMode);
+ }
+ }
+ }
+ }
memcpy(fBounds, bounds, sizeof(fBounds));
}