diff options
Diffstat (limited to 'src/gpu/effects/GrRectBlurEffect.h')
-rw-r--r-- | src/gpu/effects/GrRectBlurEffect.h | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/src/gpu/effects/GrRectBlurEffect.h b/src/gpu/effects/GrRectBlurEffect.h index 47e9dc3851..8307a49bbe 100644 --- a/src/gpu/effects/GrRectBlurEffect.h +++ b/src/gpu/effects/GrRectBlurEffect.h @@ -14,6 +14,7 @@ #include "GrProxyProvider.h" #include "SkBlurMask.h" +#include "SkScalar.h" #include "GrFragmentProcessor.h" #include "GrCoordTransform.h" class GrRectBlurEffect : public GrFragmentProcessor { @@ -63,7 +64,17 @@ public: float sigma() const { return fSigma; } static std::unique_ptr<GrFragmentProcessor> Make(GrProxyProvider* proxyProvider, - const SkRect& rect, float sigma) { + const GrShaderCaps& caps, const SkRect& rect, + float sigma) { + if (!caps.floatIs32Bits()) { + // We promote the rect uniform from half to float when it has large values for + // precision. If we don't have full float then fail. + if (SkScalarAbs(rect.fLeft) > 16000.f || SkScalarAbs(rect.fTop) > 16000.f || + SkScalarAbs(rect.fRight) > 16000.f || SkScalarAbs(rect.fBottom) > 16000.f || + SkScalarAbs(rect.width()) > 16000.f || SkScalarAbs(rect.height()) > 16000.f) { + return nullptr; + } + } int doubleProfileSize = SkScalarCeilToInt(12 * sigma); if (doubleProfileSize >= rect.width() || doubleProfileSize >= rect.height()) { |