diff options
author | Greg Daniel <egdaniel@google.com> | 2017-10-03 13:42:45 +0000 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2017-10-03 13:43:00 +0000 |
commit | 87c76edd2c2247a6d0194a0e511a7bdc259aedf4 (patch) | |
tree | 97d8a144cc8b1e4c02080675828d6df6f8a91414 /src/image/SkImage_Lazy.cpp | |
parent | 862c19675edb26ed7cba56ae6ca9f98c1e4cbef1 (diff) |
Revert "Update lockTextureProxy to return mipped proxys if mipping is requested."
This reverts commit 97abf014b40cc17c4100768299ef8cccd335aff7.
Reason for revert: REALLY Really really really big perf regressions
Original change's description:
> Update lockTextureProxy to return mipped proxys if mipping is requested.
>
> We will either create a new mipped surface from scratch, or just create
> the base layer and copy that into the mipped surface. We then defer the
> creation of the rest of the mips to the GPU.
>
> Bug: skia:
> Change-Id: Ida3000ad5e666153c61b05e714f033138593b09b
> Reviewed-on: https://skia-review.googlesource.com/52743
> Commit-Queue: Greg Daniel <egdaniel@google.com>
> Reviewed-by: Robert Phillips <robertphillips@google.com>
TBR=egdaniel@google.com,robertphillips@google.com,brianosman@google.com
Change-Id: If3b1ff555ef310b75493412a7533175195994684
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Bug: skia:
Reviewed-on: https://skia-review.googlesource.com/54320
Reviewed-by: Greg Daniel <egdaniel@google.com>
Commit-Queue: Greg Daniel <egdaniel@google.com>
Diffstat (limited to 'src/image/SkImage_Lazy.cpp')
-rw-r--r-- | src/image/SkImage_Lazy.cpp | 73 |
1 files changed, 18 insertions, 55 deletions
diff --git a/src/image/SkImage_Lazy.cpp b/src/image/SkImage_Lazy.cpp index c67d4df356..003b28ba98 100644 --- a/src/image/SkImage_Lazy.cpp +++ b/src/image/SkImage_Lazy.cpp @@ -696,17 +696,9 @@ public: }; static void set_key_on_proxy(GrResourceProvider* resourceProvider, - GrTextureProxy* proxy, GrTextureProxy* originalProxy, - const GrUniqueKey& key) { + GrTextureProxy* proxy, const GrUniqueKey& key) { if (key.isValid()) { SkASSERT(proxy->origin() == kTopLeft_GrSurfaceOrigin); - if (originalProxy) { - SkASSERT(proxy->isMipMapped() && !originalProxy->isMipMapped()); - // If we had an originalProxy, that means there already is a proxy in the cache which - // matches the key, but it does not have mip levels and we require them. Thus we must - // remove the unique key from that proxy. - resourceProvider->removeUniqueKeyFromProxy(key, originalProxy); - } resourceProvider->assignUniqueKeyToProxy(key, proxy); } } @@ -759,18 +751,13 @@ sk_sp<GrTextureProxy> SkImage_Lazy::lockTextureProxy(GrContext* ctx, GrUniqueKey key; this->makeCacheKeyFromOrigKey(origKey, format, &key); - sk_sp<GrTextureProxy> proxy; - // 1. Check the cache for a pre-existing one if (key.isValid()) { - proxy = ctx->resourceProvider()->findOrCreateProxyByUniqueKey(key, - kTopLeft_GrSurfaceOrigin); - if (proxy) { + if (sk_sp<GrTextureProxy> proxy = ctx->resourceProvider()->findOrCreateProxyByUniqueKey( + key, kTopLeft_GrSurfaceOrigin)) { SK_HISTOGRAM_ENUMERATION("LockTexturePath", kPreExisting_LockTexturePath, kLockTexturePathCount); - if (!willBeMipped || proxy->isMipMapped()) { - return proxy; - } + return proxy; } } @@ -782,27 +769,23 @@ sk_sp<GrTextureProxy> SkImage_Lazy::lockTextureProxy(GrContext* ctx, SkTransferFunctionBehavior behavior = getGeneratorBehaviorAndInfo(&genPixelsInfo); // 2. Ask the generator to natively create one - if (!proxy) { + { ScopedGenerator generator(fSharedGenerator); if (GrTextureMaker::AllowedTexGenType::kCheap == genType && SkImageGenerator::TexGenType::kCheap != generator->onCanGenerateTexture()) { return nullptr; } - // TODO: Pass a flag into generateTexture which says we want to be mipped. If the generator - // can handle creating a mipped surface, then it can either generate the base layer or all - // the layers directly. Otherwise it just returns a non mipped surface as it currently does. - if ((proxy = generator->generateTexture(ctx, genPixelsInfo, fOrigin, behavior))) { + if (sk_sp<GrTextureProxy> proxy = + generator->generateTexture(ctx, genPixelsInfo, fOrigin, behavior)) { SK_HISTOGRAM_ENUMERATION("LockTexturePath", kNative_LockTexturePath, kLockTexturePathCount); - set_key_on_proxy(ctx->resourceProvider(), proxy.get(), nullptr, key); - if (!willBeMipped || proxy->isMipMapped()) { - return proxy; - } + set_key_on_proxy(ctx->resourceProvider(), proxy.get(), key); + return proxy; } } // 3. Ask the generator to return YUV planes, which the GPU can convert - if (!proxy && !ctx->contextPriv().disableGpuYUVConversion()) { + if (!ctx->contextPriv().disableGpuYUVConversion()) { const GrSurfaceDesc desc = GrImageInfoToSurfaceDesc(cacheInfo, *ctx->caps()); ScopedGenerator generator(fSharedGenerator); Generator_GrYUVProvider provider(generator); @@ -814,53 +797,33 @@ sk_sp<GrTextureProxy> SkImage_Lazy::lockTextureProxy(GrContext* ctx, fSharedGenerator->fGenerator->getInfo().colorSpace(); const SkColorSpace* thisColorSpace = fInfo.colorSpace(); - // TODO: Update to create the mipped surface in the YUV generator and draw the base layer - // directly into the mipped surface. - proxy = provider.refAsTextureProxy(ctx, desc, true, generatorColorSpace, thisColorSpace); + sk_sp<GrTextureProxy> proxy = + provider.refAsTextureProxy(ctx, desc, true, generatorColorSpace, thisColorSpace); if (proxy) { SK_HISTOGRAM_ENUMERATION("LockTexturePath", kYUV_LockTexturePath, kLockTexturePathCount); - set_key_on_proxy(ctx->resourceProvider(), proxy.get(), nullptr, key); - if (!willBeMipped || proxy->isMipMapped()) { - return proxy; - } + set_key_on_proxy(ctx->resourceProvider(), proxy.get(), key); + return proxy; } } // 4. Ask the generator to return RGB(A) data, which the GPU can convert SkBitmap bitmap; - if (!proxy && this->lockAsBitmap(&bitmap, chint, format, genPixelsInfo, behavior)) { + if (this->lockAsBitmap(&bitmap, chint, format, genPixelsInfo, behavior)) { + sk_sp<GrTextureProxy> proxy; if (willBeMipped) { proxy = GrGenerateMipMapsAndUploadToTextureProxy(ctx, bitmap, dstColorSpace); } if (!proxy) { proxy = GrUploadBitmapToTextureProxy(ctx->resourceProvider(), bitmap, dstColorSpace); } - if (proxy && (!willBeMipped || proxy->isMipMapped())) { + if (proxy) { SK_HISTOGRAM_ENUMERATION("LockTexturePath", kRGBA_LockTexturePath, kLockTexturePathCount); - set_key_on_proxy(ctx->resourceProvider(), proxy.get(), nullptr, key); + set_key_on_proxy(ctx->resourceProvider(), proxy.get(), key); return proxy; } } - - if (proxy) { - // We need a mipped proxy, but we either found a proxy earlier that wasn't mipped, generated - // a native non mipped proxy, or generated a non-mipped yuv proxy. Thus we generate a new - // mipped surface and copy the original proxy into the base layer. We will then let the gpu - // generate the rest of the mips. - SkASSERT(willBeMipped); - SkASSERT(!proxy->isMipMapped()); - if (auto mippedProxy = GrCopyBaseMipMapToTextureProxy(ctx, proxy.get(), dstColorSpace)) { - set_key_on_proxy(ctx->resourceProvider(), mippedProxy.get(), proxy.get(), key); - return mippedProxy; - } - // We failed to make a mipped proxy with the base copied into it. This could have - // been from failure to make the proxy or failure to do the copy. Thus we will fall - // back to just using the non mipped proxy; See skbug.com/7094. - return proxy; - } - SK_HISTOGRAM_ENUMERATION("LockTexturePath", kFailure_LockTexturePath, kLockTexturePathCount); return nullptr; |