1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2023 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_ProxyCache_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker #define skgpu_graphite_ProxyCache_DEFINED 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkMessageBus.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkTHash.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/GpuTypesPriv.h" 15*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ResourceKey.h" 16*c8dee2aaSAndroid Build Coastguard Worker 17*c8dee2aaSAndroid Build Coastguard Worker class SkBitmap; 18*c8dee2aaSAndroid Build Coastguard Worker 19*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu { 20*c8dee2aaSAndroid Build Coastguard Worker enum class Mipmapped : bool; 21*c8dee2aaSAndroid Build Coastguard Worker class UniqueKey; 22*c8dee2aaSAndroid Build Coastguard Worker } 23*c8dee2aaSAndroid Build Coastguard Worker 24*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu::graphite { 25*c8dee2aaSAndroid Build Coastguard Worker 26*c8dee2aaSAndroid Build Coastguard Worker class Recorder; 27*c8dee2aaSAndroid Build Coastguard Worker class TextureProxy; 28*c8dee2aaSAndroid Build Coastguard Worker 29*c8dee2aaSAndroid Build Coastguard Worker // This class encapsulates the _internal_ Recorder-local caching of utility proxies. 30*c8dee2aaSAndroid Build Coastguard Worker // For simplicity it does not support generating mipmapped cached proxies. Internal utility data 31*c8dee2aaSAndroid Build Coastguard Worker // does not typically require mipmapping, and unlike Ganesh, the internal proxy cache is not used 32*c8dee2aaSAndroid Build Coastguard Worker // for uploaded client-provided bitmaps (which may require generating mipmaps). 33*c8dee2aaSAndroid Build Coastguard Worker class ProxyCache { 34*c8dee2aaSAndroid Build Coastguard Worker public: 35*c8dee2aaSAndroid Build Coastguard Worker ProxyCache(uint32_t recorderID); 36*c8dee2aaSAndroid Build Coastguard Worker ~ProxyCache(); 37*c8dee2aaSAndroid Build Coastguard Worker 38*c8dee2aaSAndroid Build Coastguard Worker sk_sp<TextureProxy> findOrCreateCachedProxy(Recorder*, 39*c8dee2aaSAndroid Build Coastguard Worker const SkBitmap&, 40*c8dee2aaSAndroid Build Coastguard Worker std::string_view label); 41*c8dee2aaSAndroid Build Coastguard Worker 42*c8dee2aaSAndroid Build Coastguard Worker // Find or create a cached TextureProxy that's associated with an externally managed UniqueKey. 43*c8dee2aaSAndroid Build Coastguard Worker // If there is not a cached proxy available, the bitmap generator function will be called with 44*c8dee2aaSAndroid Build Coastguard Worker // the provided context argument. The successfully generated bitmap is then uploaded to a 45*c8dee2aaSAndroid Build Coastguard Worker // a new texture proxy on the Recorder and cached. If the bitmap generation fails, null is 46*c8dee2aaSAndroid Build Coastguard Worker // returned. 47*c8dee2aaSAndroid Build Coastguard Worker // 48*c8dee2aaSAndroid Build Coastguard Worker // The texture proxy's label defaults to the tag of the unique key if not otherwise provided. 49*c8dee2aaSAndroid Build Coastguard Worker using BitmapGeneratorContext = const void*; 50*c8dee2aaSAndroid Build Coastguard Worker using BitmapGeneratorFn = SkBitmap (*) (BitmapGeneratorContext); 51*c8dee2aaSAndroid Build Coastguard Worker sk_sp<TextureProxy> findOrCreateCachedProxy(Recorder* recorder, 52*c8dee2aaSAndroid Build Coastguard Worker const UniqueKey& key, 53*c8dee2aaSAndroid Build Coastguard Worker BitmapGeneratorContext context, 54*c8dee2aaSAndroid Build Coastguard Worker BitmapGeneratorFn fn, 55*c8dee2aaSAndroid Build Coastguard Worker std::string_view label = {}); 56*c8dee2aaSAndroid Build Coastguard Worker 57*c8dee2aaSAndroid Build Coastguard Worker void purgeAll(); 58*c8dee2aaSAndroid Build Coastguard Worker 59*c8dee2aaSAndroid Build Coastguard Worker #if defined(GPU_TEST_UTILS) 60*c8dee2aaSAndroid Build Coastguard Worker int numCached() const; 61*c8dee2aaSAndroid Build Coastguard Worker sk_sp<TextureProxy> find(const SkBitmap&); 62*c8dee2aaSAndroid Build Coastguard Worker void forceProcessInvalidKeyMsgs(); 63*c8dee2aaSAndroid Build Coastguard Worker void forceFreeUniquelyHeld(); 64*c8dee2aaSAndroid Build Coastguard Worker void forcePurgeProxiesNotUsedSince(skgpu::StdSteadyClock::time_point purgeTime); 65*c8dee2aaSAndroid Build Coastguard Worker #endif 66*c8dee2aaSAndroid Build Coastguard Worker 67*c8dee2aaSAndroid Build Coastguard Worker private: 68*c8dee2aaSAndroid Build Coastguard Worker friend class ResourceCache; // for freeUniquelyHeld 69*c8dee2aaSAndroid Build Coastguard Worker 70*c8dee2aaSAndroid Build Coastguard Worker void processInvalidKeyMsgs(); 71*c8dee2aaSAndroid Build Coastguard Worker void freeUniquelyHeld(); 72*c8dee2aaSAndroid Build Coastguard Worker void purgeProxiesNotUsedSince(const skgpu::StdSteadyClock::time_point* purgeTime); 73*c8dee2aaSAndroid Build Coastguard Worker struct UniqueKeyHash { 74*c8dee2aaSAndroid Build Coastguard Worker uint32_t operator()(const UniqueKey& key) const; 75*c8dee2aaSAndroid Build Coastguard Worker }; 76*c8dee2aaSAndroid Build Coastguard Worker 77*c8dee2aaSAndroid Build Coastguard Worker skia_private::THashMap<UniqueKey, sk_sp<TextureProxy>, UniqueKeyHash> fCache; 78*c8dee2aaSAndroid Build Coastguard Worker SkMessageBus<UniqueKeyInvalidatedMsg_Graphite, uint32_t>::Inbox fInvalidUniqueKeyInbox; 79*c8dee2aaSAndroid Build Coastguard Worker }; 80*c8dee2aaSAndroid Build Coastguard Worker 81*c8dee2aaSAndroid Build Coastguard Worker } // namespace skgpu::graphite 82*c8dee2aaSAndroid Build Coastguard Worker 83*c8dee2aaSAndroid Build Coastguard Worker #endif // skgpu_graphite_ProxyCache_DEFINED 84