Index: src/effects/SkMorphologyImageFilter.cpp |
diff --git a/src/effects/SkMorphologyImageFilter.cpp b/src/effects/SkMorphologyImageFilter.cpp |
index 4e08d9dd733148b369105604461332dd09ce534e..546e6f5d93141cecf220cdd7748a78a685a8e8f2 100644 |
--- a/src/effects/SkMorphologyImageFilter.cpp |
+++ b/src/effects/SkMorphologyImageFilter.cpp |
@@ -547,7 +547,8 @@ bool apply_morphology(const SkBitmap& input, |
const SkIRect& rect, |
GrMorphologyEffect::MorphologyType morphType, |
SkISize radius, |
- SkBitmap* dst) { |
+ SkBitmap* dst, |
+ GrTextureProvider::SizeConstraint constraint) { |
SkAutoTUnref<GrTexture> srcTexture(SkRef(input.getTexture())); |
SkASSERT(srcTexture); |
GrContext* context = srcTexture->getContext(); |
@@ -565,7 +566,14 @@ bool apply_morphology(const SkBitmap& input, |
SkIRect srcRect = rect; |
if (radius.fWidth > 0) { |
- GrTexture* scratch = context->textureProvider()->createApproxTexture(desc); |
+ GrTextureProvider::SizeConstraint horiConstraint = constraint; |
+ if (radius.fHeight > 0) { |
+ // Optimization: we will fall through and allocate the "real" texture after this one |
+ // so ours can be approximate (likely faster to allocate) |
+ horiConstraint = GrTextureProvider::kApprox_SizeConstraint; |
+ } |
+ |
+ GrTexture* scratch = context->textureProvider()->createTexture(desc, horiConstraint); |
if (nullptr == scratch) { |
return false; |
} |
@@ -589,7 +597,7 @@ bool apply_morphology(const SkBitmap& input, |
srcRect = dstRect; |
} |
if (radius.fHeight > 0) { |
- GrTexture* scratch = context->textureProvider()->createApproxTexture(desc); |
+ GrTexture* scratch = context->textureProvider()->createTexture(desc, constraint); |
if (nullptr == scratch) { |
return false; |
} |
@@ -647,7 +655,8 @@ bool SkMorphologyImageFilter::filterImageGPUGeneric(bool dilate, |
GrMorphologyEffect::MorphologyType type = dilate ? GrMorphologyEffect::kDilate_MorphologyType |
: GrMorphologyEffect::kErode_MorphologyType; |
- if (!apply_morphology(input, srcBounds, type, SkISize::Make(width, height), result)) { |
+ if (!apply_morphology(input, srcBounds, type, SkISize::Make(width, height), result, |
+ GrTextureProvider::FromImageFilter(ctx.sizeConstraint()))) { |
return false; |
} |
offset->fX = bounds.left(); |