Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
GlobalCache.h
Go to the documentation of this file.
1/*
2 * Copyright 2022 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#ifndef skgpu_graphite_GlobalCache_DEFINED
9#define skgpu_graphite_GlobalCache_DEFINED
10
13#include "src/base/SkSpinlock.h"
14#include "src/core/SkLRUCache.h"
15#include "src/gpu/ResourceKey.h"
16
17#include <functional>
18
19namespace skgpu::graphite {
20
21class ComputePipeline;
22class GraphicsPipeline;
23class Resource;
24class ShaderCodeDictionary;
25
26/**
27 * GlobalCache holds GPU resources that should be shared by every Recorder. The common requirement
28 * of these resources are they are static/read-only, have long lifetimes, and are likely to be used
29 * by multiple Recorders. The canonical example of this are pipelines.
30 *
31 * GlobalCache is thread safe, but intentionally splits queries and storing operations so that they
32 * are not atomic. The pattern is to query for a resource, which has a high likelihood of a cache
33 * hit. If it's not found, the Recorder creates the resource on its own, without locking the
34 * GlobalCache. After the resource is created, it is added to the GlobalCache, atomically returning
35 * the winning Resource in the event of a race between Recorders for the same UniqueKey.
36 */
38public:
41
42 void deleteResources();
43
44 // Find a cached GraphicsPipeline that matches the associated key.
46
47 // Associate the given pipeline with the key. If the key has already had a separate pipeline
48 // associated with the key, that pipeline is returned and the passed-in pipeline is discarded.
49 // Otherwise, the passed-in pipeline is held by the GlobalCache and also returned back.
52
53#if defined(GRAPHITE_TEST_UTILS)
54 int numGraphicsPipelines() const SK_EXCLUDES(fSpinLock);
55 void resetGraphicsPipelines() SK_EXCLUDES(fSpinLock);
56 void forEachGraphicsPipeline(
57 const std::function<void(const UniqueKey&, const GraphicsPipeline*)>& fn)
58 SK_EXCLUDES(fSpinLock);
59#endif
60
61 // Find and add operations for ComputePipelines, with the same pattern as GraphicsPipelines.
65
66 // The GlobalCache holds a ref on the given Resource until the cache is destroyed, keeping it
67 // alive for the lifetime of the SharedContext. This should be used only for Resources that are
68 // immutable after initialization so that anyone can use the resource without synchronization
69 // or reference tracking.
71
72private:
73 struct KeyHash {
74 uint32_t operator()(const UniqueKey& key) const { return key.hash(); }
75 };
76
79
80 // TODO: can we do something better given this should have write-seldom/read-often behavior?
81 mutable SkSpinlock fSpinLock;
82
83 // GraphicsPipelines and ComputePipelines are expensive to create, likely to be used by multiple
84 // Recorders, and are ideally pre-compiled on process startup so thread write-contention is
85 // expected to be low. For these reasons we store pipelines globally instead of per-Recorder.
86 GraphicsPipelineCache fGraphicsPipelineCache SK_GUARDED_BY(fSpinLock);
87 ComputePipelineCache fComputePipelineCache SK_GUARDED_BY(fSpinLock);
88
89 skia_private::TArray<sk_sp<Resource>> fStaticResource SK_GUARDED_BY(fSpinLock);
90};
91
92} // namespace skgpu::graphite
93
94#endif // skgpu_graphite_GlobalCache_DEFINED
#define SK_EXCLUDES(...)
#define SK_GUARDED_BY(x)
sk_sp< ComputePipeline > addComputePipeline(const UniqueKey &, sk_sp< ComputePipeline >) SK_EXCLUDES(fSpinLock)
sk_sp< ComputePipeline > findComputePipeline(const UniqueKey &) SK_EXCLUDES(fSpinLock)
void addStaticResource(sk_sp< Resource >) SK_EXCLUDES(fSpinLock)
sk_sp< GraphicsPipeline > addGraphicsPipeline(const UniqueKey &, sk_sp< GraphicsPipeline >) SK_EXCLUDES(fSpinLock)
sk_sp< GraphicsPipeline > findGraphicsPipeline(const UniqueKey &) SK_EXCLUDES(fSpinLock)