aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar Brian Osman <brianosman@google.com>2017-05-08 11:07:42 -0400
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-05-08 15:36:00 +0000
commit5bbd076c52a6cebff4a2d63edd027b0f31624287 (patch)
tree691feeb664b4ef630434d2db0a541b9375e6193c /src
parentbb33833ed25c30007e4ea3cd3de6df728407f94e (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')
-rw-r--r--src/core/SkImageGenerator.cpp4
-rw-r--r--src/image/SkImage.cpp14
-rw-r--r--src/image/SkImage_Base.h2
-rw-r--r--src/image/SkImage_Gpu.cpp13
-rw-r--r--src/image/SkImage_Gpu.h2
-rw-r--r--src/image/SkImage_Lazy.cpp7
-rw-r--r--src/image/SkImage_Raster.cpp2
7 files changed, 44 insertions, 0 deletions
diff --git a/src/core/SkImageGenerator.cpp b/src/core/SkImageGenerator.cpp
index 6e71ce2023..fe9bb0089b 100644
--- a/src/core/SkImageGenerator.cpp
+++ b/src/core/SkImageGenerator.cpp
@@ -115,6 +115,10 @@ bool SkImageGenerator::onGetPixels(const SkImageInfo& info, void* dst, size_t rb
return false;
}
+bool SkImageGenerator::onIsValid(GrContext*) const {
+ return true;
+}
+
///////////////////////////////////////////////////////////////////////////////////////////////////
#include "SkBitmap.h"
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;