blob: fd54f5c2ad2fdba564f99245fe55136cb6a47e3d [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 "src/core/SkOpts.h"
#include "src/core/SkUniformData.h"
namespace skgpu {
size_t UniformCache::Hash::operator()(SkUniformBlock* ub) const {
if (!ub) {
return 0;
}
return ub->hash();
}
bool UniformCache::Eq::operator()(SkUniformBlock* a, SkUniformBlock* b) const {
if (!a || !b) {
return !a && !b;
}
return *a == *b;
};
UniformCache::UniformCache() {
// kInvalidUniformID is reserved
static_assert(kInvalidUniformID == 0);
fUniformBlock.push_back(nullptr);
fUniformBlockIDs.insert({nullptr, 0});
}
#ifdef SK_DEBUG
void UniformCache::validate() const {
for (size_t i = 0; i < fUniformBlock.size(); ++i) {
auto kv = fUniformBlockIDs.find(fUniformBlock[i].get());
SkASSERT(kv != fUniformBlockIDs.end());
SkASSERT(kv->first == fUniformBlock[i].get());
SkASSERT(SkTo<uint32_t>(i) == kv->second);
}
}
#endif
uint32_t UniformCache::insert(std::unique_ptr<SkUniformBlock> block) {
auto kv = fUniformBlockIDs.find(block.get());
if (kv != fUniformBlockIDs.end()) {
return kv->second;
}
uint32_t id = SkTo<uint32_t>(fUniformBlock.size());
SkASSERT(block && id != kInvalidUniformID);
fUniformBlockIDs.insert({block.get(), id});
fUniformBlock.push_back(std::move(block));
this->validate();
return id;
}
SkUniformBlock* UniformCache::lookup(uint32_t uniqueID) {
SkASSERT(uniqueID < fUniformBlock.size());
return fUniformBlock[uniqueID].get();
}
} // namespace skgpu