diff options
author | 2018-02-21 11:36:53 -0500 | |
---|---|---|
committer | 2018-02-21 17:13:32 +0000 | |
commit | f87651e7b8c54569ace96ce9bf1671d5401eb91c (patch) | |
tree | 1e138bb9b90f4fd1f45855fb78506a5a465d8d8f /src/gpu/GrProxyProvider.cpp | |
parent | 2388866c8de62a9f9422125e2df40a8cf21727c6 (diff) |
Update createWrappedRenderTargetProxy with BackendTex to use lazy proxies
Bug: skia:
Change-Id: I5a5519aebe544cb5ef62e9847c3fa4e218f24aea
Reviewed-on: https://skia-review.googlesource.com/108561
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 | 73 |
1 files changed, 64 insertions, 9 deletions
diff --git a/src/gpu/GrProxyProvider.cpp b/src/gpu/GrProxyProvider.cpp index 09298abd79..724bda5a9c 100644 --- a/src/gpu/GrProxyProvider.cpp +++ b/src/gpu/GrProxyProvider.cpp @@ -211,6 +211,16 @@ sk_sp<GrTextureProxy> GrProxyProvider::createTextureProxy(sk_sp<SkImage> srcImag return nullptr; } + GrPixelConfig config = SkImageInfo2GrPixelConfig(as_IB(srcImage)->onImageInfo(), + *this->caps()); + + if (SkToBool(flags & kRenderTarget_GrSurfaceFlag)) { + sampleCnt = this->caps()->getRenderTargetSampleCount(sampleCnt, config); + if (!sampleCnt) { + return nullptr; + } + } + GrRenderTargetFlags renderTargetFlags = GrRenderTargetFlags::kNone; if (SkToBool(flags & kRenderTarget_GrSurfaceFlag)) { if (fCaps->usesMixedSamples() && sampleCnt > 1) { @@ -227,7 +237,7 @@ sk_sp<GrTextureProxy> GrProxyProvider::createTextureProxy(sk_sp<SkImage> srcImag desc.fFlags = flags; desc.fOrigin = origin; desc.fSampleCnt = sampleCnt; - desc.fConfig = SkImageInfo2GrPixelConfig(as_IB(srcImage)->onImageInfo(), *this->caps()); + desc.fConfig = config; sk_sp<GrTextureProxy> proxy = this->createLazyProxy( [desc, budgeted, srcImage, fit] @@ -451,6 +461,9 @@ sk_sp<GrTextureProxy> GrProxyProvider::createWrappedTextureProxy(const GrBackend } sampleCnt = this->caps()->getRenderTargetSampleCount(sampleCnt, backendTex.config()); + if (!sampleCnt) { + return nullptr; + } GrSurfaceDesc desc; desc.fOrigin = origin; @@ -549,21 +562,63 @@ sk_sp<GrSurfaceProxy> GrProxyProvider::createWrappedRenderTargetProxy( return proxy; } -sk_sp<GrSurfaceProxy> GrProxyProvider::createWrappedRenderTargetProxy(const GrBackendTexture& tex, - GrSurfaceOrigin origin, - int sampleCnt) { +sk_sp<GrSurfaceProxy> GrProxyProvider::createWrappedRenderTargetProxy( + const GrBackendTexture& backendTex, + GrSurfaceOrigin origin, + int sampleCnt) { if (this->isAbandoned()) { return nullptr; } - sk_sp<GrRenderTarget> rt(fResourceProvider->wrapBackendTextureAsRenderTarget(tex, sampleCnt)); - if (!rt) { + sampleCnt = this->caps()->getRenderTargetSampleCount(sampleCnt, backendTex.config()); + if (!sampleCnt) { return nullptr; } - SkASSERT(!rt->asTexture()); // Strictly a GrRenderTarget - SkASSERT(!rt->getUniqueKey().isValid()); - return sk_sp<GrSurfaceProxy>(new GrRenderTargetProxy(std::move(rt), origin)); + GrSurfaceDesc desc; + desc.fOrigin = origin; + desc.fWidth = backendTex.width(); + desc.fHeight = backendTex.height(); + desc.fConfig = backendTex.config(); + desc.fFlags = kRenderTarget_GrSurfaceFlag; + desc.fSampleCnt = sampleCnt; + + GrRenderTargetFlags renderTargetFlags = GrRenderTargetFlags::kNone; + if (fCaps->usesMixedSamples() && sampleCnt > 1) { + renderTargetFlags |= GrRenderTargetFlags::kMixedSampled; + } + if (fCaps->maxWindowRectangles() > 0) { + renderTargetFlags |= GrRenderTargetFlags::kWindowRectsSupport; + } + + sk_sp<GrRenderTargetProxy> proxy = this->createLazyRenderTargetProxy( + [backendTex, sampleCnt] (GrResourceProvider* resourceProvider) { + if (!resourceProvider) { + return sk_sp<GrRenderTarget>(); + } + + sk_sp<GrRenderTarget> rt = resourceProvider->wrapBackendTextureAsRenderTarget( + backendTex, sampleCnt); + if (!rt) { + return sk_sp<GrRenderTarget>(); + } + SkASSERT(!rt->asTexture()); // A GrRenderTarget that's not textureable + SkASSERT(!rt->getUniqueKey().isValid()); + // Make sure we match how we created the proxy with SkBudgeted::kNo + SkASSERT(SkBudgeted::kNo == rt->resourcePriv().isBudgeted()); + + return rt; + }, desc, renderTargetFlags, Textureable::kNo, GrMipMapped::kNo, 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. + if (!proxy->priv().doLazyInstantiation(fResourceProvider)) { + return nullptr; + } + } + return proxy; } sk_sp<GrTextureProxy> GrProxyProvider::createLazyProxy(LazyInstantiateCallback&& callback, |