1 /* 2 * Copyright 2021 Google LLC 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #include "experimental/graphite/src/UniformCache.h" 9 10 #include "src/core/SkOpts.h" 11 #include "src/core/SkUniformData.h" 12 13 namespace skgpu { 14 operator ()(SkUniformBlock * ub) const15size_t UniformCache::Hash::operator()(SkUniformBlock* ub) const { 16 if (!ub) { 17 return 0; 18 } 19 20 return ub->hash(); 21 } 22 operator ()(SkUniformBlock * a,SkUniformBlock * b) const23bool UniformCache::Eq::operator()(SkUniformBlock* a, SkUniformBlock* b) const { 24 if (!a || !b) { 25 return !a && !b; 26 } 27 28 return *a == *b; 29 }; 30 UniformCache()31UniformCache::UniformCache() { 32 // kInvalidUniformID is reserved 33 static_assert(kInvalidUniformID == 0); 34 fUniformBlock.push_back(nullptr); 35 fUniformBlockIDs.insert({nullptr, 0}); 36 } 37 38 #ifdef SK_DEBUG validate() const39void UniformCache::validate() const { 40 for (size_t i = 0; i < fUniformBlock.size(); ++i) { 41 auto kv = fUniformBlockIDs.find(fUniformBlock[i].get()); 42 SkASSERT(kv != fUniformBlockIDs.end()); 43 SkASSERT(kv->first == fUniformBlock[i].get()); 44 SkASSERT(SkTo<uint32_t>(i) == kv->second); 45 } 46 } 47 #endif 48 insert(std::unique_ptr<SkUniformBlock> block)49uint32_t UniformCache::insert(std::unique_ptr<SkUniformBlock> block) { 50 auto kv = fUniformBlockIDs.find(block.get()); 51 if (kv != fUniformBlockIDs.end()) { 52 return kv->second; 53 } 54 55 uint32_t id = SkTo<uint32_t>(fUniformBlock.size()); 56 SkASSERT(block && id != kInvalidUniformID); 57 58 fUniformBlockIDs.insert({block.get(), id}); 59 fUniformBlock.push_back(std::move(block)); 60 this->validate(); 61 return id; 62 } 63 lookup(uint32_t uniqueID)64SkUniformBlock* UniformCache::lookup(uint32_t uniqueID) { 65 SkASSERT(uniqueID < fUniformBlock.size()); 66 return fUniformBlock[uniqueID].get(); 67 } 68 69 } // namespace skgpu 70