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>
This commit is contained in:
Greg Daniel 2018-02-21 11:36:53 -05:00 committed by Skia Commit-Bot
parent 2388866c8d
commit f87651e7b8
2 changed files with 97 additions and 12 deletions

View File

@ -211,6 +211,16 @@ sk_sp<GrTextureProxy> GrProxyProvider::createTextureProxy(sk_sp<SkImage> srcImag
return nullptr; 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; GrRenderTargetFlags renderTargetFlags = GrRenderTargetFlags::kNone;
if (SkToBool(flags & kRenderTarget_GrSurfaceFlag)) { if (SkToBool(flags & kRenderTarget_GrSurfaceFlag)) {
if (fCaps->usesMixedSamples() && sampleCnt > 1) { if (fCaps->usesMixedSamples() && sampleCnt > 1) {
@ -227,7 +237,7 @@ sk_sp<GrTextureProxy> GrProxyProvider::createTextureProxy(sk_sp<SkImage> srcImag
desc.fFlags = flags; desc.fFlags = flags;
desc.fOrigin = origin; desc.fOrigin = origin;
desc.fSampleCnt = sampleCnt; desc.fSampleCnt = sampleCnt;
desc.fConfig = SkImageInfo2GrPixelConfig(as_IB(srcImage)->onImageInfo(), *this->caps()); desc.fConfig = config;
sk_sp<GrTextureProxy> proxy = this->createLazyProxy( sk_sp<GrTextureProxy> proxy = this->createLazyProxy(
[desc, budgeted, srcImage, fit] [desc, budgeted, srcImage, fit]
@ -451,6 +461,9 @@ sk_sp<GrTextureProxy> GrProxyProvider::createWrappedTextureProxy(const GrBackend
} }
sampleCnt = this->caps()->getRenderTargetSampleCount(sampleCnt, backendTex.config()); sampleCnt = this->caps()->getRenderTargetSampleCount(sampleCnt, backendTex.config());
if (!sampleCnt) {
return nullptr;
}
GrSurfaceDesc desc; GrSurfaceDesc desc;
desc.fOrigin = origin; desc.fOrigin = origin;
@ -549,21 +562,63 @@ sk_sp<GrSurfaceProxy> GrProxyProvider::createWrappedRenderTargetProxy(
return proxy; return proxy;
} }
sk_sp<GrSurfaceProxy> GrProxyProvider::createWrappedRenderTargetProxy(const GrBackendTexture& tex, sk_sp<GrSurfaceProxy> GrProxyProvider::createWrappedRenderTargetProxy(
GrSurfaceOrigin origin, const GrBackendTexture& backendTex,
int sampleCnt) { GrSurfaceOrigin origin,
int sampleCnt) {
if (this->isAbandoned()) { if (this->isAbandoned()) {
return nullptr; return nullptr;
} }
sk_sp<GrRenderTarget> rt(fResourceProvider->wrapBackendTextureAsRenderTarget(tex, sampleCnt)); sampleCnt = this->caps()->getRenderTargetSampleCount(sampleCnt, backendTex.config());
if (!rt) { if (!sampleCnt) {
return nullptr; 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, sk_sp<GrTextureProxy> GrProxyProvider::createLazyProxy(LazyInstantiateCallback&& callback,

View File

@ -206,6 +206,7 @@ DEF_GPUTEST_FOR_RENDERING_CONTEXTS(WrappedProxyTest, reporter, ctxInfo) {
} }
// External on-screen render target. // External on-screen render target.
// Tests createWrappedRenderTargetProxy with a GrBackendRenderTarget
{ {
GrGLFramebufferInfo fboInfo; GrGLFramebufferInfo fboInfo;
fboInfo.fFBOID = 0; fboInfo.fFBOID = 0;
@ -222,16 +223,17 @@ DEF_GPUTEST_FOR_RENDERING_CONTEXTS(WrappedProxyTest, reporter, ctxInfo) {
supportedNumSamples, SkBackingFit::kExact, 0); supportedNumSamples, SkBackingFit::kExact, 0);
} }
// Tests createWrappedRenderTargetProxy with a GrBackendTexture
{ {
GrBackendTexture backendTex = GrBackendTexture backendTex =
gpu->createTestingOnlyBackendTexture(nullptr, kWidthHeight, gpu->createTestingOnlyBackendTexture(nullptr, kWidthHeight,
kWidthHeight, colorType, true, kWidthHeight, colorType, true,
GrMipMapped::kNo); GrMipMapped::kNo);
sk_sp<GrSurfaceProxy> sProxy = sk_sp<GrSurfaceProxy> sProxy =
proxyProvider->createWrappedTextureProxy(backendTex, origin, proxyProvider->createWrappedRenderTargetProxy(backendTex, origin,
supportedNumSamples); supportedNumSamples);
if (!sProxy) { if (!sProxy) {
gpu->deleteTestingOnlyBackendTexture(&backendTex);
continue; // This can fail on Mesa continue; // This can fail on Mesa
} }
@ -246,6 +248,33 @@ DEF_GPUTEST_FOR_RENDERING_CONTEXTS(WrappedProxyTest, reporter, ctxInfo) {
gpu->deleteTestingOnlyBackendTexture(&backendTex); gpu->deleteTestingOnlyBackendTexture(&backendTex);
} }
// Tests createWrappedTextureProxy that is only renderable
{
GrBackendTexture backendTex =
gpu->createTestingOnlyBackendTexture(nullptr, kWidthHeight,
kWidthHeight, colorType, true,
GrMipMapped::kNo);
sk_sp<GrSurfaceProxy> sProxy =
proxyProvider->createWrappedTextureProxy(backendTex, origin,
supportedNumSamples);
if (!sProxy) {
gpu->deleteTestingOnlyBackendTexture(&backendTex);
continue; // This can fail on Mesa
}
check_surface(reporter, sProxy.get(), origin,
kWidthHeight, kWidthHeight,
backendTex.testingOnly_getPixelConfig(), SkBudgeted::kNo);
check_rendertarget(reporter, caps, resourceProvider,
sProxy->asRenderTargetProxy(),
supportedNumSamples, SkBackingFit::kExact,
caps.maxWindowRectangles());
gpu->deleteTestingOnlyBackendTexture(&backendTex);
}
// Tests createWrappedTextureProxy that is only textureable
{ {
// Internal offscreen texture // Internal offscreen texture
GrBackendTexture backendTex = GrBackendTexture backendTex =
@ -258,6 +287,7 @@ DEF_GPUTEST_FOR_RENDERING_CONTEXTS(WrappedProxyTest, reporter, ctxInfo) {
kBorrow_GrWrapOwnership, kBorrow_GrWrapOwnership,
nullptr, nullptr); nullptr, nullptr);
if (!sProxy) { if (!sProxy) {
gpu->deleteTestingOnlyBackendTexture(&backendTex);
continue; continue;
} }