blob: ed20e59a528f747f0d290d2d0a796b5b1fe43f36 [file] [log] [blame]
Timothy Liange30739a2018-07-31 10:51:17 -04001/*
2 * Copyright 2018 Google Inc.
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 GrMtlResourceProvider_DEFINED
9#define GrMtlResourceProvider_DEFINED
10
Mike Kleinc0bd9f92019-04-23 12:05:21 -050011#include "include/private/SkTArray.h"
12#include "src/core/SkLRUCache.h"
13#include "src/gpu/mtl/GrMtlCopyPipelineState.h"
Jim Van Verth75c53262019-04-26 12:23:51 -040014#include "src/gpu/mtl/GrMtlDepthStencil.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050015#include "src/gpu/mtl/GrMtlPipelineStateBuilder.h"
Jim Van Verth75c53262019-04-26 12:23:51 -040016#include "src/gpu/mtl/GrMtlSampler.h"
Timothy Liange30739a2018-07-31 10:51:17 -040017
18#import <metal/metal.h>
19
20class GrMtlGpu;
21
22class GrMtlResourceProvider {
23public:
Jim Van Verth1223e7f2019-02-28 17:38:35 -050024 GrMtlResourceProvider(GrMtlGpu* gpu);
Timothy Liange30739a2018-07-31 10:51:17 -040025
26 GrMtlCopyPipelineState* findOrCreateCopyPipelineState(MTLPixelFormat dstPixelFormat,
27 id<MTLFunction> vertexFunction,
28 id<MTLFunction> fragmentFunction,
29 MTLVertexDescriptor* vertexDescriptor);
30
Jim Van Verth1223e7f2019-02-28 17:38:35 -050031 GrMtlPipelineState* findOrCreateCompatiblePipelineState(
32 GrRenderTarget*, GrSurfaceOrigin,
33 const GrPipeline&,
34 const GrPrimitiveProcessor&,
35 const GrTextureProxy* const primProcProxies[],
36 GrPrimitiveType);
37
Jim Van Verth75c53262019-04-26 12:23:51 -040038 // Finds or creates a compatible MTLDepthStencilState based on the GrStencilSettings.
39 GrMtlDepthStencil* findOrCreateCompatibleDepthStencilState(const GrStencilSettings&,
40 GrSurfaceOrigin);
41
42 // Finds or creates a compatible MTLSamplerState based on the GrSamplerState.
43 GrMtlSampler* findOrCreateCompatibleSampler(const GrSamplerState&, uint32_t maxMipLevel);
44
Jim Van Verth35a67eb2019-05-03 10:58:40 -040045 id<MTLBuffer> getDynamicBuffer(size_t size, size_t* offset);
46
Jim Van Verthcf23f582019-05-22 09:46:57 -040047 // Destroy any cached resources. To be called before releasing the MtlDevice.
48 void destroyResources();
49
Timothy Liange30739a2018-07-31 10:51:17 -040050private:
Jim Van Verth1223e7f2019-02-28 17:38:35 -050051#ifdef SK_DEBUG
52#define GR_PIPELINE_STATE_CACHE_STATS
53#endif
54
55 class PipelineStateCache : public ::SkNoncopyable {
56 public:
57 PipelineStateCache(GrMtlGpu* gpu);
58 ~PipelineStateCache();
59
Jim Van Verthcf23f582019-05-22 09:46:57 -040060 void release();
Jim Van Verth1223e7f2019-02-28 17:38:35 -050061 GrMtlPipelineState* refPipelineState(GrRenderTarget*, GrSurfaceOrigin,
62 const GrPrimitiveProcessor&,
63 const GrTextureProxy* const primProcProxies[],
64 const GrPipeline&,
65 GrPrimitiveType);
66
67 private:
68 enum {
69 // We may actually have kMaxEntries+1 PipelineStates in context because we create a new
70 // PipelineState before evicting from the cache.
71 kMaxEntries = 128,
72 };
73
74 struct Entry;
75
76 struct DescHash {
77 uint32_t operator()(const GrProgramDesc& desc) const {
78 return SkOpts::hash_fn(desc.asKey(), desc.keyLength(), 0);
79 }
80 };
81
82 SkLRUCache<const GrMtlPipelineStateBuilder::Desc, std::unique_ptr<Entry>, DescHash> fMap;
83
84 GrMtlGpu* fGpu;
85
86#ifdef GR_PIPELINE_STATE_CACHE_STATS
87 int fTotalRequests;
88 int fCacheMisses;
89#endif
90 };
91
Timothy Liange30739a2018-07-31 10:51:17 -040092 SkTArray<std::unique_ptr<GrMtlCopyPipelineState>> fCopyPipelineStateCache;
93
94 GrMtlGpu* fGpu;
Jim Van Verth1223e7f2019-02-28 17:38:35 -050095
96 // Cache of GrMtlPipelineStates
97 std::unique_ptr<PipelineStateCache> fPipelineStateCache;
Jim Van Verth75c53262019-04-26 12:23:51 -040098
99 SkTDynamicHash<GrMtlSampler, GrMtlSampler::Key> fSamplers;
100 SkTDynamicHash<GrMtlDepthStencil, GrMtlDepthStencil::Key> fDepthStencilStates;
Jim Van Verth35a67eb2019-05-03 10:58:40 -0400101
102 // Buffer state
103 struct BufferState {
104 id<MTLBuffer> fAllocation;
105 size_t fAllocationSize;
106 size_t fNextOffset;
107 };
108 BufferState fBufferState;
Timothy Liange30739a2018-07-31 10:51:17 -0400109};
110
111#endif