diff options
author | Greg Daniel <egdaniel@google.com> | 2018-01-29 09:33:59 -0500 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2018-01-29 15:00:29 +0000 |
commit | 9d86f1d11d1b7a43eb65aed90c437100c2f78f11 (patch) | |
tree | 4d0500d22743a8259df92d4123598367bb059a5a /src/gpu/GrProxyProvider.cpp | |
parent | 26a8d90d3c40385be71b3876ec2cbf6c5397a39c (diff) |
Add createTextureProxy function to ProxyProvider that takes an SkImage
Bug: skia:
Change-Id: I46c66dc5b58839596c639b130f19a57cb85529d6
Reviewed-on: https://skia-review.googlesource.com/99700
Commit-Queue: Greg Daniel <egdaniel@google.com>
Reviewed-by: Robert Phillips <robertphillips@google.com>
Diffstat (limited to 'src/gpu/GrProxyProvider.cpp')
-rw-r--r-- | src/gpu/GrProxyProvider.cpp | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/src/gpu/GrProxyProvider.cpp b/src/gpu/GrProxyProvider.cpp index 7e9c251d33..c492062196 100644 --- a/src/gpu/GrProxyProvider.cpp +++ b/src/gpu/GrProxyProvider.cpp @@ -17,6 +17,9 @@ #include "GrTextureProxyCacheAccess.h" #include "GrTextureRenderTargetProxy.h" #include "../private/GrSingleOwner.h" +#include "SkGr.h" +#include "SkImage.h" +#include "SkImage_Base.h" #include "SkMipMap.h" #define ASSERT_SINGLE_OWNER \ @@ -186,6 +189,49 @@ sk_sp<GrTextureProxy> GrProxyProvider::createTextureProxy(const GrSurfaceDesc& d return this->createProxy(desc, SkBackingFit::kExact, budgeted); } +sk_sp<GrTextureProxy> GrProxyProvider::createTextureProxy(sk_sp<SkImage> srcImage, + GrSurfaceFlags flags, + GrSurfaceOrigin origin, + int sampleCnt, + SkBudgeted budgeted) { + ASSERT_SINGLE_OWNER + SkASSERT(srcImage); + + if (this->isAbandoned()) { + return nullptr; + } + + GrSurfaceDesc desc; + desc.fWidth = srcImage->width(); + desc.fHeight = srcImage->height(); + desc.fFlags = flags; + desc.fOrigin = origin; + desc.fSampleCnt = sampleCnt; + desc.fConfig = SkImageInfo2GrPixelConfig(as_IB(srcImage)->onImageInfo(), *this->caps()); + + sk_sp<GrTextureProxy> proxy = this->createLazyProxy( + [desc, budgeted, srcImage] + (GrResourceProvider* resourceProvider, GrSurfaceOrigin* /*outOrigin*/) { + if (!resourceProvider) { + return sk_sp<GrTexture>(); + } + SkPixmap pixMap; + SkAssertResult(srcImage->peekPixels(&pixMap)); + GrMipLevel mipLevel = { pixMap.addr(), pixMap.rowBytes() }; + + return resourceProvider->createTexture(desc, budgeted, mipLevel); + }, desc, GrMipMapped::kNo, SkBackingFit::kExact, budgeted); + + if (fResourceProvider) { + // In order to reuse code we always create a lazy proxy. When we aren't in DDL mode however + // we're better off instantiating the proxy immediately here. + if (!proxy->priv().doLazyInstantiation(fResourceProvider)) { + return nullptr; + } + } + return proxy; +} + sk_sp<GrTextureProxy> GrProxyProvider::createMipMapProxy( const GrSurfaceDesc& desc, SkBudgeted budgeted, const GrMipLevel texels[], int mipLevelCount, |