blob: 87b0b8ce55f947f35487aaec67cbaad80111a806 [file] [log] [blame]
/*
* Copyright 2021 Google LLC
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#include "experimental/graphite/src/UniformCache.h"
#include "experimental/graphite/src/ContextUtils.h"
#include "src/core/SkOpts.h"
namespace skgpu {
size_t UniformCache::Hash::operator()(UniformData* ud) const {
if (!ud) {
return 0;
}
return SkOpts::hash_fn(ud->data(), ud->dataSize(), 0);
}
bool UniformCache::Eq::operator()(UniformData* a, UniformData* b) const {
if (!a || !b) {
return !a && !b;
}
if (a->count() != b->count() ||
a->uniforms() != b->uniforms() ||
a->dataSize() != b->dataSize()) {
return false;
}
return !memcmp(a->data(), b->data(), a->dataSize()) &&
!memcmp(a->offsets(), b->offsets(), a->count()*sizeof(uint32_t));
};
UniformCache::UniformCache() {
// kInvalidUniformID is reserved
static_assert(kInvalidUniformID == 0);
fUniformData.push_back(nullptr);
fUniformDataIDs.insert({nullptr, 0});
}
#ifdef SK_DEBUG
void UniformCache::validate() const {
for (size_t i = 0; i < fUniformData.size(); ++i) {
auto kv = fUniformDataIDs.find(fUniformData[i].get());
SkASSERT(kv != fUniformDataIDs.end());
SkASSERT(kv->first == fUniformData[i].get());
SkASSERT(SkTo<uint32_t>(i) == kv->second);
}
}
#endif
uint32_t UniformCache::insert(sk_sp<UniformData> data) {
auto kv = fUniformDataIDs.find(data.get());
if (kv != fUniformDataIDs.end()) {
return kv->second;
}
uint32_t id = SkTo<uint32_t>(fUniformData.size());
SkASSERT(data && id != kInvalidUniformID);
fUniformDataIDs.insert({data.get(), id});
fUniformData.push_back(std::move(data));
this->validate();
return id;
}
sk_sp<UniformData> UniformCache::lookup(uint32_t uniqueID) {
SkASSERT(uniqueID < fUniformData.size());
return fUniformData[uniqueID];
}
} // namespace skgpu