From f2336e4500769bc0ff6a208289d757581b0ea91a Mon Sep 17 00:00:00 2001 From: Greg Daniel Date: Tue, 23 Jan 2018 16:38:14 -0500 Subject: Add lazy proxy's for wrapping backend textures Bug: skia: Change-Id: I3bb557cefc35312adc9515b5683d2ed747bb4eb3 Reviewed-on: https://skia-review.googlesource.com/96862 Commit-Queue: Greg Daniel Reviewed-by: Robert Phillips --- src/gpu/GrProxyProvider.cpp | 51 +++++++++++++++++++++++++++++++++++---------- 1 file changed, 40 insertions(+), 11 deletions(-) (limited to 'src/gpu/GrProxyProvider.cpp') diff --git a/src/gpu/GrProxyProvider.cpp b/src/gpu/GrProxyProvider.cpp index c49f6b8ea0..1267750687 100644 --- a/src/gpu/GrProxyProvider.cpp +++ b/src/gpu/GrProxyProvider.cpp @@ -330,17 +330,46 @@ sk_sp GrProxyProvider::createWrappedTextureProxy( return nullptr; } - sk_sp texture(fResourceProvider->wrapBackendTexture(backendTex, ownership)); - if (!texture) { - return nullptr; - } - if (releaseProc) { - texture->setRelease(releaseProc, releaseCtx); - } - - SkASSERT(!texture->asRenderTarget()); // Strictly a GrTexture - - return this->createWrapped(std::move(texture), origin); + GrSurfaceDesc desc; + desc.fOrigin = origin; + desc.fWidth = backendTex.width(); + desc.fHeight = backendTex.height(); + desc.fConfig = backendTex.config(); + GrMipMapped mipMapped = backendTex.hasMipMaps() ? GrMipMapped::kYes : GrMipMapped::kNo; + + sk_sp proxy = this->createLazyProxy( + [backendTex, ownership, releaseProc, releaseCtx] + (GrResourceProvider* resourceProvider, GrSurfaceOrigin* /*outOrigin*/) { + if (!resourceProvider) { + // This lazy proxy was never initialized. If it has a releaseProc we must call + // it now so that the client knows they can free the underlying backend object. + if (releaseProc) { + releaseProc(releaseCtx); + } + return sk_sp(); + } + + sk_sp tex = resourceProvider->wrapBackendTexture(backendTex, + ownership); + if (!tex) { + return sk_sp(); + } + if (releaseProc) { + tex->setRelease(releaseProc, releaseCtx); + } + SkASSERT(!tex->asRenderTarget()); // Strictly a GrTexture + // Make sure we match how we created the proxy with SkBudgeted::kNo + SkASSERT(SkBudgeted::kNo == tex->resourcePriv().isBudgeted()); + + return tex; + }, desc, mipMapped, SkBackingFit::kExact, SkBudgeted::kNo); + + 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. + proxy->priv().doLazyInstantiation(fResourceProvider); + } + return proxy; } sk_sp GrProxyProvider::createWrappedTextureProxy(const GrBackendTexture& tex, -- cgit v1.2.3