blob: c2fd7dd09eafba1a0674205e4f40998cb7ef0f7a [file] [log] [blame]
/*
* Copyright 2020 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#include "src/gpu/GrThreadSafeUniquelyKeyedProxyViewCache.h"
GrThreadSafeUniquelyKeyedProxyViewCache::GrThreadSafeUniquelyKeyedProxyViewCache() {}
GrThreadSafeUniquelyKeyedProxyViewCache::~GrThreadSafeUniquelyKeyedProxyViewCache() {
fUniquelyKeyedProxyViews.foreach([](Entry* v) { delete v; });
}
#if GR_TEST_UTILS
int GrThreadSafeUniquelyKeyedProxyViewCache::numEntries() const {
SkAutoSpinlock lock{fSpinLock};
return fUniquelyKeyedProxyViews.count();
}
int GrThreadSafeUniquelyKeyedProxyViewCache::count() const {
SkAutoSpinlock lock{fSpinLock};
return fUniquelyKeyedProxyViews.count();
}
#endif
void GrThreadSafeUniquelyKeyedProxyViewCache::dropAllRefs() {
SkAutoSpinlock lock{fSpinLock};
fUniquelyKeyedProxyViews.foreach([](Entry* v) { delete v; });
fUniquelyKeyedProxyViews.reset();
}
void GrThreadSafeUniquelyKeyedProxyViewCache::dropAllUniqueRefs() {
SkAutoSpinlock lock{fSpinLock};
fUniquelyKeyedProxyViews.foreach([](Entry* v) {
// problematic
});
}
GrSurfaceProxyView GrThreadSafeUniquelyKeyedProxyViewCache::find(const GrUniqueKey& key) {
SkAutoSpinlock lock{fSpinLock};
Entry* tmp = fUniquelyKeyedProxyViews.find(key);
if (tmp) {
return tmp->fView;
}
return {};
}
GrSurfaceProxyView GrThreadSafeUniquelyKeyedProxyViewCache::internalAdd(
const GrUniqueKey& key,
const GrSurfaceProxyView& view) {
Entry* tmp = fUniquelyKeyedProxyViews.find(key);
if (!tmp) {
// TODO: block allocate here?
tmp = new Entry(key, view);
fUniquelyKeyedProxyViews.add(tmp);
}
return tmp->fView;
}
GrSurfaceProxyView GrThreadSafeUniquelyKeyedProxyViewCache::add(const GrUniqueKey& key,
const GrSurfaceProxyView& view) {
SkAutoSpinlock lock{fSpinLock};
return this->internalAdd(key, view);
}