xref: /aosp_15_r20/external/skia/src/gpu/graphite/TextureProxy.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker  * Copyright 2021 Google LLC
3*c8dee2aaSAndroid Build Coastguard Worker  *
4*c8dee2aaSAndroid Build Coastguard Worker  * Use of this source code is governed by a BSD-style license that can be
5*c8dee2aaSAndroid Build Coastguard Worker  * found in the LICENSE file.
6*c8dee2aaSAndroid Build Coastguard Worker  */
7*c8dee2aaSAndroid Build Coastguard Worker 
8*c8dee2aaSAndroid Build Coastguard Worker #ifndef skgpu_graphite_TextureProxy_DEFINED
9*c8dee2aaSAndroid Build Coastguard Worker #define skgpu_graphite_TextureProxy_DEFINED
10*c8dee2aaSAndroid Build Coastguard Worker 
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSize.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/graphite/TextureInfo.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkTo.h"
15*c8dee2aaSAndroid Build Coastguard Worker 
16*c8dee2aaSAndroid Build Coastguard Worker #include <functional>
17*c8dee2aaSAndroid Build Coastguard Worker 
18*c8dee2aaSAndroid Build Coastguard Worker enum SkColorType : int;
19*c8dee2aaSAndroid Build Coastguard Worker 
20*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu::graphite {
21*c8dee2aaSAndroid Build Coastguard Worker 
22*c8dee2aaSAndroid Build Coastguard Worker class Caps;
23*c8dee2aaSAndroid Build Coastguard Worker class Recorder;
24*c8dee2aaSAndroid Build Coastguard Worker class ResourceProvider;
25*c8dee2aaSAndroid Build Coastguard Worker class ScratchResourceManager;
26*c8dee2aaSAndroid Build Coastguard Worker class Texture;
27*c8dee2aaSAndroid Build Coastguard Worker 
28*c8dee2aaSAndroid Build Coastguard Worker class TextureProxy : public SkRefCnt {
29*c8dee2aaSAndroid Build Coastguard Worker public:
30*c8dee2aaSAndroid Build Coastguard Worker     TextureProxy() = delete;
31*c8dee2aaSAndroid Build Coastguard Worker 
32*c8dee2aaSAndroid Build Coastguard Worker     ~TextureProxy() override;
33*c8dee2aaSAndroid Build Coastguard Worker 
numSamples()34*c8dee2aaSAndroid Build Coastguard Worker     int numSamples() const { return fInfo.numSamples(); }
mipmapped()35*c8dee2aaSAndroid Build Coastguard Worker     Mipmapped mipmapped() const { return fInfo.mipmapped(); }
36*c8dee2aaSAndroid Build Coastguard Worker 
37*c8dee2aaSAndroid Build Coastguard Worker     SkISize dimensions() const;
textureInfo()38*c8dee2aaSAndroid Build Coastguard Worker     const TextureInfo& textureInfo() const { return fInfo; }
39*c8dee2aaSAndroid Build Coastguard Worker 
label()40*c8dee2aaSAndroid Build Coastguard Worker     const char* label() const { return fLabel.c_str(); }
41*c8dee2aaSAndroid Build Coastguard Worker 
42*c8dee2aaSAndroid Build Coastguard Worker     bool isLazy() const;
43*c8dee2aaSAndroid Build Coastguard Worker     bool isFullyLazy() const;
44*c8dee2aaSAndroid Build Coastguard Worker     bool isVolatile() const;
45*c8dee2aaSAndroid Build Coastguard Worker     bool isProtected() const;
46*c8dee2aaSAndroid Build Coastguard Worker 
47*c8dee2aaSAndroid Build Coastguard Worker     size_t uninstantiatedGpuMemorySize() const;
48*c8dee2aaSAndroid Build Coastguard Worker 
49*c8dee2aaSAndroid Build Coastguard Worker     bool instantiate(ResourceProvider*);
50*c8dee2aaSAndroid Build Coastguard Worker     /*
51*c8dee2aaSAndroid Build Coastguard Worker      * We currently only instantiate lazy proxies at insertion-time. Snap-time 'instantiate'
52*c8dee2aaSAndroid Build Coastguard Worker      * calls should be wrapped in 'InstantiateIfNotLazy'.
53*c8dee2aaSAndroid Build Coastguard Worker      *
54*c8dee2aaSAndroid Build Coastguard Worker      * Unlike Ganesh, in Graphite we do not update the proxy's dimensions with the instantiating
55*c8dee2aaSAndroid Build Coastguard Worker      * texture's dimensions. This means that when a fully-lazy proxy is instantiated and
56*c8dee2aaSAndroid Build Coastguard Worker      * deinstantiated, it goes back to being fully-lazy and without dimensions, and can be
57*c8dee2aaSAndroid Build Coastguard Worker      * re-instantiated with a new texture with different dimensions than the first.
58*c8dee2aaSAndroid Build Coastguard Worker      */
59*c8dee2aaSAndroid Build Coastguard Worker     bool lazyInstantiate(ResourceProvider*);
60*c8dee2aaSAndroid Build Coastguard Worker     /*
61*c8dee2aaSAndroid Build Coastguard Worker      * For Lazy proxies this will return true. Otherwise, it will return the result of
62*c8dee2aaSAndroid Build Coastguard Worker      * calling instantiate on the texture proxy.
63*c8dee2aaSAndroid Build Coastguard Worker      *
64*c8dee2aaSAndroid Build Coastguard Worker      * DEPRECATED: Eventually all un-instantiated non-lazy proxies should use the
65*c8dee2aaSAndroid Build Coastguard Worker      *             ScratchResourceManager function instead of the ResourceProvider directly.
66*c8dee2aaSAndroid Build Coastguard Worker      */
67*c8dee2aaSAndroid Build Coastguard Worker     static bool InstantiateIfNotLazy(ResourceProvider*, TextureProxy*);
68*c8dee2aaSAndroid Build Coastguard Worker 
69*c8dee2aaSAndroid Build Coastguard Worker     /*
70*c8dee2aaSAndroid Build Coastguard Worker      * Instantiate any scratch proxy (not already instantiated and not lazy) by using a texture
71*c8dee2aaSAndroid Build Coastguard Worker      * from the ScratchResourceManager. When possible, this will be a texture that has been returned
72*c8dee2aaSAndroid Build Coastguard Worker      * for reuse by a prior task. Lazy proxies and already instantiated proxies will return true.
73*c8dee2aaSAndroid Build Coastguard Worker      *
74*c8dee2aaSAndroid Build Coastguard Worker      * False is returned if instantiation fails.
75*c8dee2aaSAndroid Build Coastguard Worker      */
76*c8dee2aaSAndroid Build Coastguard Worker     static bool InstantiateIfNotLazy(ScratchResourceManager*, TextureProxy*);
77*c8dee2aaSAndroid Build Coastguard Worker 
isInstantiated()78*c8dee2aaSAndroid Build Coastguard Worker     bool isInstantiated() const { return SkToBool(fTexture); }
79*c8dee2aaSAndroid Build Coastguard Worker     void deinstantiate();
80*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<Texture> refTexture() const;
81*c8dee2aaSAndroid Build Coastguard Worker     const Texture* texture() const;
texture()82*c8dee2aaSAndroid Build Coastguard Worker     Texture* texture() { return fTexture.get(); }
83*c8dee2aaSAndroid Build Coastguard Worker 
84*c8dee2aaSAndroid Build Coastguard Worker     // Make() will immediately instantiate non-budgeted proxies.
85*c8dee2aaSAndroid Build Coastguard Worker     static sk_sp<TextureProxy> Make(const Caps*,
86*c8dee2aaSAndroid Build Coastguard Worker                                     ResourceProvider*,
87*c8dee2aaSAndroid Build Coastguard Worker                                     SkISize dimensions,
88*c8dee2aaSAndroid Build Coastguard Worker                                     const TextureInfo&,
89*c8dee2aaSAndroid Build Coastguard Worker                                     std::string_view label,
90*c8dee2aaSAndroid Build Coastguard Worker                                     skgpu::Budgeted);
91*c8dee2aaSAndroid Build Coastguard Worker 
92*c8dee2aaSAndroid Build Coastguard Worker     using LazyInstantiateCallback = std::function<sk_sp<Texture> (ResourceProvider*)>;
93*c8dee2aaSAndroid Build Coastguard Worker 
94*c8dee2aaSAndroid Build Coastguard Worker     static sk_sp<TextureProxy> MakeLazy(const Caps*,
95*c8dee2aaSAndroid Build Coastguard Worker                                         SkISize dimensions,
96*c8dee2aaSAndroid Build Coastguard Worker                                         const TextureInfo&,
97*c8dee2aaSAndroid Build Coastguard Worker                                         skgpu::Budgeted,
98*c8dee2aaSAndroid Build Coastguard Worker                                         Volatile,
99*c8dee2aaSAndroid Build Coastguard Worker                                         LazyInstantiateCallback&&);
100*c8dee2aaSAndroid Build Coastguard Worker     static sk_sp<TextureProxy> MakeFullyLazy(const TextureInfo&,
101*c8dee2aaSAndroid Build Coastguard Worker                                              skgpu::Budgeted,
102*c8dee2aaSAndroid Build Coastguard Worker                                              Volatile,
103*c8dee2aaSAndroid Build Coastguard Worker                                              LazyInstantiateCallback&&);
104*c8dee2aaSAndroid Build Coastguard Worker 
105*c8dee2aaSAndroid Build Coastguard Worker     static sk_sp<TextureProxy> Wrap(sk_sp<Texture>);
106*c8dee2aaSAndroid Build Coastguard Worker 
107*c8dee2aaSAndroid Build Coastguard Worker private:
108*c8dee2aaSAndroid Build Coastguard Worker     TextureProxy(SkISize dimensions,
109*c8dee2aaSAndroid Build Coastguard Worker                  const TextureInfo& info,
110*c8dee2aaSAndroid Build Coastguard Worker                  std::string_view label,
111*c8dee2aaSAndroid Build Coastguard Worker                  skgpu::Budgeted budgeted);
112*c8dee2aaSAndroid Build Coastguard Worker     TextureProxy(SkISize dimensions,
113*c8dee2aaSAndroid Build Coastguard Worker                  const TextureInfo&,
114*c8dee2aaSAndroid Build Coastguard Worker                  skgpu::Budgeted,
115*c8dee2aaSAndroid Build Coastguard Worker                  Volatile,
116*c8dee2aaSAndroid Build Coastguard Worker                  LazyInstantiateCallback&&);
117*c8dee2aaSAndroid Build Coastguard Worker     TextureProxy(sk_sp<Texture>);
118*c8dee2aaSAndroid Build Coastguard Worker 
119*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_DEBUG
120*c8dee2aaSAndroid Build Coastguard Worker     void validateTexture(const Texture*);
121*c8dee2aaSAndroid Build Coastguard Worker #endif
122*c8dee2aaSAndroid Build Coastguard Worker 
123*c8dee2aaSAndroid Build Coastguard Worker     // In the following, 'fVolatile' and 'fLazyInstantiateCallback' can be accessed from
124*c8dee2aaSAndroid Build Coastguard Worker     // multiple threads so need to remain immutable.
125*c8dee2aaSAndroid Build Coastguard Worker     SkISize fDimensions;
126*c8dee2aaSAndroid Build Coastguard Worker     const TextureInfo fInfo;
127*c8dee2aaSAndroid Build Coastguard Worker 
128*c8dee2aaSAndroid Build Coastguard Worker     // String used to describe the current use of this TextureProxy. It will be set on its
129*c8dee2aaSAndroid Build Coastguard Worker     // Texture object when the proxy gets instantiated.
130*c8dee2aaSAndroid Build Coastguard Worker     std::string fLabel;
131*c8dee2aaSAndroid Build Coastguard Worker 
132*c8dee2aaSAndroid Build Coastguard Worker     skgpu::Budgeted fBudgeted;
133*c8dee2aaSAndroid Build Coastguard Worker     const Volatile fVolatile;
134*c8dee2aaSAndroid Build Coastguard Worker 
135*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<Texture> fTexture;
136*c8dee2aaSAndroid Build Coastguard Worker 
137*c8dee2aaSAndroid Build Coastguard Worker     const LazyInstantiateCallback fLazyInstantiateCallback;
138*c8dee2aaSAndroid Build Coastguard Worker };
139*c8dee2aaSAndroid Build Coastguard Worker 
140*c8dee2aaSAndroid Build Coastguard Worker // Volatile texture proxy that deinstantiates itself on destruction.
141*c8dee2aaSAndroid Build Coastguard Worker class AutoDeinstantiateTextureProxy {
142*c8dee2aaSAndroid Build Coastguard Worker public:
AutoDeinstantiateTextureProxy(TextureProxy * textureProxy)143*c8dee2aaSAndroid Build Coastguard Worker     AutoDeinstantiateTextureProxy(TextureProxy* textureProxy) : fTextureProxy(textureProxy) {}
144*c8dee2aaSAndroid Build Coastguard Worker 
~AutoDeinstantiateTextureProxy()145*c8dee2aaSAndroid Build Coastguard Worker     ~AutoDeinstantiateTextureProxy() {
146*c8dee2aaSAndroid Build Coastguard Worker         if (fTextureProxy) {
147*c8dee2aaSAndroid Build Coastguard Worker             fTextureProxy->deinstantiate();
148*c8dee2aaSAndroid Build Coastguard Worker         }
149*c8dee2aaSAndroid Build Coastguard Worker     }
150*c8dee2aaSAndroid Build Coastguard Worker 
151*c8dee2aaSAndroid Build Coastguard Worker private:
152*c8dee2aaSAndroid Build Coastguard Worker     TextureProxy* const fTextureProxy;
153*c8dee2aaSAndroid Build Coastguard Worker };
154*c8dee2aaSAndroid Build Coastguard Worker 
155*c8dee2aaSAndroid Build Coastguard Worker }  // namespace skgpu::graphite
156*c8dee2aaSAndroid Build Coastguard Worker 
157*c8dee2aaSAndroid Build Coastguard Worker #endif // skgpu_graphite_TextureProxy_DEFINED
158