Add single thread assertions to GrResourceCache functions called by GrGpuResource
Resources can call into GrResourceCache on via call stacks that don't include
GrContext.
Change-Id: Ibbea5615e2524e4bc99106cbaeba8fcc7e624215
Reviewed-on: https://skia-review.googlesource.com/c/162163
Reviewed-by: Greg Daniel <egdaniel@google.com>
Commit-Queue: Brian Salomon <bsalomon@google.com>
diff --git a/src/gpu/GrResourceCache.cpp b/src/gpu/GrResourceCache.cpp
index bc6ba11..817d188 100644
--- a/src/gpu/GrResourceCache.cpp
+++ b/src/gpu/GrResourceCache.cpp
@@ -6,8 +6,8 @@
*/
#include "GrResourceCache.h"
-
#include "GrCaps.h"
+#include "GrSingleOwner.h"
#include "GrGpuResourceCacheAccess.h"
#include "GrProxyProvider.h"
#include "GrTexture.h"
@@ -24,6 +24,9 @@
DECLARE_SKMESSAGEBUS_MESSAGE(GrGpuResourceFreedMessage);
+#define ASSERT_SINGLE_OWNER \
+ SkDEBUGCODE(GrSingleOwner::AutoEnforce debug_SingleOwner(fSingleOwner);)
+
//////////////////////////////////////////////////////////////////////////////
GrScratchKey::ResourceType GrScratchKey::GenerateResourceType() {
@@ -64,7 +67,8 @@
//////////////////////////////////////////////////////////////////////////////
-GrResourceCache::GrResourceCache(const GrCaps* caps, uint32_t contextUniqueID)
+GrResourceCache::GrResourceCache(const GrCaps* caps, GrSingleOwner* singleOwner,
+ uint32_t contextUniqueID)
: fProxyProvider(nullptr)
, fTimestamp(0)
, fMaxCount(kDefaultMaxCount)
@@ -82,6 +86,7 @@
, fInvalidUniqueKeyInbox(contextUniqueID)
, fFreedGpuResourceInbox(contextUniqueID)
, fContextUniqueID(contextUniqueID)
+ , fSingleOwner(singleOwner)
, fPreferVRAMUseOverFlushes(caps->preferVRAMUseOverFlushes()) {
SkASSERT(contextUniqueID != SK_InvalidUniqueID);
SkDEBUGCODE(fCount = 0;)
@@ -99,6 +104,7 @@
}
void GrResourceCache::insertResource(GrGpuResource* resource) {
+ ASSERT_SINGLE_OWNER
SkASSERT(resource);
SkASSERT(!this->isInCache(resource));
SkASSERT(!resource->wasDestroyed());
@@ -137,6 +143,7 @@
}
void GrResourceCache::removeResource(GrGpuResource* resource) {
+ ASSERT_SINGLE_OWNER
this->validate();
SkASSERT(this->isInCache(resource));
@@ -288,6 +295,7 @@
}
void GrResourceCache::willRemoveScratchKey(const GrGpuResource* resource) {
+ ASSERT_SINGLE_OWNER
SkASSERT(resource->resourcePriv().getScratchKey().isValid());
if (!resource->getUniqueKey().isValid()) {
fScratchMap.remove(resource->resourcePriv().getScratchKey(), resource);
@@ -295,6 +303,7 @@
}
void GrResourceCache::removeUniqueKey(GrGpuResource* resource) {
+ ASSERT_SINGLE_OWNER
// Someone has a ref to this resource in order to have removed the key. When the ref count
// reaches zero we will get a ref cnt notification and figure out what to do with it.
if (resource->getUniqueKey().isValid()) {
@@ -311,6 +320,7 @@
}
void GrResourceCache::changeUniqueKey(GrGpuResource* resource, const GrUniqueKey& newKey) {
+ ASSERT_SINGLE_OWNER
SkASSERT(resource);
SkASSERT(this->isInCache(resource));
@@ -349,6 +359,7 @@
}
void GrResourceCache::refAndMakeResourceMRU(GrGpuResource* resource) {
+ ASSERT_SINGLE_OWNER
SkASSERT(resource);
SkASSERT(this->isInCache(resource));
@@ -365,6 +376,7 @@
}
void GrResourceCache::notifyCntReachedZero(GrGpuResource* resource, uint32_t flags) {
+ ASSERT_SINGLE_OWNER
SkASSERT(resource);
SkASSERT(!resource->wasDestroyed());
SkASSERT(flags);
@@ -433,6 +445,7 @@
}
void GrResourceCache::didChangeBudgetStatus(GrGpuResource* resource) {
+ ASSERT_SINGLE_OWNER
SkASSERT(resource);
SkASSERT(this->isInCache(resource));