Chromium Code Reviews| Index: src/gpu/GrTextureParamsAdjuster.cpp |
| diff --git a/src/gpu/GrTextureParamsAdjuster.cpp b/src/gpu/GrTextureParamsAdjuster.cpp |
| index 336ab6b10c4a8f37d9bf96763be57f7144e6c3c7..fd17d2adb47c6b2c8f6f79ed7563951da649eb68 100644 |
| --- a/src/gpu/GrTextureParamsAdjuster.cpp |
| +++ b/src/gpu/GrTextureParamsAdjuster.cpp |
| @@ -133,6 +133,28 @@ GrTextureAdjuster::GrTextureAdjuster(GrTexture* original, |
| } |
| } |
| +GrTexture* GrTextureAdjuster::refCopy(const CopyParams& copyParams) { |
| + GrTexture* texture = this->originalTexture(); |
| + GrContext* context = texture->getContext(); |
| + const SkIRect* contentArea = this->contentAreaOrNull(); |
| + GrUniqueKey key; |
| + this->makeCopyKey(copyParams, &key); |
| + if (key.isValid()) { |
| + GrTexture* cachedCopy = context->textureProvider()->findAndRefTextureByUniqueKey(key); |
| + if (cachedCopy) { |
| + return cachedCopy; |
| + } |
| + } |
| + GrTexture* copy = copy_on_gpu(texture, contentArea, copyParams); |
| + if (copy) { |
| + if (key.isValid()) { |
| + copy->resourcePriv().setUniqueKey(key); |
| + this->didCacheCopy(key); |
| + } |
| + } |
| + return copy; |
| +} |
| + |
| GrTexture* GrTextureAdjuster::refTextureSafeForParams(const GrTextureParams& params, |
| SkIPoint* outOffset) { |
| GrTexture* texture = this->originalTexture(); |
| @@ -146,8 +168,7 @@ GrTexture* GrTextureAdjuster::refTextureSafeForParams(const GrTextureParams& par |
| copyParams.fWidth = contentArea->width(); |
| copyParams.fHeight = contentArea->height(); |
| copyParams.fFilter = GrTextureParams::kBilerp_FilterMode; |
| - } else if (!context->getGpu()->makeCopyForTextureParams(texture->width(), texture->height(), |
| - params, ©Params)) { |
| + } else if (!context->getGpu()->makeCopyForTextureParams(texture, params, ©Params)) { |
| if (outOffset) { |
| if (contentArea) { |
| outOffset->set(contentArea->fLeft, contentArea->fRight); |
| @@ -157,25 +178,12 @@ GrTexture* GrTextureAdjuster::refTextureSafeForParams(const GrTextureParams& par |
| } |
| return SkRef(texture); |
| } |
| - GrUniqueKey key; |
| - this->makeCopyKey(copyParams, &key); |
| - if (key.isValid()) { |
| - GrTexture* result = context->textureProvider()->findAndRefTextureByUniqueKey(key); |
| - if (result) { |
| - return result; |
| - } |
| - } |
| - GrTexture* result = copy_on_gpu(texture, contentArea, copyParams); |
| - if (result) { |
| - if (key.isValid()) { |
| - result->resourcePriv().setUniqueKey(key); |
| - this->didCacheCopy(key); |
| - } |
| - if (outOffset) { |
| - outOffset->set(0, 0); |
| - } |
| + |
| + GrTexture* copy = this->refCopy(copyParams); |
| + if (copy && outOffset) { |
| + outOffset->set(0, 0); |
|
egdaniel
2016/01/19 22:28:06
if we find the key in the cache, we will now end u
bsalomon
2016/01/19 22:37:51
Yes, it's a fix.
|
| } |
| - return result; |
| + return copy; |
| } |
| enum DomainMode { |
| @@ -352,7 +360,7 @@ static const GrFragmentProcessor* create_fp_for_domain_and_filter( |
| return GrBicubicEffect::Create(texture, textureMatrix, domain); |
| } else { |
| static const SkShader::TileMode kClampClamp[] = |
| - { SkShader::kClamp_TileMode, SkShader::kClamp_TileMode }; |
| + { SkShader::kClamp_TileMode, SkShader::kClamp_TileMode }; |
| return GrBicubicEffect::Create(texture, textureMatrix, kClampClamp); |
| } |
| } |
| @@ -378,7 +386,20 @@ const GrFragmentProcessor* GrTextureAdjuster::createFragmentProcessor( |
| } |
| SkRect domain; |
| - GrTexture* texture = this->originalTexture(); |
| + GrTextureParams params; |
| + if (filterOrNullForBicubic) { |
| + params.setFilterMode(*filterOrNullForBicubic); |
| + } |
| + SkAutoTUnref<GrTexture> texture(this->refTextureSafeForParams(params, nullptr)); |
| + if (!texture) { |
| + return nullptr; |
| + } |
| + // If we made a copy then we only copied the contentArea, in which case the new texture is all |
| + // content. |
| + if (texture != this->originalTexture()) { |
| + contentArea = nullptr; |
| + } |
| + |
| DomainMode domainMode = |
| determine_domain_mode(*constraintRect, filterConstraint, coordsLimitedToConstraintRect, |
| texture->width(), texture->height(), |