Allow uniqueKey invalidation messages to reach the thread safe cache
With the addition of vertex data to the thread safe cache we also have
to handle the case where a given SkPath becomes inaccessible and
proactively invalidate the matching entry.
Bug: 1108408
Change-Id: Id11ce2aa10517f7c0772a253634d3c0d13e13460
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/330261
Reviewed-by: Adlai Holler <adlai@google.com>
Commit-Queue: Robert Phillips <robertphillips@google.com>
diff --git a/src/gpu/GrThreadSafeCache.h b/src/gpu/GrThreadSafeCache.h
index c84f74d..5dc8f42 100644
--- a/src/gpu/GrThreadSafeCache.h
+++ b/src/gpu/GrThreadSafeCache.h
@@ -83,6 +83,8 @@
// Drop uniquely held refs that were last accessed before 'purgeTime'
void dropUniqueRefsOlderThan(GrStdSteadyClock::time_point purgeTime) SK_EXCLUDES(fSpinLock);
+ SkDEBUGCODE(bool has(const GrUniqueKey&) SK_EXCLUDES(fSpinLock);)
+
GrSurfaceProxyView find(const GrUniqueKey&) SK_EXCLUDES(fSpinLock);
std::tuple<GrSurfaceProxyView, sk_sp<SkData>> findWithData(
const GrUniqueKey&) SK_EXCLUDES(fSpinLock);
@@ -137,6 +139,13 @@
, fVertexSize(vertexSize) {
}
+ VertexData(sk_sp<GrGpuBuffer> gpuBuffer, int numVertices, size_t vertexSize)
+ : fVertices(nullptr)
+ , fNumVertices(numVertices)
+ , fVertexSize(vertexSize)
+ , fGpuBuffer(std::move(gpuBuffer)) {
+ }
+
const void* fVertices;
int fNumVertices;
size_t fVertexSize;
@@ -149,12 +158,16 @@
static sk_sp<VertexData> MakeVertexData(const void* vertices,
int vertexCount,
size_t vertexSize);
+ static sk_sp<VertexData> MakeVertexData(sk_sp<GrGpuBuffer> buffer,
+ int vertexCount,
+ size_t vertexSize);
std::tuple<sk_sp<VertexData>, sk_sp<SkData>> findVertsWithData(
- const GrUniqueKey&) SK_EXCLUDES(fSpinLock);
+ const GrUniqueKey&) SK_EXCLUDES(fSpinLock);
std::tuple<sk_sp<VertexData>, sk_sp<SkData>> addVertsWithData(
- const GrUniqueKey&, sk_sp<VertexData>) SK_EXCLUDES(fSpinLock);
+ const GrUniqueKey&,
+ sk_sp<VertexData>) SK_EXCLUDES(fSpinLock);
void remove(const GrUniqueKey&) SK_EXCLUDES(fSpinLock);
@@ -206,6 +219,11 @@
return fKey;
}
+ SkData* getCustomData() const {
+ SkASSERT(fTag != kEmpty);
+ return fKey.getCustomData();
+ }
+
sk_sp<SkData> refCustomData() const {
SkASSERT(fTag != kEmpty);
return fKey.refCustomData();
@@ -239,7 +257,7 @@
}
void set(const GrUniqueKey& key, sk_sp<VertexData> vertData) {
- SkASSERT(fTag == kEmpty);
+ SkASSERT(fTag == kEmpty || fTag == kVertData);
fKey = key;
fVertData = vertData;
fTag = kVertData;
@@ -280,14 +298,16 @@
void recycleEntry(Entry*) SK_REQUIRES(fSpinLock);
std::tuple<GrSurfaceProxyView, sk_sp<SkData>> internalFind(
- const GrUniqueKey&) SK_REQUIRES(fSpinLock);
+ const GrUniqueKey&) SK_REQUIRES(fSpinLock);
std::tuple<GrSurfaceProxyView, sk_sp<SkData>> internalAdd(
- const GrUniqueKey&, const GrSurfaceProxyView&) SK_REQUIRES(fSpinLock);
+ const GrUniqueKey&,
+ const GrSurfaceProxyView&) SK_REQUIRES(fSpinLock);
std::tuple<sk_sp<VertexData>, sk_sp<SkData>> internalFindVerts(
- const GrUniqueKey&) SK_REQUIRES(fSpinLock);
+ const GrUniqueKey&) SK_REQUIRES(fSpinLock);
std::tuple<sk_sp<VertexData>, sk_sp<SkData>> internalAddVerts(
- const GrUniqueKey&, sk_sp<VertexData>) SK_REQUIRES(fSpinLock);
+ const GrUniqueKey&,
+ sk_sp<VertexData>) SK_REQUIRES(fSpinLock);
mutable SkSpinlock fSpinLock;