diff options
author | 2017-05-08 11:07:42 -0400 | |
---|---|---|
committer | 2017-05-08 15:36:00 +0000 | |
commit | 5bbd076c52a6cebff4a2d63edd027b0f31624287 (patch) | |
tree | 691feeb664b4ef630434d2db0a541b9375e6193c /src/image | |
parent | bb33833ed25c30007e4ea3cd3de6df728407f94e (diff) |
SkImage::isValid
Lets clients know if an image is drawable to a particular GrContext
(or to CPU). Checks for abandoned GrContexts beneath GPU backed
images, as well as context mis-match.
Bug: skia:
Change-Id: Ibe88c7ce8091f965c14f6023a3597be4b70c3f99
Reviewed-on: https://skia-review.googlesource.com/15801
Commit-Queue: Brian Osman <brianosman@google.com>
Reviewed-by: Brian Salomon <bsalomon@google.com>
Diffstat (limited to 'src/image')
-rw-r--r-- | src/image/SkImage.cpp | 14 | ||||
-rw-r--r-- | src/image/SkImage_Base.h | 2 | ||||
-rw-r--r-- | src/image/SkImage_Gpu.cpp | 13 | ||||
-rw-r--r-- | src/image/SkImage_Gpu.h | 2 | ||||
-rw-r--r-- | src/image/SkImage_Lazy.cpp | 7 | ||||
-rw-r--r-- | src/image/SkImage_Raster.cpp | 2 |
6 files changed, 40 insertions, 0 deletions
diff --git a/src/image/SkImage.cpp b/src/image/SkImage.cpp index cbb9a621db..efa16c97a5 100644 --- a/src/image/SkImage.cpp +++ b/src/image/SkImage.cpp @@ -175,6 +175,13 @@ GrBackendObject SkImage::getTextureHandle(bool flushPendingGrContextIO, return as_IB(this)->onGetTextureHandle(flushPendingGrContextIO, origin); } +bool SkImage::isValid(GrContext* context) const { + if (context && context->abandoned()) { + return false; + } + return as_IB(this)->onIsValid(context); +} + #else GrTexture* SkImage::getTexture() const { return nullptr; } @@ -183,6 +190,13 @@ bool SkImage::isTextureBacked() const { return false; } GrBackendObject SkImage::getTextureHandle(bool, GrSurfaceOrigin*) const { return 0; } +bool SkImage::isValid(GrContext* context) const { + if (context) { + return false; + } + return as_IB(this)->onIsValid(context); +} + #endif /////////////////////////////////////////////////////////////////////////////// diff --git a/src/image/SkImage_Base.h b/src/image/SkImage_Base.h index 34f194b61a..64c075daeb 100644 --- a/src/image/SkImage_Base.h +++ b/src/image/SkImage_Base.h @@ -82,6 +82,8 @@ public: fAddedToCache.store(true); } + virtual bool onIsValid(GrContext*) const = 0; + virtual bool onPinAsTexture(GrContext*) const { return false; } virtual void onUnpinAsTexture(GrContext*) const {} diff --git a/src/image/SkImage_Gpu.cpp b/src/image/SkImage_Gpu.cpp index 581841b1d5..dcf4b1cb63 100644 --- a/src/image/SkImage_Gpu.cpp +++ b/src/image/SkImage_Gpu.cpp @@ -943,3 +943,16 @@ sk_sp<SkImage> SkImage_Gpu::onMakeColorSpace(sk_sp<SkColorSpace> colorSpace, SkC std::move(colorSpace), fBudgeted); } + +bool SkImage_Gpu::onIsValid(GrContext* context) const { + // The base class has already checked that context isn't abandoned (if it's not nullptr) + if (fContext->abandoned()) { + return false; + } + + if (context && context != fContext) { + return false; + } + + return true; +} diff --git a/src/image/SkImage_Gpu.h b/src/image/SkImage_Gpu.h index a644ee25be..5c3ed5a1fd 100644 --- a/src/image/SkImage_Gpu.h +++ b/src/image/SkImage_Gpu.h @@ -62,6 +62,8 @@ public: sk_sp<SkImage> onMakeColorSpace(sk_sp<SkColorSpace>, SkColorType, SkTransferFunctionBehavior) const override; + bool onIsValid(GrContext*) const override; + private: GrContext* fContext; sk_sp<GrTextureProxy> fProxy; diff --git a/src/image/SkImage_Lazy.cpp b/src/image/SkImage_Lazy.cpp index 3ee18de9db..4bf61eaa90 100644 --- a/src/image/SkImage_Lazy.cpp +++ b/src/image/SkImage_Lazy.cpp @@ -85,6 +85,8 @@ public: sk_sp<SkImage> onMakeColorSpace(sk_sp<SkColorSpace>, SkColorType, SkTransferFunctionBehavior) const override; + bool onIsValid(GrContext*) const override; + SkImageCacherator* peekCacherator() const override { return const_cast<SkImage_Lazy*>(this); } @@ -549,6 +551,11 @@ bool SkImage_Lazy::getROPixels(SkBitmap* bitmap, SkColorSpace* dstColorSpace, return this->lockAsBitmap(bitmap, chint, cacheFormat, cacheInfo); } +bool SkImage_Lazy::onIsValid(GrContext* context) const { + ScopedGenerator generator(fSharedGenerator); + return generator->isValid(context); +} + /////////////////////////////////////////////////////////////////////////////////////////////////// #if SK_SUPPORT_GPU diff --git a/src/image/SkImage_Raster.cpp b/src/image/SkImage_Raster.cpp index a875fbc045..e0d418a129 100644 --- a/src/image/SkImage_Raster.cpp +++ b/src/image/SkImage_Raster.cpp @@ -115,6 +115,8 @@ public: sk_sp<SkImage> onMakeColorSpace(sk_sp<SkColorSpace>, SkColorType, SkTransferFunctionBehavior) const override; + bool onIsValid(GrContext* context) const override { return true; } + #if SK_SUPPORT_GPU sk_sp<GrTextureProxy> refPinnedTextureProxy(uint32_t* uniqueID) const override; bool onPinAsTexture(GrContext*) const override; |