Fix creation of gpu resources in GrThreadSafeViewCache tests
This CL implements and exercises the preference for gpu-generated content.
This CL also switches to drawing a rect (vs. an arrow) since drawing
a concave path on the gpu can be fraught.
Bug: 1108408
Change-Id: Ieec1619b5357ffb31aa74b471ea09c061bd8f74e
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/319416
Reviewed-by: Adlai Holler <adlai@google.com>
Commit-Queue: Robert Phillips <robertphillips@google.com>
diff --git a/src/gpu/GrThreadSafeUniquelyKeyedProxyViewCache.cpp b/src/gpu/GrThreadSafeUniquelyKeyedProxyViewCache.cpp
index b776e79..c819339 100644
--- a/src/gpu/GrThreadSafeUniquelyKeyedProxyViewCache.cpp
+++ b/src/gpu/GrThreadSafeUniquelyKeyedProxyViewCache.cpp
@@ -42,7 +42,8 @@
// TODO: should we empty out the fFreeEntryList and reset fEntryAllocator?
}
-// TODO: add an atomic flag so we know when it is worthwhile to iterate
+// TODO: If iterating becomes too expensive switch to using something like GrIORef for the
+// GrSurfaceProxy
void GrThreadSafeUniquelyKeyedProxyViewCache::dropUniqueRefs(GrResourceCache* resourceCache) {
SkAutoSpinlock lock{fSpinLock};
@@ -159,3 +160,31 @@
return this->internalAdd(key, view);
}
+
+GrSurfaceProxyView GrThreadSafeUniquelyKeyedProxyViewCache::findOrAdd(const GrUniqueKey& key,
+ const GrSurfaceProxyView& v) {
+ SkAutoSpinlock lock{fSpinLock};
+
+ Entry* tmp = fUniquelyKeyedProxyViewMap.find(key);
+ if (tmp) {
+ SkASSERT(fUniquelyKeyedProxyViewList.isInList(tmp));
+ // make the sought out entry the MRU
+ tmp->fLastAccess = GrStdSteadyClock::now();
+ fUniquelyKeyedProxyViewList.remove(tmp);
+ fUniquelyKeyedProxyViewList.addToHead(tmp);
+ return tmp->fView;
+ }
+
+ return this->internalAdd(key, v);
+}
+
+void GrThreadSafeUniquelyKeyedProxyViewCache::remove(const GrUniqueKey& key) {
+ SkAutoSpinlock lock{fSpinLock};
+
+ Entry* tmp = fUniquelyKeyedProxyViewMap.find(key);
+ if (tmp) {
+ fUniquelyKeyedProxyViewMap.remove(key);
+ fUniquelyKeyedProxyViewList.remove(tmp);
+ this->recycleEntry(tmp);
+ }
+}