1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2018 Google Inc. 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 GrMtlResourceProvider_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker #define GrMtlResourceProvider_DEFINED 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkTArray.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "src/base/SkSpinlock.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkChecksum.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkLRUCache.h" 15*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkTDynamicHash.h" 16*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrProgramDesc.h" 17*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrThreadSafePipelineBuilder.h" 18*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/mtl/GrMtlDepthStencil.h" 19*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/mtl/GrMtlPipeline.h" 20*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/mtl/GrMtlPipelineStateBuilder.h" 21*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/mtl/GrMtlSampler.h" 22*c8dee2aaSAndroid Build Coastguard Worker 23*c8dee2aaSAndroid Build Coastguard Worker #import <Metal/Metal.h> 24*c8dee2aaSAndroid Build Coastguard Worker 25*c8dee2aaSAndroid Build Coastguard Worker class GrMtlGpu; 26*c8dee2aaSAndroid Build Coastguard Worker class GrMtlCommandBuffer; 27*c8dee2aaSAndroid Build Coastguard Worker 28*c8dee2aaSAndroid Build Coastguard Worker class GrMtlResourceProvider { 29*c8dee2aaSAndroid Build Coastguard Worker public: 30*c8dee2aaSAndroid Build Coastguard Worker GrMtlResourceProvider(GrMtlGpu* gpu); 31*c8dee2aaSAndroid Build Coastguard Worker 32*c8dee2aaSAndroid Build Coastguard Worker GrMtlPipelineState* findOrCreateCompatiblePipelineState( 33*c8dee2aaSAndroid Build Coastguard Worker const GrProgramDesc&,const GrProgramInfo&, 34*c8dee2aaSAndroid Build Coastguard Worker GrThreadSafePipelineBuilder::Stats::ProgramCacheResult* stat = nullptr); 35*c8dee2aaSAndroid Build Coastguard Worker bool precompileShader(const SkData& key, const SkData& data); 36*c8dee2aaSAndroid Build Coastguard Worker 37*c8dee2aaSAndroid Build Coastguard Worker // Finds or creates a compatible MTLDepthStencilState based on the GrStencilSettings. 38*c8dee2aaSAndroid Build Coastguard Worker GrMtlDepthStencil* findOrCreateCompatibleDepthStencilState(const GrStencilSettings&, 39*c8dee2aaSAndroid Build Coastguard Worker GrSurfaceOrigin); 40*c8dee2aaSAndroid Build Coastguard Worker 41*c8dee2aaSAndroid Build Coastguard Worker // Finds or creates a compatible MTLSamplerState based on the GrSamplerState. 42*c8dee2aaSAndroid Build Coastguard Worker GrMtlSampler* findOrCreateCompatibleSampler(GrSamplerState); 43*c8dee2aaSAndroid Build Coastguard Worker 44*c8dee2aaSAndroid Build Coastguard Worker const GrMtlRenderPipeline* findOrCreateMSAALoadPipeline(MTLPixelFormat colorFormat, 45*c8dee2aaSAndroid Build Coastguard Worker int sampleCount, 46*c8dee2aaSAndroid Build Coastguard Worker MTLPixelFormat stencilFormat); 47*c8dee2aaSAndroid Build Coastguard Worker 48*c8dee2aaSAndroid Build Coastguard Worker // Destroy any cached resources. To be called before releasing the MtlDevice. 49*c8dee2aaSAndroid Build Coastguard Worker void destroyResources(); 50*c8dee2aaSAndroid Build Coastguard Worker 51*c8dee2aaSAndroid Build Coastguard Worker #if defined(GPU_TEST_UTILS) resetShaderCacheForTesting()52*c8dee2aaSAndroid Build Coastguard Worker void resetShaderCacheForTesting() const { fPipelineStateCache->release(); } 53*c8dee2aaSAndroid Build Coastguard Worker #endif 54*c8dee2aaSAndroid Build Coastguard Worker 55*c8dee2aaSAndroid Build Coastguard Worker private: 56*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_DEBUG 57*c8dee2aaSAndroid Build Coastguard Worker #define GR_PIPELINE_STATE_CACHE_STATS 58*c8dee2aaSAndroid Build Coastguard Worker #endif 59*c8dee2aaSAndroid Build Coastguard Worker 60*c8dee2aaSAndroid Build Coastguard Worker class PipelineStateCache : public GrThreadSafePipelineBuilder { 61*c8dee2aaSAndroid Build Coastguard Worker public: 62*c8dee2aaSAndroid Build Coastguard Worker PipelineStateCache(GrMtlGpu* gpu); 63*c8dee2aaSAndroid Build Coastguard Worker ~PipelineStateCache() override; 64*c8dee2aaSAndroid Build Coastguard Worker 65*c8dee2aaSAndroid Build Coastguard Worker void release(); 66*c8dee2aaSAndroid Build Coastguard Worker GrMtlPipelineState* refPipelineState(const GrProgramDesc&, const GrProgramInfo&, 67*c8dee2aaSAndroid Build Coastguard Worker Stats::ProgramCacheResult*); 68*c8dee2aaSAndroid Build Coastguard Worker bool precompileShader(const SkData& key, const SkData& data); 69*c8dee2aaSAndroid Build Coastguard Worker 70*c8dee2aaSAndroid Build Coastguard Worker private: 71*c8dee2aaSAndroid Build Coastguard Worker GrMtlPipelineState* onRefPipelineState(const GrProgramDesc&, const GrProgramInfo&, 72*c8dee2aaSAndroid Build Coastguard Worker Stats::ProgramCacheResult*); 73*c8dee2aaSAndroid Build Coastguard Worker 74*c8dee2aaSAndroid Build Coastguard Worker struct Entry; 75*c8dee2aaSAndroid Build Coastguard Worker 76*c8dee2aaSAndroid Build Coastguard Worker struct DescHash { operatorDescHash77*c8dee2aaSAndroid Build Coastguard Worker uint32_t operator()(const GrProgramDesc& desc) const { 78*c8dee2aaSAndroid Build Coastguard Worker return SkChecksum::Hash32(desc.asKey(), desc.keyLength()); 79*c8dee2aaSAndroid Build Coastguard Worker } 80*c8dee2aaSAndroid Build Coastguard Worker }; 81*c8dee2aaSAndroid Build Coastguard Worker 82*c8dee2aaSAndroid Build Coastguard Worker SkLRUCache<const GrProgramDesc, std::unique_ptr<Entry>, DescHash> fMap; 83*c8dee2aaSAndroid Build Coastguard Worker 84*c8dee2aaSAndroid Build Coastguard Worker GrMtlGpu* fGpu; 85*c8dee2aaSAndroid Build Coastguard Worker }; 86*c8dee2aaSAndroid Build Coastguard Worker 87*c8dee2aaSAndroid Build Coastguard Worker GrMtlGpu* fGpu; 88*c8dee2aaSAndroid Build Coastguard Worker 89*c8dee2aaSAndroid Build Coastguard Worker // Cache of GrMtlPipelineStates 90*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<PipelineStateCache> fPipelineStateCache; 91*c8dee2aaSAndroid Build Coastguard Worker 92*c8dee2aaSAndroid Build Coastguard Worker SkTDynamicHash<GrMtlSampler, GrMtlSampler::Key> fSamplers; 93*c8dee2aaSAndroid Build Coastguard Worker SkTDynamicHash<GrMtlDepthStencil, GrMtlDepthStencil::Key> fDepthStencilStates; 94*c8dee2aaSAndroid Build Coastguard Worker 95*c8dee2aaSAndroid Build Coastguard Worker struct MSAALoadPipelineEntry { 96*c8dee2aaSAndroid Build Coastguard Worker sk_sp<const GrMtlRenderPipeline> fPipeline; 97*c8dee2aaSAndroid Build Coastguard Worker MTLPixelFormat fColorFormat; 98*c8dee2aaSAndroid Build Coastguard Worker int fSampleCount; 99*c8dee2aaSAndroid Build Coastguard Worker MTLPixelFormat fStencilFormat; 100*c8dee2aaSAndroid Build Coastguard Worker }; 101*c8dee2aaSAndroid Build Coastguard Worker id<MTLLibrary> fMSAALoadLibrary; 102*c8dee2aaSAndroid Build Coastguard Worker skia_private::TArray<MSAALoadPipelineEntry> fMSAALoadPipelines; 103*c8dee2aaSAndroid Build Coastguard Worker }; 104*c8dee2aaSAndroid Build Coastguard Worker 105*c8dee2aaSAndroid Build Coastguard Worker #endif 106