Coverage Report

Created: 2024-05-20 07:14

/src/skia/tools/gpu/MemoryCache.h
Line
Count
Source (jump to first uncovered line)
1
/*
2
 * Copyright 2018 Google Inc.
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
#ifndef MemoryCache_DEFINED
9
#define MemoryCache_DEFINED
10
11
#include "include/core/SkData.h"
12
#include "include/gpu/GrContextOptions.h"
13
#include "src/core/SkChecksum.h"
14
15
#include <unordered_map>
16
17
namespace sk_gpu_test {
18
19
/**
20
 * This class can be used to maintain an in memory record of all programs cached by GrContext.
21
 * It can be shared by multiple GrContexts so long as those GrContexts are created with the same
22
 * options and will have the same GrCaps (e.g. same backend, same GL context creation parameters,
23
 * ...).
24
 */
25
class MemoryCache : public GrContextOptions::PersistentCache {
26
public:
27
    MemoryCache() = default;
28
    MemoryCache(const MemoryCache&) = delete;
29
    MemoryCache& operator=(const MemoryCache&) = delete;
30
0
    void reset() {
31
0
        this->resetCacheStats();
32
0
        fMap.clear();
33
0
    }
34
35
    sk_sp<SkData> load(const SkData& key) override;
36
    void store(const SkData& key, const SkData& data, const SkString& description) override;
37
0
    int numCacheMisses() const { return fCacheMissCnt; }
38
0
    int numCacheStores() const { return fCacheStoreCnt; }
39
0
    void resetCacheStats() {
40
0
        fCacheMissCnt = 0;
41
0
        fCacheStoreCnt = 0;
42
0
    }
43
44
    void writeShadersToDisk(const char* path, GrBackendApi backend);
45
46
    template <typename Fn>
47
    void foreach(Fn&& fn) {
48
        for (auto it = fMap.begin(); it != fMap.end(); ++it) {
49
            fn(it->first.fKey, it->second.fData, it->second.fDescription, it->second.fHitCount);
50
        }
51
    }
52
53
private:
54
    struct Key {
55
        Key() = default;
56
0
        Key(const SkData& key) : fKey(SkData::MakeWithCopy(key.data(), key.size())) {}
57
0
        Key(const Key& that) = default;
58
        Key& operator=(const Key&) = default;
59
0
        bool operator==(const Key& that) const {
60
0
            return that.fKey->size() == fKey->size() &&
61
0
                   !memcmp(fKey->data(), that.fKey->data(), that.fKey->size());
62
0
        }
63
        sk_sp<const SkData> fKey;
64
    };
65
66
    struct Value {
67
0
        Value() = default;
68
        Value(const SkData& data, const SkString& description)
69
            : fData(SkData::MakeWithCopy(data.data(), data.size()))
70
            , fDescription(description)
71
0
            , fHitCount(1) {}
72
        Value(const Value& that) = default;
73
0
        Value& operator=(const Value&) = default;
74
75
        sk_sp<SkData> fData;
76
        SkString      fDescription;
77
        int           fHitCount;
78
    };
79
80
    struct Hash {
81
        using argument_type = Key;
82
        using result_type = uint32_t;
83
0
        uint32_t operator()(const Key& key) const {
84
0
            return key.fKey ? SkChecksum::Hash32(key.fKey->data(), key.fKey->size()) : 0;
85
0
        }
86
    };
87
88
    int fCacheMissCnt = 0;
89
    int fCacheStoreCnt = 0;
90
    std::unordered_map<Key, Value, Hash> fMap;
91
};
92
93
}  // namespace sk_gpu_test
94
95
#endif