• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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) const15 size_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) const23 bool 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()31 UniformCache::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() const39 void 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)49 uint32_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)64 SkUniformBlock* UniformCache::lookup(uint32_t uniqueID) {
65     SkASSERT(uniqueID < fUniformBlock.size());
66     return fUniformBlock[uniqueID].get();
67 }
68 
69 } // namespace skgpu
70