1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2021 Google LLC 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci#include "experimental/graphite/src/UniformCache.h" 9cb93a386Sopenharmony_ci 10cb93a386Sopenharmony_ci#include "experimental/graphite/src/ContextUtils.h" 11cb93a386Sopenharmony_ci#include "src/core/SkOpts.h" 12cb93a386Sopenharmony_ci 13cb93a386Sopenharmony_cinamespace skgpu { 14cb93a386Sopenharmony_ci 15cb93a386Sopenharmony_cisize_t UniformCache::Hash::operator()(sk_sp<UniformData> ud) const { 16cb93a386Sopenharmony_ci return SkOpts::hash_fn(ud->data(), ud->dataSize(), 0); 17cb93a386Sopenharmony_ci} 18cb93a386Sopenharmony_ci 19cb93a386Sopenharmony_cibool UniformCache::Eq::operator()(sk_sp<UniformData> a, sk_sp<UniformData> b) const { 20cb93a386Sopenharmony_ci if (a->count() != b->count() || 21cb93a386Sopenharmony_ci a->uniforms() != b->uniforms() || 22cb93a386Sopenharmony_ci a->dataSize() != b->dataSize()) { 23cb93a386Sopenharmony_ci return false; 24cb93a386Sopenharmony_ci } 25cb93a386Sopenharmony_ci 26cb93a386Sopenharmony_ci return !memcmp(a->data(), b->data(), a->dataSize()) && 27cb93a386Sopenharmony_ci !memcmp(a->offsets(), b->offsets(), a->count()*sizeof(uint32_t)); 28cb93a386Sopenharmony_ci}; 29cb93a386Sopenharmony_ci 30cb93a386Sopenharmony_ciUniformCache::UniformCache() { 31cb93a386Sopenharmony_ci // kInvalidUniformID (aka 0) is reserved 32cb93a386Sopenharmony_ci fUniformDataVector.push_back(nullptr); 33cb93a386Sopenharmony_ci} 34cb93a386Sopenharmony_ci 35cb93a386Sopenharmony_cisk_sp<UniformData> UniformCache::findOrCreate(sk_sp<UniformData> ud) { 36cb93a386Sopenharmony_ci 37cb93a386Sopenharmony_ci auto iter = fUniformDataHash.find(ud); 38cb93a386Sopenharmony_ci if (iter != fUniformDataHash.end()) { 39cb93a386Sopenharmony_ci SkASSERT((*iter)->id() != UniformData::kInvalidUniformID); 40cb93a386Sopenharmony_ci return *iter; 41cb93a386Sopenharmony_ci } 42cb93a386Sopenharmony_ci 43cb93a386Sopenharmony_ci ud->setID(fNextUniqueID++); 44cb93a386Sopenharmony_ci fUniformDataHash.insert(ud); 45cb93a386Sopenharmony_ci fUniformDataVector.push_back(ud); 46cb93a386Sopenharmony_ci SkASSERT(fUniformDataVector[ud->id()] == ud); 47cb93a386Sopenharmony_ci return ud; 48cb93a386Sopenharmony_ci} 49cb93a386Sopenharmony_ci 50cb93a386Sopenharmony_cisk_sp<UniformData> UniformCache::lookup(uint32_t uniqueID) { 51cb93a386Sopenharmony_ci SkASSERT(uniqueID < fUniformDataVector.size()); 52cb93a386Sopenharmony_ci return fUniformDataVector[uniqueID]; 53cb93a386Sopenharmony_ci} 54cb93a386Sopenharmony_ci 55cb93a386Sopenharmony_ci} // namespace skgpu 56