Allow vertex data to be stored in the thread safe cache
Bug: 1108408
Change-Id: I4d51b9c837fad435c7a3e6823390b519b785631b
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/329363
Reviewed-by: Adlai Holler <adlai@google.com>
Commit-Queue: Robert Phillips <robertphillips@google.com>
diff --git a/src/gpu/GrThreadSafeCache.cpp b/src/gpu/GrThreadSafeCache.cpp
index a275075..23c65b2 100644
--- a/src/gpu/GrThreadSafeCache.cpp
+++ b/src/gpu/GrThreadSafeCache.cpp
@@ -13,6 +13,10 @@
#include "src/gpu/GrRenderTargetContext.h"
#include "src/gpu/GrResourceCache.h"
+GrThreadSafeCache::VertexData::~VertexData () {
+ this->reset();
+}
+
GrThreadSafeCache::GrThreadSafeCache()
: fFreeEntryList(nullptr) {
}
@@ -95,15 +99,19 @@
}
}
+void GrThreadSafeCache::makeExistingEntryMRU(Entry* entry) {
+ SkASSERT(fUniquelyKeyedEntryList.isInList(entry));
+
+ entry->fLastAccess = GrStdSteadyClock::now();
+ fUniquelyKeyedEntryList.remove(entry);
+ fUniquelyKeyedEntryList.addToHead(entry);
+}
+
std::tuple<GrSurfaceProxyView, sk_sp<SkData>> GrThreadSafeCache::internalFind(
const GrUniqueKey& key) {
Entry* tmp = fUniquelyKeyedEntryMap.find(key);
if (tmp) {
- SkASSERT(fUniquelyKeyedEntryList.isInList(tmp));
- // make the sought out entry the MRU
- tmp->fLastAccess = GrStdSteadyClock::now();
- fUniquelyKeyedEntryList.remove(tmp);
- fUniquelyKeyedEntryList.addToHead(tmp);
+ this->makeExistingEntryMRU(tmp);
return { tmp->view(), tmp->refCustomData() };
}
@@ -139,13 +147,33 @@
entry = fEntryAllocator.make<Entry>(key, view);
}
- // make 'entry' the MRU
+ return this->makeNewEntryMRU(entry);
+}
+
+GrThreadSafeCache::Entry* GrThreadSafeCache::makeNewEntryMRU(Entry* entry) {
entry->fLastAccess = GrStdSteadyClock::now();
fUniquelyKeyedEntryList.addToHead(entry);
fUniquelyKeyedEntryMap.add(entry);
return entry;
}
+GrThreadSafeCache::Entry* GrThreadSafeCache::getEntry(const GrUniqueKey& key,
+ sk_sp<VertexData> vertData) {
+ Entry* entry;
+
+ if (fFreeEntryList) {
+ entry = fFreeEntryList;
+ fFreeEntryList = entry->fNext;
+ entry->fNext = nullptr;
+
+ entry->set(key, std::move(vertData));
+ } else {
+ entry = fEntryAllocator.make<Entry>(key, std::move(vertData));
+ }
+
+ return this->makeNewEntryMRU(entry);
+}
+
void GrThreadSafeCache::recycleEntry(Entry* dead) {
SkASSERT(!dead->fPrev && !dead->fNext && !dead->fList);
@@ -211,6 +239,51 @@
return this->internalAdd(key, v);
}
+sk_sp<GrThreadSafeCache::VertexData> GrThreadSafeCache::MakeVertexData(const void* vertices,
+ int vertexCount,
+ size_t vertexSize) {
+ return sk_sp<VertexData>(new VertexData(vertices, vertexCount, vertexSize));
+}
+
+std::tuple<sk_sp<GrThreadSafeCache::VertexData>, sk_sp<SkData>> GrThreadSafeCache::internalFindVerts(
+ const GrUniqueKey& key) {
+ Entry* tmp = fUniquelyKeyedEntryMap.find(key);
+ if (tmp) {
+ this->makeExistingEntryMRU(tmp);
+ return { tmp->vertexData(), tmp->refCustomData() };
+ }
+
+ return {};
+}
+
+std::tuple<sk_sp<GrThreadSafeCache::VertexData>, sk_sp<SkData>> GrThreadSafeCache::findVertsWithData(
+ const GrUniqueKey& key) {
+ SkAutoSpinlock lock{fSpinLock};
+
+ return this->internalFindVerts(key);
+}
+
+std::tuple<sk_sp<GrThreadSafeCache::VertexData>, sk_sp<SkData>> GrThreadSafeCache::internalAddVerts(
+ const GrUniqueKey& key,
+ sk_sp<VertexData> vertData) {
+ Entry* tmp = fUniquelyKeyedEntryMap.find(key);
+ if (!tmp) {
+ tmp = this->getEntry(key, std::move(vertData));
+
+ SkASSERT(fUniquelyKeyedEntryMap.find(key));
+ }
+
+ return { tmp->vertexData(), tmp->refCustomData() };
+}
+
+std::tuple<sk_sp<GrThreadSafeCache::VertexData>, sk_sp<SkData>> GrThreadSafeCache::addVertsWithData(
+ const GrUniqueKey& key,
+ sk_sp<VertexData> vertData) {
+ SkAutoSpinlock lock{fSpinLock};
+
+ return this->internalAddVerts(key, std::move(vertData));
+}
+
void GrThreadSafeCache::remove(const GrUniqueKey& key) {
SkAutoSpinlock lock{fSpinLock};