diff options
-rw-r--r-- | gm/image_pict.cpp | 13 | ||||
-rw-r--r-- | src/core/SkImageCacherator.cpp | 80 | ||||
-rw-r--r-- | src/core/SkImageCacherator.h | 25 | ||||
-rw-r--r-- | src/gpu/GrImageTextureMaker.cpp | 17 | ||||
-rw-r--r-- | src/gpu/GrTextureMaker.cpp | 11 | ||||
-rw-r--r-- | src/image/SkImage_Generator.cpp | 9 |
6 files changed, 79 insertions, 76 deletions
diff --git a/gm/image_pict.cpp b/gm/image_pict.cpp index 792173ce66..883fd34725 100644 --- a/gm/image_pict.cpp +++ b/gm/image_pict.cpp @@ -344,11 +344,12 @@ protected: static void draw_as_tex(SkCanvas* canvas, SkImageCacherator* cache, SkScalar x, SkScalar y) { #if SK_SUPPORT_GPU sk_sp<SkColorSpace> texColorSpace; - sk_sp<GrTextureProxy> proxy( - cache->lockAsTextureProxy(canvas->getGrContext(), GrSamplerParams::ClampBilerp(), - canvas->imageInfo().colorSpace(), &texColorSpace, - nullptr, nullptr)); - if (!proxy) { + // MDB TODO: this should be lockAsTextureRef + sk_sp<GrTexture> texture( + cache->lockAsTexture(canvas->getGrContext(), GrSamplerParams::ClampBilerp(), + canvas->imageInfo().colorSpace(), &texColorSpace, + nullptr, nullptr)); + if (!texture) { // show placeholder if we have no texture SkPaint paint; paint.setStyle(SkPaint::kStroke_Style); @@ -360,6 +361,8 @@ protected: return; } + sk_sp<GrTextureProxy> proxy = GrSurfaceProxy::MakeWrapped(std::move(texture)); + // No API to draw a GrTexture directly, so we cheat and create a private image subclass sk_sp<SkImage> image(new SkImage_Gpu(canvas->getGrContext(), cache->uniqueID(), kPremul_SkAlphaType, diff --git a/src/core/SkImageCacherator.cpp b/src/core/SkImageCacherator.cpp index f0bc9973a6..64b2e62a33 100644 --- a/src/core/SkImageCacherator.cpp +++ b/src/core/SkImageCacherator.cpp @@ -485,12 +485,22 @@ public: } }; +static GrTexture* set_key_and_return(GrResourceProvider* resourceProvider, + GrTexture* tex, const GrUniqueKey& key) { + if (key.isValid()) { + resourceProvider->assignUniqueKeyToTexture(key, tex); + } + return tex; +} + +#if 0 static void set_key_on_proxy(GrResourceProvider* resourceProvider, GrTextureProxy* proxy, const GrUniqueKey& key) { if (key.isValid()) { resourceProvider->assignUniqueKeyToProxy(key, proxy); } } +#endif sk_sp<SkColorSpace> SkImageCacherator::getColorSpace(GrContext* ctx, SkColorSpace* dstColorSpace) { // TODO: This isn't always correct. Picture generator currently produces textures in N32, @@ -510,12 +520,9 @@ sk_sp<SkColorSpace> SkImageCacherator::getColorSpace(GrContext* ctx, SkColorSpac * 4. Ask the generator to return YUV planes, which the GPU can convert * 5. Ask the generator to return RGB(A) data, which the GPU can convert */ -sk_sp<GrTextureProxy> SkImageCacherator::lockTextureProxy(GrContext* ctx, - const GrUniqueKey& origKey, - const SkImage* client, - SkImage::CachingHint chint, - bool willBeMipped, - SkColorSpace* dstColorSpace) { +GrTexture* SkImageCacherator::lockTexture(GrContext* ctx, const GrUniqueKey& origKey, + const SkImage* client, SkImage::CachingHint chint, + bool willBeMipped, SkColorSpace* dstColorSpace) { // Values representing the various texture lock paths we can take. Used for logging the path // taken to a histogram. enum LockTexturePath { @@ -539,10 +546,10 @@ sk_sp<GrTextureProxy> SkImageCacherator::lockTextureProxy(GrContext* ctx, // 1. Check the cache for a pre-existing one if (key.isValid()) { - if (sk_sp<GrTextureProxy> proxy = ctx->resourceProvider()->findProxyByUniqueKey(key)) { + if (GrTexture* tex = ctx->resourceProvider()->findAndRefTextureByUniqueKey(key)) { SK_HISTOGRAM_ENUMERATION("LockTexturePath", kPreExisting_LockTexturePath, kLockTexturePathCount); - return proxy; + return tex; } } @@ -557,8 +564,10 @@ sk_sp<GrTextureProxy> SkImageCacherator::lockTextureProxy(GrContext* ctx, if (sk_sp<GrTextureProxy> proxy = generator->generateTexture(ctx, cacheInfo, fOrigin)) { SK_HISTOGRAM_ENUMERATION("LockTexturePath", kNative_LockTexturePath, kLockTexturePathCount); - set_key_on_proxy(ctx->resourceProvider(), proxy.get(), key); - return proxy; + GrTexture* tex2 = proxy->instantiate(ctx->resourceProvider()); + if (tex2) { + return set_key_and_return(ctx->resourceProvider(), SkRef(tex2), key); + } } } @@ -584,26 +593,27 @@ sk_sp<GrTextureProxy> SkImageCacherator::lockTextureProxy(GrContext* ctx, if (sk_sp<GrTextureProxy> proxy = provider.refAsTextureProxy(ctx, desc, true)) { SK_HISTOGRAM_ENUMERATION("LockTexturePath", kYUV_LockTexturePath, kLockTexturePathCount); - set_key_on_proxy(ctx->resourceProvider(), proxy.get(), key); - return proxy; + GrTexture* tex2 = proxy->instantiate(ctx->resourceProvider()); + if (tex2) { + return set_key_and_return(ctx->resourceProvider(), SkRef(tex2), key); + } } } // 5. Ask the generator to return RGB(A) data, which the GPU can convert SkBitmap bitmap; if (this->tryLockAsBitmap(&bitmap, client, chint, format, cacheInfo)) { - sk_sp<GrTextureProxy> proxy; + GrTexture* tex = nullptr; if (willBeMipped) { - proxy = GrGenerateMipMapsAndUploadToTextureProxy(ctx, bitmap, dstColorSpace); + tex = GrGenerateMipMapsAndUploadToTexture(ctx, bitmap, dstColorSpace); } - if (!proxy) { - proxy = GrUploadBitmapToTextureProxy(ctx->resourceProvider(), bitmap); + if (!tex) { + tex = GrUploadBitmapToTexture(ctx, bitmap); } - if (proxy) { + if (tex) { SK_HISTOGRAM_ENUMERATION("LockTexturePath", kRGBA_LockTexturePath, kLockTexturePathCount); - set_key_on_proxy(ctx->resourceProvider(), proxy.get(), key); - return proxy; + return set_key_and_return(ctx->resourceProvider(), tex, key); } } SK_HISTOGRAM_ENUMERATION("LockTexturePath", kFailure_LockTexturePath, @@ -613,23 +623,29 @@ sk_sp<GrTextureProxy> SkImageCacherator::lockTextureProxy(GrContext* ctx, /////////////////////////////////////////////////////////////////////////////////////////////////// -sk_sp<GrTextureProxy> SkImageCacherator::lockAsTextureProxy(GrContext* ctx, - const GrSamplerParams& params, - SkColorSpace* dstColorSpace, - sk_sp<SkColorSpace>* texColorSpace, - const SkImage* client, - SkScalar scaleAdjust[2], - SkImage::CachingHint chint) { +GrTexture* SkImageCacherator::lockAsTexture(GrContext* ctx, const GrSamplerParams& params, + SkColorSpace* dstColorSpace, + sk_sp<SkColorSpace>* texColorSpace, + const SkImage* client, + SkScalar scaleAdjust[2], + SkImage::CachingHint chint) { if (!ctx) { return nullptr; } - sk_sp<GrTexture> tex(GrImageTextureMaker(ctx, this, client, chint).refTextureForParams( - params, - dstColorSpace, - texColorSpace, - scaleAdjust)); - return GrSurfaceProxy::MakeWrapped(std::move(tex)); + return GrImageTextureMaker(ctx, this, client, chint).refTextureForParams(params, dstColorSpace, + texColorSpace, + scaleAdjust); +} + +#else + +GrTexture* SkImageCacherator::lockAsTexture(GrContext* ctx, const GrSamplerParams&, + SkColorSpace* dstColorSpace, + sk_sp<SkColorSpace>* texColorSpace, + const SkImage* client, + SkScalar scaleAdjust[2], SkImage::CachingHint) { + return nullptr; } #endif diff --git a/src/core/SkImageCacherator.h b/src/core/SkImageCacherator.h index e179236748..38d14d06ec 100644 --- a/src/core/SkImageCacherator.h +++ b/src/core/SkImageCacherator.h @@ -15,7 +15,6 @@ class GrCaps; class GrContext; class GrSamplerParams; -class GrTextureProxy; class GrUniqueKey; class SkBitmap; class SkImage; @@ -52,7 +51,6 @@ public: bool lockAsBitmap(GrContext*, SkBitmap*, const SkImage* client, SkColorSpace* dstColorSpace, SkImage::CachingHint = SkImage::kAllow_CachingHint); -#if SK_SUPPORT_GPU /** * Returns a ref() on the texture produced by this generator. The caller must call unref() * when it is done. Will return nullptr on failure. @@ -60,20 +58,17 @@ public: * If not NULL, the client will be notified (->notifyAddedToCache()) when resources are * added to the cache on its behalf. * - * The caller is responsible for calling proxy->unref() when they are done. + * The caller is responsible for calling texture->unref() when they are done. * * The scaleAdjust in/out parameter will return any scale adjustment that needs * to be applied to the absolute texture coordinates in the case where the image * was resized to meet the sampling requirements (e.g., resized out to the next power of 2). * It can be null if the caller knows resizing will not be required. */ - sk_sp<GrTextureProxy> lockAsTextureProxy(GrContext*, const GrSamplerParams&, - SkColorSpace* dstColorSpace, - sk_sp<SkColorSpace>* texColorSpace, - const SkImage* client, - SkScalar scaleAdjust[2], - SkImage::CachingHint = SkImage::kAllow_CachingHint); -#endif + GrTexture* lockAsTexture(GrContext*, const GrSamplerParams&, SkColorSpace* dstColorSpace, + sk_sp<SkColorSpace>* texColorSpace, const SkImage* client, + SkScalar scaleAdjust[2], + SkImage::CachingHint = SkImage::kAllow_CachingHint); /** * If the underlying src naturally is represented by an encoded blob (in SkData), this returns @@ -134,14 +129,10 @@ private: bool tryLockAsBitmap(SkBitmap*, const SkImage*, SkImage::CachingHint, CachedFormat, const SkImageInfo&); #if SK_SUPPORT_GPU - // Returns the texture proxy. If the cacherator is generating the texture and wants to cache it, + // Returns the texture. If the cacherator is generating the texture and wants to cache it, // it should use the passed in key (if the key is valid). - sk_sp<GrTextureProxy> lockTextureProxy(GrContext*, - const GrUniqueKey& key, - const SkImage* client, - SkImage::CachingHint, - bool willBeMipped, - SkColorSpace* dstColorSpace); + GrTexture* lockTexture(GrContext*, const GrUniqueKey& key, const SkImage* client, + SkImage::CachingHint, bool willBeMipped, SkColorSpace* dstColorSpace); // Returns the color space of the texture that would be returned if you called lockTexture. // Separate code path to allow querying of the color space for textures that cached (even // externally). diff --git a/src/gpu/GrImageTextureMaker.cpp b/src/gpu/GrImageTextureMaker.cpp index 47a2f4f14c..a7fc1a353c 100644 --- a/src/gpu/GrImageTextureMaker.cpp +++ b/src/gpu/GrImageTextureMaker.cpp @@ -32,21 +32,16 @@ GrImageTextureMaker::GrImageTextureMaker(GrContext* context, SkImageCacherator* } GrTexture* GrImageTextureMaker::refOriginalTexture(bool willBeMipped, SkColorSpace* dstColorSpace) { - sk_sp<GrTextureProxy> proxy = fCacher->lockTextureProxy(this->context(), fOriginalKey, - fClient, fCachingHint, willBeMipped, - dstColorSpace); - if (!proxy) { - return nullptr; - } - - sk_sp<GrTexture> tex(SkSafeRef(proxy->instantiate(this->context()->resourceProvider()))); - return tex.release(); + return fCacher->lockTexture(this->context(), fOriginalKey, fClient, fCachingHint, willBeMipped, + dstColorSpace); } sk_sp<GrTextureProxy> GrImageTextureMaker::refOriginalTextureProxy(bool willBeMipped, SkColorSpace* dstColorSpace) { - return fCacher->lockTextureProxy(this->context(), fOriginalKey, fClient, fCachingHint, - willBeMipped, dstColorSpace); + sk_sp<GrTexture> tex(fCacher->lockTexture(this->context(), fOriginalKey, fClient, fCachingHint, + willBeMipped, dstColorSpace)); + + return GrSurfaceProxy::MakeWrapped(std::move(tex)); } void GrImageTextureMaker::makeCopyKey(const CopyParams& stretch, GrUniqueKey* paramsCopyKey, diff --git a/src/gpu/GrTextureMaker.cpp b/src/gpu/GrTextureMaker.cpp index f5ee4d3b68..06a8f27639 100644 --- a/src/gpu/GrTextureMaker.cpp +++ b/src/gpu/GrTextureMaker.cpp @@ -102,16 +102,9 @@ sk_sp<GrFragmentProcessor> GrTextureMaker::createFragmentProcessor( GrTexture* GrTextureMaker::generateTextureForParams(const CopyParams& copyParams, bool willBeMipped, SkColorSpace* dstColorSpace) { - sk_sp<GrTextureProxy> original(this->refOriginalTextureProxy(willBeMipped, dstColorSpace)); + sk_sp<GrTexture> original(this->refOriginalTexture(willBeMipped, dstColorSpace)); if (!original) { return nullptr; } - - sk_sp<GrTextureProxy> copy = CopyOnGpu(fContext, std::move(original), nullptr, copyParams); - if (!copy) { - return nullptr; - } - - sk_sp<GrTexture> tex(SkSafeRef(copy->instantiate(fContext->resourceProvider()))); - return tex.release(); + return CopyOnGpu(original.get(), nullptr, copyParams); } diff --git a/src/image/SkImage_Generator.cpp b/src/image/SkImage_Generator.cpp index 72ef877359..c8bf732aa3 100644 --- a/src/image/SkImage_Generator.cpp +++ b/src/image/SkImage_Generator.cpp @@ -88,8 +88,13 @@ sk_sp<GrTextureProxy> SkImage_Generator::asTextureProxyRef(GrContext* context, SkColorSpace* dstColorSpace, sk_sp<SkColorSpace>* texColorSpace, SkScalar scaleAdjust[2]) const { - return fCache.lockAsTextureProxy(context, params, dstColorSpace, - texColorSpace, this, scaleAdjust); + sk_sp<GrTexture> tex(fCache.lockAsTexture(context, params, dstColorSpace, + texColorSpace, this, scaleAdjust)); + if (!tex) { + return nullptr; + } + + return GrSurfaceProxy::MakeWrapped(std::move(tex)); } #endif |