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