Fix DDL reattachment of uniquely keyed proxies
This fix has three parts:
No longer clear all proxy unique keys in DDL mode
Handle unique keys appropriately in lazy proxy instantiation
Handle attaching to cached surfaces for non-lazy proxies
Change-Id: I86b0422a784acaf8c5f9b67cb981b440e08352de
Reviewed-on: https://skia-review.googlesource.com/154502
Commit-Queue: Robert Phillips <robertphillips@google.com>
Reviewed-by: Brian Salomon <bsalomon@google.com>
diff --git a/src/gpu/GrResourceAllocator.cpp b/src/gpu/GrResourceAllocator.cpp
index e5767dd..f6de364 100644
--- a/src/gpu/GrResourceAllocator.cpp
+++ b/src/gpu/GrResourceAllocator.cpp
@@ -221,6 +221,21 @@
// If we can't find a useable one, create a new one.
sk_sp<GrSurface> GrResourceAllocator::findSurfaceFor(const GrSurfaceProxy* proxy,
bool needsStencil) {
+
+ if (proxy->asTextureProxy() && proxy->asTextureProxy()->getUniqueKey().isValid()) {
+ // First try to reattach to a cached version if the proxy is uniquely keyed
+ sk_sp<GrSurface> surface = fResourceProvider->findByUniqueKey<GrSurface>(
+ proxy->asTextureProxy()->getUniqueKey());
+ if (surface) {
+ if (!GrSurfaceProxyPriv::AttachStencilIfNeeded(fResourceProvider, surface.get(),
+ needsStencil)) {
+ return nullptr;
+ }
+
+ return surface;
+ }
+ }
+
// First look in the free pool
GrScratchKey key;
@@ -242,6 +257,7 @@
needsStencil)) {
return nullptr;
}
+ SkASSERT(!surface->getUniqueKey().isValid());
return surface;
}
@@ -350,10 +366,14 @@
}
} else if (sk_sp<GrSurface> surface = this->findSurfaceFor(cur->proxy(), needsStencil)) {
// TODO: make getUniqueKey virtual on GrSurfaceProxy
- GrTextureProxy* tex = cur->proxy()->asTextureProxy();
- if (tex && tex->getUniqueKey().isValid()) {
- fResourceProvider->assignUniqueKeyToResource(tex->getUniqueKey(), surface.get());
- SkASSERT(surface->getUniqueKey() == tex->getUniqueKey());
+ GrTextureProxy* texProxy = cur->proxy()->asTextureProxy();
+
+ if (texProxy && texProxy->getUniqueKey().isValid()) {
+ if (!surface->getUniqueKey().isValid()) {
+ fResourceProvider->assignUniqueKeyToResource(texProxy->getUniqueKey(),
+ surface.get());
+ }
+ SkASSERT(surface->getUniqueKey() == texProxy->getUniqueKey());
}
#if GR_ALLOCATION_SPEW