aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar Brian Osman <brianosman@google.com>2017-11-07 10:37:00 -0500
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-11-07 15:59:38 +0000
commit63bc48d09323a62c8c67237fc66ad6ec7105e973 (patch)
tree465e2fafce0cdf0763de0aa28f3e42e283cf2deb /src
parent14efcbf3497e6a280cc141e6dec179b4ad4565af (diff)
Add MakeCrossContextFromPixmap
This operates just like MakeCrossContextFromEncoded, but starting from raster data. This version is defensive (always uses copies if a raster image needs to be made). Bug: skia: Change-Id: Ibc2b9a235c89a41fbbfd022d943f15ac212d0677 Reviewed-on: https://skia-review.googlesource.com/68205 Reviewed-by: Brian Salomon <bsalomon@google.com> Commit-Queue: Brian Osman <brianosman@google.com>
Diffstat (limited to 'src')
-rw-r--r--src/image/SkImage_Gpu.cpp35
1 files changed, 35 insertions, 0 deletions
diff --git a/src/image/SkImage_Gpu.cpp b/src/image/SkImage_Gpu.cpp
index d279188f44..b829f64694 100644
--- a/src/image/SkImage_Gpu.cpp
+++ b/src/image/SkImage_Gpu.cpp
@@ -508,6 +508,41 @@ sk_sp<SkImage> SkImage::MakeCrossContextFromEncoded(GrContext* context, sk_sp<Sk
return SkImage::MakeFromGenerator(std::move(gen));
}
+sk_sp<SkImage> SkImage::MakeCrossContextFromPixmap(GrContext* context, const SkPixmap& pixmap,
+ bool buildMips, SkColorSpace* dstColorSpace) {
+ // Some backends or drivers don't support (safely) moving resources between contexts
+ if (!context || !context->caps()->crossContextTextureSupport()) {
+ return SkImage::MakeRasterCopy(pixmap);
+ }
+
+ // Turn the pixmap into a GrTextureProxy
+ sk_sp<GrTextureProxy> proxy;
+ if (buildMips) {
+ SkBitmap bmp;
+ bmp.installPixels(pixmap);
+ proxy = GrGenerateMipMapsAndUploadToTextureProxy(context, bmp, dstColorSpace);
+ } else {
+ proxy = GrUploadPixmapToTextureProxy(context->resourceProvider(), pixmap, SkBudgeted::kYes,
+ dstColorSpace);
+ }
+
+ if (!proxy) {
+ return SkImage::MakeRasterCopy(pixmap);
+ }
+
+ sk_sp<GrTexture> texture = sk_ref_sp(proxy->priv().peekTexture());
+
+ // Flush any writes or uploads
+ context->contextPriv().prepareSurfaceForExternalIO(proxy.get());
+
+ sk_sp<GrSemaphore> sema = context->getGpu()->prepareTextureForCrossContextUsage(texture.get());
+
+ auto gen = GrBackendTextureImageGenerator::Make(std::move(texture), proxy->origin(),
+ std::move(sema), pixmap.alphaType(),
+ pixmap.info().refColorSpace());
+ return SkImage::MakeFromGenerator(std::move(gen));
+}
+
#if defined(SK_BUILD_FOR_ANDROID) && __ANDROID_API__ >= 26
sk_sp<SkImage> SkImage::MakeFromAHardwareBuffer(AHardwareBuffer* graphicBuffer, SkAlphaType at,
sk_sp<SkColorSpace> cs) {