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_ResourceProvider_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker #define skgpu_graphite_ResourceProvider_DEFINED 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSize.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTileMode.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkLRUCache.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ResourceKey.h" 15*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/CommandBuffer.h" 16*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/GraphicsPipeline.h" 17*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/ResourceCache.h" 18*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/ResourceTypes.h" 19*c8dee2aaSAndroid Build Coastguard Worker 20*c8dee2aaSAndroid Build Coastguard Worker struct AHardwareBuffer; 21*c8dee2aaSAndroid Build Coastguard Worker struct SkSamplingOptions; 22*c8dee2aaSAndroid Build Coastguard Worker class SkTraceMemoryDump; 23*c8dee2aaSAndroid Build Coastguard Worker 24*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu { 25*c8dee2aaSAndroid Build Coastguard Worker class SingleOwner; 26*c8dee2aaSAndroid Build Coastguard Worker } 27*c8dee2aaSAndroid Build Coastguard Worker 28*c8dee2aaSAndroid Build Coastguard Worker namespace SkSL { 29*c8dee2aaSAndroid Build Coastguard Worker class Compiler; 30*c8dee2aaSAndroid Build Coastguard Worker } 31*c8dee2aaSAndroid Build Coastguard Worker 32*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu::graphite { 33*c8dee2aaSAndroid Build Coastguard Worker 34*c8dee2aaSAndroid Build Coastguard Worker class BackendTexture; 35*c8dee2aaSAndroid Build Coastguard Worker class Buffer; 36*c8dee2aaSAndroid Build Coastguard Worker class Caps; 37*c8dee2aaSAndroid Build Coastguard Worker class ComputePipeline; 38*c8dee2aaSAndroid Build Coastguard Worker class ComputePipelineDesc; 39*c8dee2aaSAndroid Build Coastguard Worker class GlobalCache; 40*c8dee2aaSAndroid Build Coastguard Worker class GraphicsPipelineDesc; 41*c8dee2aaSAndroid Build Coastguard Worker class GraphiteResourceKey; 42*c8dee2aaSAndroid Build Coastguard Worker class ResourceCache; 43*c8dee2aaSAndroid Build Coastguard Worker class RuntimeEffectDictionary; 44*c8dee2aaSAndroid Build Coastguard Worker class ShaderCodeDictionary; 45*c8dee2aaSAndroid Build Coastguard Worker class Sampler; 46*c8dee2aaSAndroid Build Coastguard Worker class SharedContext; 47*c8dee2aaSAndroid Build Coastguard Worker class Texture; 48*c8dee2aaSAndroid Build Coastguard Worker class TextureInfo; 49*c8dee2aaSAndroid Build Coastguard Worker 50*c8dee2aaSAndroid Build Coastguard Worker class ResourceProvider { 51*c8dee2aaSAndroid Build Coastguard Worker public: 52*c8dee2aaSAndroid Build Coastguard Worker virtual ~ResourceProvider(); 53*c8dee2aaSAndroid Build Coastguard Worker 54*c8dee2aaSAndroid Build Coastguard Worker // The runtime effect dictionary provides a link between SkCodeSnippetIds referenced in the 55*c8dee2aaSAndroid Build Coastguard Worker // paint key and the current SkRuntimeEffect that provides the SkSL for that id. 56*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GraphicsPipeline> findOrCreateGraphicsPipeline( 57*c8dee2aaSAndroid Build Coastguard Worker const RuntimeEffectDictionary*, 58*c8dee2aaSAndroid Build Coastguard Worker const GraphicsPipelineDesc&, 59*c8dee2aaSAndroid Build Coastguard Worker const RenderPassDesc&, 60*c8dee2aaSAndroid Build Coastguard Worker SkEnumBitMask<PipelineCreationFlags> = PipelineCreationFlags::kNone); 61*c8dee2aaSAndroid Build Coastguard Worker 62*c8dee2aaSAndroid Build Coastguard Worker sk_sp<ComputePipeline> findOrCreateComputePipeline(const ComputePipelineDesc&); 63*c8dee2aaSAndroid Build Coastguard Worker 64*c8dee2aaSAndroid Build Coastguard Worker sk_sp<Texture> findOrCreateScratchTexture(SkISize, 65*c8dee2aaSAndroid Build Coastguard Worker const TextureInfo&, 66*c8dee2aaSAndroid Build Coastguard Worker std::string_view label, 67*c8dee2aaSAndroid Build Coastguard Worker skgpu::Budgeted); 68*c8dee2aaSAndroid Build Coastguard Worker 69*c8dee2aaSAndroid Build Coastguard Worker sk_sp<Texture> createWrappedTexture(const BackendTexture&, std::string_view label); 70*c8dee2aaSAndroid Build Coastguard Worker 71*c8dee2aaSAndroid Build Coastguard Worker sk_sp<Texture> findOrCreateDepthStencilAttachment(SkISize dimensions, 72*c8dee2aaSAndroid Build Coastguard Worker const TextureInfo&); 73*c8dee2aaSAndroid Build Coastguard Worker 74*c8dee2aaSAndroid Build Coastguard Worker sk_sp<Texture> findOrCreateDiscardableMSAAAttachment(SkISize dimensions, 75*c8dee2aaSAndroid Build Coastguard Worker const TextureInfo&); 76*c8dee2aaSAndroid Build Coastguard Worker 77*c8dee2aaSAndroid Build Coastguard Worker sk_sp<Buffer> findOrCreateBuffer(size_t size, 78*c8dee2aaSAndroid Build Coastguard Worker BufferType type, 79*c8dee2aaSAndroid Build Coastguard Worker AccessPattern, 80*c8dee2aaSAndroid Build Coastguard Worker std::string_view label); 81*c8dee2aaSAndroid Build Coastguard Worker 82*c8dee2aaSAndroid Build Coastguard Worker sk_sp<Sampler> findOrCreateCompatibleSampler(const SamplerDesc&); 83*c8dee2aaSAndroid Build Coastguard Worker 84*c8dee2aaSAndroid Build Coastguard Worker BackendTexture createBackendTexture(SkISize dimensions, const TextureInfo&); 85*c8dee2aaSAndroid Build Coastguard Worker void deleteBackendTexture(const BackendTexture&); 86*c8dee2aaSAndroid Build Coastguard Worker proxyCache()87*c8dee2aaSAndroid Build Coastguard Worker ProxyCache* proxyCache() { return fResourceCache->proxyCache(); } 88*c8dee2aaSAndroid Build Coastguard Worker getResourceCacheLimit()89*c8dee2aaSAndroid Build Coastguard Worker size_t getResourceCacheLimit() const { return fResourceCache->getMaxBudget(); } getResourceCacheCurrentBudgetedBytes()90*c8dee2aaSAndroid Build Coastguard Worker size_t getResourceCacheCurrentBudgetedBytes() const { 91*c8dee2aaSAndroid Build Coastguard Worker return fResourceCache->currentBudgetedBytes(); 92*c8dee2aaSAndroid Build Coastguard Worker } getResourceCacheCurrentPurgeableBytes()93*c8dee2aaSAndroid Build Coastguard Worker size_t getResourceCacheCurrentPurgeableBytes() const { 94*c8dee2aaSAndroid Build Coastguard Worker return fResourceCache->currentPurgeableBytes(); 95*c8dee2aaSAndroid Build Coastguard Worker } 96*c8dee2aaSAndroid Build Coastguard Worker dumpMemoryStatistics(SkTraceMemoryDump * traceMemoryDump)97*c8dee2aaSAndroid Build Coastguard Worker void dumpMemoryStatistics(SkTraceMemoryDump* traceMemoryDump) const { 98*c8dee2aaSAndroid Build Coastguard Worker fResourceCache->dumpMemoryStatistics(traceMemoryDump); 99*c8dee2aaSAndroid Build Coastguard Worker } 100*c8dee2aaSAndroid Build Coastguard Worker 101*c8dee2aaSAndroid Build Coastguard Worker void freeGpuResources(); 102*c8dee2aaSAndroid Build Coastguard Worker void purgeResourcesNotUsedSince(StdSteadyClock::time_point purgeTime); 103*c8dee2aaSAndroid Build Coastguard Worker 104*c8dee2aaSAndroid Build Coastguard Worker #if defined(GPU_TEST_UTILS) resourceCache()105*c8dee2aaSAndroid Build Coastguard Worker ResourceCache* resourceCache() { return fResourceCache.get(); } sharedContext()106*c8dee2aaSAndroid Build Coastguard Worker const SharedContext* sharedContext() { return fSharedContext; } 107*c8dee2aaSAndroid Build Coastguard Worker #endif 108*c8dee2aaSAndroid Build Coastguard Worker 109*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_BUILD_FOR_ANDROID 110*c8dee2aaSAndroid Build Coastguard Worker virtual BackendTexture createBackendTexture(AHardwareBuffer*, 111*c8dee2aaSAndroid Build Coastguard Worker bool isRenderable, 112*c8dee2aaSAndroid Build Coastguard Worker bool isProtectedContent, 113*c8dee2aaSAndroid Build Coastguard Worker SkISize dimensions, 114*c8dee2aaSAndroid Build Coastguard Worker bool fromAndroidWindow) const; 115*c8dee2aaSAndroid Build Coastguard Worker #endif 116*c8dee2aaSAndroid Build Coastguard Worker 117*c8dee2aaSAndroid Build Coastguard Worker protected: 118*c8dee2aaSAndroid Build Coastguard Worker ResourceProvider(SharedContext* sharedContext, 119*c8dee2aaSAndroid Build Coastguard Worker SingleOwner* singleOwner, 120*c8dee2aaSAndroid Build Coastguard Worker uint32_t recorderID, 121*c8dee2aaSAndroid Build Coastguard Worker size_t resourceBudget); 122*c8dee2aaSAndroid Build Coastguard Worker 123*c8dee2aaSAndroid Build Coastguard Worker SharedContext* fSharedContext; 124*c8dee2aaSAndroid Build Coastguard Worker // Each ResourceProvider owns one local cache; for some resources it also refers out to the 125*c8dee2aaSAndroid Build Coastguard Worker // global cache of the SharedContext, which is assumed to outlive the ResourceProvider. 126*c8dee2aaSAndroid Build Coastguard Worker sk_sp<ResourceCache> fResourceCache; 127*c8dee2aaSAndroid Build Coastguard Worker 128*c8dee2aaSAndroid Build Coastguard Worker private: 129*c8dee2aaSAndroid Build Coastguard Worker virtual sk_sp<GraphicsPipeline> createGraphicsPipeline( 130*c8dee2aaSAndroid Build Coastguard Worker const RuntimeEffectDictionary*, 131*c8dee2aaSAndroid Build Coastguard Worker const GraphicsPipelineDesc&, 132*c8dee2aaSAndroid Build Coastguard Worker const RenderPassDesc&, 133*c8dee2aaSAndroid Build Coastguard Worker SkEnumBitMask<PipelineCreationFlags>) = 0; 134*c8dee2aaSAndroid Build Coastguard Worker virtual sk_sp<ComputePipeline> createComputePipeline(const ComputePipelineDesc&) = 0; 135*c8dee2aaSAndroid Build Coastguard Worker virtual sk_sp<Texture> createTexture(SkISize, 136*c8dee2aaSAndroid Build Coastguard Worker const TextureInfo&, 137*c8dee2aaSAndroid Build Coastguard Worker skgpu::Budgeted) = 0; 138*c8dee2aaSAndroid Build Coastguard Worker virtual sk_sp<Buffer> createBuffer(size_t size, BufferType type, AccessPattern) = 0; 139*c8dee2aaSAndroid Build Coastguard Worker virtual sk_sp<Sampler> createSampler(const SamplerDesc&) = 0; 140*c8dee2aaSAndroid Build Coastguard Worker 141*c8dee2aaSAndroid Build Coastguard Worker sk_sp<Texture> findOrCreateTextureWithKey(SkISize dimensions, 142*c8dee2aaSAndroid Build Coastguard Worker const TextureInfo& info, 143*c8dee2aaSAndroid Build Coastguard Worker const GraphiteResourceKey& key, 144*c8dee2aaSAndroid Build Coastguard Worker std::string_view label, 145*c8dee2aaSAndroid Build Coastguard Worker skgpu::Budgeted); 146*c8dee2aaSAndroid Build Coastguard Worker 147*c8dee2aaSAndroid Build Coastguard Worker virtual sk_sp<Texture> onCreateWrappedTexture(const BackendTexture&) = 0; 148*c8dee2aaSAndroid Build Coastguard Worker 149*c8dee2aaSAndroid Build Coastguard Worker virtual BackendTexture onCreateBackendTexture(SkISize dimensions, const TextureInfo&) = 0; 150*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_BUILD_FOR_ANDROID 151*c8dee2aaSAndroid Build Coastguard Worker virtual BackendTexture onCreateBackendTexture(AHardwareBuffer*, 152*c8dee2aaSAndroid Build Coastguard Worker bool isRenderable, 153*c8dee2aaSAndroid Build Coastguard Worker bool isProtectedContent, 154*c8dee2aaSAndroid Build Coastguard Worker SkISize dimensions, 155*c8dee2aaSAndroid Build Coastguard Worker bool fromAndroidWindow) const; 156*c8dee2aaSAndroid Build Coastguard Worker #endif 157*c8dee2aaSAndroid Build Coastguard Worker virtual void onDeleteBackendTexture(const BackendTexture&) = 0; 158*c8dee2aaSAndroid Build Coastguard Worker onFreeGpuResources()159*c8dee2aaSAndroid Build Coastguard Worker virtual void onFreeGpuResources() {} onPurgeResourcesNotUsedSince(StdSteadyClock::time_point purgeTime)160*c8dee2aaSAndroid Build Coastguard Worker virtual void onPurgeResourcesNotUsedSince(StdSteadyClock::time_point purgeTime) {} 161*c8dee2aaSAndroid Build Coastguard Worker }; 162*c8dee2aaSAndroid Build Coastguard Worker 163*c8dee2aaSAndroid Build Coastguard Worker } // namespace skgpu::graphite 164*c8dee2aaSAndroid Build Coastguard Worker 165*c8dee2aaSAndroid Build Coastguard Worker #endif // skgpu_graphite_ResourceProvider_DEFINED 166