Handle instantiation of proxies with pending invalidation messages
Bug: skia:
Change-Id: Id6808734df2335c521d4a563122ceeca906b7601
Reviewed-on: https://skia-review.googlesource.com/52002
Reviewed-by: Greg Daniel <egdaniel@google.com>
Commit-Queue: Brian Osman <brianosman@google.com>
diff --git a/src/gpu/GrSurfaceProxy.cpp b/src/gpu/GrSurfaceProxy.cpp
index 4789829..d9711e2 100644
--- a/src/gpu/GrSurfaceProxy.cpp
+++ b/src/gpu/GrSurfaceProxy.cpp
@@ -123,7 +123,9 @@
return false;
}
- if (uniqueKey) {
+ // If there was an invalidation message pending for this key, we might have just processed it,
+ // causing the key (stored on this proxy) to become invalid.
+ if (uniqueKey && uniqueKey->isValid()) {
resourceProvider->assignUniqueKeyToResource(*uniqueKey, surface.get());
}
diff --git a/tests/TextureProxyTest.cpp b/tests/TextureProxyTest.cpp
index 915539e..79bf7c0 100644
--- a/tests/TextureProxyTest.cpp
+++ b/tests/TextureProxyTest.cpp
@@ -254,6 +254,44 @@
REPORTER_ASSERT(reporter, 0 == cache->getResourceCount());
}
+// Test if invalidating unique ids prior to instantiating operates as expected
+static void invalidation_and_instantiation_test(GrContext* context, skiatest::Reporter* reporter) {
+ GrResourceProvider* provider = context->resourceProvider();
+ GrResourceCache* cache = context->getResourceCache();
+ REPORTER_ASSERT(reporter, 0 == cache->getResourceCount());
+
+ static GrUniqueKey::Domain d = GrUniqueKey::GenerateDomain();
+ GrUniqueKey key;
+ GrUniqueKey::Builder builder(&key, d, 1, nullptr);
+ builder[0] = 0;
+ builder.finish();
+
+ // Create proxy, assign unique key
+ sk_sp<GrTextureProxy> proxy = deferred_tex(reporter, provider, SkBackingFit::kExact);
+ provider->assignUniqueKeyToProxy(key, proxy.get());
+
+ // Send an invalidation message, which will be sitting in the cache's inbox
+ SkMessageBus<GrUniqueKeyInvalidatedMessage>::Post(GrUniqueKeyInvalidatedMessage(key));
+
+ REPORTER_ASSERT(reporter, 1 == cache->numUniqueKeyProxies_TestOnly());
+ REPORTER_ASSERT(reporter, 0 == cache->getResourceCount());
+
+ // Instantiate the proxy. This will trigger the message to be processed, so the resulting
+ // texture should *not* have the unique key on it!
+ SkAssertResult(proxy->instantiate(provider));
+
+ REPORTER_ASSERT(reporter, !proxy->getUniqueKey().isValid());
+ REPORTER_ASSERT(reporter, !proxy->priv().peekTexture()->getUniqueKey().isValid());
+ REPORTER_ASSERT(reporter, 0 == cache->numUniqueKeyProxies_TestOnly());
+ REPORTER_ASSERT(reporter, 1 == cache->getResourceCount());
+
+ proxy = nullptr;
+ context->purgeAllUnlockedResources();
+
+ REPORTER_ASSERT(reporter, 0 == cache->numUniqueKeyProxies_TestOnly());
+ REPORTER_ASSERT(reporter, 0 == cache->getResourceCount());
+}
+
DEF_GPUTEST_FOR_RENDERING_CONTEXTS(TextureProxyTest, reporter, ctxInfo) {
GrContext* context = ctxInfo.grContext();
GrResourceProvider* provider = context->resourceProvider();
@@ -278,6 +316,7 @@
}
invalidation_test(context, reporter);
+ invalidation_and_instantiation_test(context, reporter);
}
#endif