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#ifndef skgpu_UniformCache_DEFINED 9cb93a386Sopenharmony_ci#define skgpu_UniformCache_DEFINED 10cb93a386Sopenharmony_ci 11cb93a386Sopenharmony_ci#include <unordered_set> 12cb93a386Sopenharmony_ci#include <vector> 13cb93a386Sopenharmony_ci#include "include/core/SkRefCnt.h" 14cb93a386Sopenharmony_ci 15cb93a386Sopenharmony_cinamespace skgpu { 16cb93a386Sopenharmony_ci 17cb93a386Sopenharmony_ciclass UniformData; 18cb93a386Sopenharmony_ci 19cb93a386Sopenharmony_ciclass UniformCache { 20cb93a386Sopenharmony_cipublic: 21cb93a386Sopenharmony_ci UniformCache(); 22cb93a386Sopenharmony_ci 23cb93a386Sopenharmony_ci sk_sp<UniformData> findOrCreate(sk_sp<UniformData>); 24cb93a386Sopenharmony_ci 25cb93a386Sopenharmony_ci sk_sp<UniformData> lookup(uint32_t uniqueID); 26cb93a386Sopenharmony_ci 27cb93a386Sopenharmony_ci // The number of unique uniformdata objects in the cache 28cb93a386Sopenharmony_ci size_t count() const { 29cb93a386Sopenharmony_ci SkASSERT(fUniformDataHash.size()+1 == fUniformDataVector.size()); 30cb93a386Sopenharmony_ci return fUniformDataHash.size(); 31cb93a386Sopenharmony_ci } 32cb93a386Sopenharmony_ci 33cb93a386Sopenharmony_ciprivate: 34cb93a386Sopenharmony_ci struct Hash { 35cb93a386Sopenharmony_ci size_t operator()(sk_sp<UniformData>) const; 36cb93a386Sopenharmony_ci }; 37cb93a386Sopenharmony_ci struct Eq { 38cb93a386Sopenharmony_ci // This equality operator doesn't compare the UniformData's ids 39cb93a386Sopenharmony_ci bool operator()(sk_sp<UniformData>, sk_sp<UniformData>) const; 40cb93a386Sopenharmony_ci }; 41cb93a386Sopenharmony_ci 42cb93a386Sopenharmony_ci std::unordered_set<sk_sp<UniformData>, Hash, Eq> fUniformDataHash; 43cb93a386Sopenharmony_ci std::vector<sk_sp<UniformData>> fUniformDataVector; 44cb93a386Sopenharmony_ci // The UniformData's unique ID is only unique w/in a Recorder _not_ globally 45cb93a386Sopenharmony_ci uint32_t fNextUniqueID = 1; 46cb93a386Sopenharmony_ci}; 47cb93a386Sopenharmony_ci 48cb93a386Sopenharmony_ci} // namespace skgpu 49cb93a386Sopenharmony_ci 50cb93a386Sopenharmony_ci#endif // skgpu_UniformCache_DEFINED 51