ccpr: Recycle the stashed atlas's texture explicitly
This solution is more future-proof.
Bug: skia:
Change-Id: Ifa437a511336282d73befddea2656f3fcdb3f2ef
Reviewed-on: https://skia-review.googlesource.com/136964
Commit-Queue: Chris Dalton <csmartdalton@google.com>
Reviewed-by: Greg Daniel <egdaniel@google.com>
diff --git a/src/gpu/ccpr/GrCCAtlas.cpp b/src/gpu/ccpr/GrCCAtlas.cpp
index 4eeddea..b336e8c 100644
--- a/src/gpu/ccpr/GrCCAtlas.cpp
+++ b/src/gpu/ccpr/GrCCAtlas.cpp
@@ -77,12 +77,15 @@
if (!resourceProvider) {
return sk_sp<GrTexture>();
}
- GrSurfaceDesc desc;
- desc.fFlags = kRenderTarget_GrSurfaceFlag;
- desc.fWidth = fWidth;
- desc.fHeight = fHeight;
- desc.fConfig = pixelConfig;
- return resourceProvider->createTexture(desc, SkBudgeted::kYes);
+ if (!fBackingTexture) {
+ GrSurfaceDesc desc;
+ desc.fFlags = kRenderTarget_GrSurfaceFlag;
+ desc.fWidth = fWidth;
+ desc.fHeight = fHeight;
+ desc.fConfig = pixelConfig;
+ fBackingTexture = resourceProvider->createTexture(desc, SkBudgeted::kYes);
+ }
+ return fBackingTexture;
},
GrProxyProvider::Renderable::kYes, kTextureOrigin, pixelConfig, caps);
}
@@ -165,13 +168,20 @@
}
sk_sp<GrRenderTargetContext> GrCCAtlas::makeRenderTargetContext(
- GrOnFlushResourceProvider* onFlushRP) {
+ GrOnFlushResourceProvider* onFlushRP, sk_sp<GrTexture> backingTexture) {
SkASSERT(!fTextureProxy->priv().isInstantiated()); // This method should only be called once.
// Caller should have cropped any paths to the destination render target instead of asking for
// an atlas larger than maxRenderTargetSize.
SkASSERT(SkTMax(fHeight, fWidth) <= fMaxTextureSize);
SkASSERT(fMaxTextureSize <= onFlushRP->caps()->maxRenderTargetSize());
+ if (backingTexture) {
+ SkASSERT(backingTexture->config() == kAlpha_half_GrPixelConfig);
+ SkASSERT(backingTexture->width() == fWidth);
+ SkASSERT(backingTexture->height() == fHeight);
+ fBackingTexture = std::move(backingTexture);
+ }
+
sk_sp<GrRenderTargetContext> rtc =
onFlushRP->makeRenderTargetContext(fTextureProxy, nullptr, nullptr);
if (!rtc) {