Allow aliasing in GrProxyProvider::processInvalidUniqueKey
Rearranges the code to support the case "&key == &proxy->fUniqueKey".
Removes the redundant GrUniqueKey parameter from
GrProxyProvider::removeUniqueKeyFromProxy (we can just get the key
from the proxy itself). Adds a passthru for "processInvalidUniqueKey"
to GrOnFlushResourceProvier.
Bug: skia:8462
Change-Id: I0c1e1f2c6ff15a9976f8475c19fd8a33a363193c
Reviewed-on: https://skia-review.googlesource.com/c/180048
Reviewed-by: Robert Phillips <robertphillips@google.com>
Commit-Queue: Chris Dalton <csmartdalton@google.com>
diff --git a/src/gpu/GrProxyProvider.cpp b/src/gpu/GrProxyProvider.cpp
index 0a45d60..657d607 100644
--- a/src/gpu/GrProxyProvider.cpp
+++ b/src/gpu/GrProxyProvider.cpp
@@ -104,13 +104,16 @@
fUniquelyKeyedProxies.add(proxy);
}
-void GrProxyProvider::removeUniqueKeyFromProxy(const GrUniqueKey& key, GrTextureProxy* proxy) {
+void GrProxyProvider::removeUniqueKeyFromProxy(GrTextureProxy* proxy) {
ASSERT_SINGLE_OWNER
- if (this->isAbandoned() || !proxy) {
+ SkASSERT(proxy);
+ SkASSERT(proxy->getUniqueKey().isValid());
+
+ if (this->isAbandoned()) {
return;
}
- this->processInvalidUniqueKey(key, proxy, GrProxyProvider::InvalidateGPUResource::kYes);
+ this->processInvalidUniqueKey(proxy->getUniqueKey(), proxy, InvalidateGPUResource::kYes);
}
sk_sp<GrTextureProxy> GrProxyProvider::findProxyByUniqueKey(const GrUniqueKey& key,
@@ -684,37 +687,35 @@
void GrProxyProvider::processInvalidUniqueKey(const GrUniqueKey& key, GrTextureProxy* proxy,
InvalidateGPUResource invalidateGPUResource) {
+ SkASSERT(key.isValid());
+
if (!proxy) {
proxy = fUniquelyKeyedProxies.find(key);
}
+ SkASSERT(!proxy || proxy->getUniqueKey() == key);
+
+ // Locate the corresponding GrGpuResource (if it needs to be invalidated) before clearing the
+ // proxy's unique key. We must do it in this order because 'key' may alias the proxy's key.
+ sk_sp<GrGpuResource> invalidGpuResource;
+ if (InvalidateGPUResource::kYes == invalidateGPUResource) {
+ if (proxy && proxy->isInstantiated()) {
+ invalidGpuResource = sk_ref_sp(proxy->peekSurface());
+ }
+ if (!invalidGpuResource && fResourceProvider) {
+ invalidGpuResource = fResourceProvider->findByUniqueKey<GrGpuResource>(key);
+ }
+ SkASSERT(!invalidGpuResource || invalidGpuResource->getUniqueKey() == key);
+ }
// Note: this method is called for the whole variety of GrGpuResources so often 'key'
// will not be in 'fUniquelyKeyedProxies'.
if (proxy) {
- SkASSERT(proxy->getUniqueKey().isValid());
- SkASSERT(proxy->getUniqueKey() == key);
-
fUniquelyKeyedProxies.remove(key);
proxy->cacheAccess().clearUniqueKey();
}
- if (InvalidateGPUResource::kNo == invalidateGPUResource) {
- return;
- }
-
- if (proxy && proxy->isInstantiated()) {
- GrSurface* surface = proxy->peekSurface();
- if (surface) {
- surface->resourcePriv().removeUniqueKey();
- return;
- }
- }
-
- if (fResourceProvider) {
- sk_sp<GrGpuResource> resource = fResourceProvider->findByUniqueKey<GrGpuResource>(key);
- if (resource) {
- resource->resourcePriv().removeUniqueKey();
- }
+ if (invalidGpuResource) {
+ invalidGpuResource->resourcePriv().removeUniqueKey();
}
}
@@ -732,8 +733,7 @@
for (UniquelyKeyedProxyHash::Iter iter(&fUniquelyKeyedProxies); !iter.done(); ++iter) {
GrTextureProxy& tmp = *iter;
- this->processInvalidUniqueKey(tmp.getUniqueKey(), &tmp,
- GrProxyProvider::InvalidateGPUResource::kNo);
+ this->processInvalidUniqueKey(tmp.getUniqueKey(), &tmp, InvalidateGPUResource::kNo);
}
SkASSERT(!fUniquelyKeyedProxies.count());
}