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 "experimental/graphite/src/ContextUtils.h" 11#include "src/core/SkOpts.h" 12 13namespace skgpu { 14 15size_t UniformCache::Hash::operator()(sk_sp<UniformData> ud) const { 16 return SkOpts::hash_fn(ud->data(), ud->dataSize(), 0); 17} 18 19bool UniformCache::Eq::operator()(sk_sp<UniformData> a, sk_sp<UniformData> b) const { 20 if (a->count() != b->count() || 21 a->uniforms() != b->uniforms() || 22 a->dataSize() != b->dataSize()) { 23 return false; 24 } 25 26 return !memcmp(a->data(), b->data(), a->dataSize()) && 27 !memcmp(a->offsets(), b->offsets(), a->count()*sizeof(uint32_t)); 28}; 29 30UniformCache::UniformCache() { 31 // kInvalidUniformID (aka 0) is reserved 32 fUniformDataVector.push_back(nullptr); 33} 34 35sk_sp<UniformData> UniformCache::findOrCreate(sk_sp<UniformData> ud) { 36 37 auto iter = fUniformDataHash.find(ud); 38 if (iter != fUniformDataHash.end()) { 39 SkASSERT((*iter)->id() != UniformData::kInvalidUniformID); 40 return *iter; 41 } 42 43 ud->setID(fNextUniqueID++); 44 fUniformDataHash.insert(ud); 45 fUniformDataVector.push_back(ud); 46 SkASSERT(fUniformDataVector[ud->id()] == ud); 47 return ud; 48} 49 50sk_sp<UniformData> UniformCache::lookup(uint32_t uniqueID) { 51 SkASSERT(uniqueID < fUniformDataVector.size()); 52 return fUniformDataVector[uniqueID]; 53} 54 55} // namespace skgpu 56