xref: /aosp_15_r20/external/skia/src/gpu/ganesh/mtl/GrMtlGpu.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker  * Copyright 2017 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 GrMtlGpu_DEFINED
9*c8dee2aaSAndroid Build Coastguard Worker #define GrMtlGpu_DEFINED
10*c8dee2aaSAndroid Build Coastguard Worker 
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/mtl/GrMtlBackendContext.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkDeque.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/mtl/GrMtlTypesPriv.h"
14*c8dee2aaSAndroid Build Coastguard Worker 
15*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrGpu.h"
16*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrRenderTarget.h"
17*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrRingBuffer.h"
18*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrSemaphore.h"
19*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrStagingBufferManager.h"
20*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrTexture.h"
21*c8dee2aaSAndroid Build Coastguard Worker 
22*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/mtl/GrMtlAttachment.h"
23*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/mtl/GrMtlCaps.h"
24*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/mtl/GrMtlCommandBuffer.h"
25*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/mtl/GrMtlResourceProvider.h"
26*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/mtl/GrMtlUtil.h"
27*c8dee2aaSAndroid Build Coastguard Worker 
28*c8dee2aaSAndroid Build Coastguard Worker #import <Metal/Metal.h>
29*c8dee2aaSAndroid Build Coastguard Worker 
30*c8dee2aaSAndroid Build Coastguard Worker class GrMtlOpsRenderPass;
31*c8dee2aaSAndroid Build Coastguard Worker class GrMtlTexture;
32*c8dee2aaSAndroid Build Coastguard Worker class GrSemaphore;
33*c8dee2aaSAndroid Build Coastguard Worker class GrMtlCommandBuffer;
34*c8dee2aaSAndroid Build Coastguard Worker 
35*c8dee2aaSAndroid Build Coastguard Worker class GrMtlGpu : public GrGpu {
36*c8dee2aaSAndroid Build Coastguard Worker public:
37*c8dee2aaSAndroid Build Coastguard Worker     static std::unique_ptr<GrGpu> Make(const GrMtlBackendContext&,
38*c8dee2aaSAndroid Build Coastguard Worker                                        const GrContextOptions&,
39*c8dee2aaSAndroid Build Coastguard Worker                                        GrDirectContext*);
40*c8dee2aaSAndroid Build Coastguard Worker     ~GrMtlGpu() override;
41*c8dee2aaSAndroid Build Coastguard Worker 
42*c8dee2aaSAndroid Build Coastguard Worker     void disconnect(DisconnectType) override;
43*c8dee2aaSAndroid Build Coastguard Worker 
44*c8dee2aaSAndroid Build Coastguard Worker     GrThreadSafePipelineBuilder* pipelineBuilder() override;
45*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<GrThreadSafePipelineBuilder> refPipelineBuilder() override;
46*c8dee2aaSAndroid Build Coastguard Worker 
mtlCaps()47*c8dee2aaSAndroid Build Coastguard Worker     const GrMtlCaps& mtlCaps() const { return *fMtlCaps; }
48*c8dee2aaSAndroid Build Coastguard Worker 
device()49*c8dee2aaSAndroid Build Coastguard Worker     id<MTLDevice> device() const { return fDevice; }
50*c8dee2aaSAndroid Build Coastguard Worker 
resourceProvider()51*c8dee2aaSAndroid Build Coastguard Worker     GrMtlResourceProvider& resourceProvider() { return fResourceProvider; }
52*c8dee2aaSAndroid Build Coastguard Worker 
stagingBufferManager()53*c8dee2aaSAndroid Build Coastguard Worker     GrStagingBufferManager* stagingBufferManager() override { return &fStagingBufferManager; }
54*c8dee2aaSAndroid Build Coastguard Worker 
55*c8dee2aaSAndroid Build Coastguard Worker     GrMtlCommandBuffer* commandBuffer();
56*c8dee2aaSAndroid Build Coastguard Worker 
57*c8dee2aaSAndroid Build Coastguard Worker     enum SyncQueue {
58*c8dee2aaSAndroid Build Coastguard Worker         kForce_SyncQueue,
59*c8dee2aaSAndroid Build Coastguard Worker         kSkip_SyncQueue
60*c8dee2aaSAndroid Build Coastguard Worker     };
61*c8dee2aaSAndroid Build Coastguard Worker 
62*c8dee2aaSAndroid Build Coastguard Worker     void deleteBackendTexture(const GrBackendTexture&) override;
63*c8dee2aaSAndroid Build Coastguard Worker 
64*c8dee2aaSAndroid Build Coastguard Worker     bool compile(const GrProgramDesc&, const GrProgramInfo&) override;
65*c8dee2aaSAndroid Build Coastguard Worker 
66*c8dee2aaSAndroid Build Coastguard Worker     bool precompileShader(const SkData& key, const SkData& data) override;
67*c8dee2aaSAndroid Build Coastguard Worker 
68*c8dee2aaSAndroid Build Coastguard Worker #if defined(GPU_TEST_UTILS)
69*c8dee2aaSAndroid Build Coastguard Worker     bool isTestingOnlyBackendTexture(const GrBackendTexture&) const override;
70*c8dee2aaSAndroid Build Coastguard Worker 
71*c8dee2aaSAndroid Build Coastguard Worker     GrBackendRenderTarget createTestingOnlyBackendRenderTarget(SkISize dimensions,
72*c8dee2aaSAndroid Build Coastguard Worker                                                                GrColorType,
73*c8dee2aaSAndroid Build Coastguard Worker                                                                int sampleCnt,
74*c8dee2aaSAndroid Build Coastguard Worker                                                                GrProtected) override;
75*c8dee2aaSAndroid Build Coastguard Worker     void deleteTestingOnlyBackendRenderTarget(const GrBackendRenderTarget&) override;
76*c8dee2aaSAndroid Build Coastguard Worker 
resetShaderCacheForTesting()77*c8dee2aaSAndroid Build Coastguard Worker     void resetShaderCacheForTesting() const override {
78*c8dee2aaSAndroid Build Coastguard Worker         fResourceProvider.resetShaderCacheForTesting();
79*c8dee2aaSAndroid Build Coastguard Worker     }
80*c8dee2aaSAndroid Build Coastguard Worker #endif
81*c8dee2aaSAndroid Build Coastguard Worker 
82*c8dee2aaSAndroid Build Coastguard Worker     void copySurfaceAsResolve(GrSurface* dst, GrSurface* src);
83*c8dee2aaSAndroid Build Coastguard Worker 
84*c8dee2aaSAndroid Build Coastguard Worker     void copySurfaceAsBlit(GrSurface* dst, GrSurface* src,
85*c8dee2aaSAndroid Build Coastguard Worker                            GrMtlAttachment* dstAttachment, GrMtlAttachment* srcAttachment,
86*c8dee2aaSAndroid Build Coastguard Worker                            const SkIRect& srcRect, const SkIPoint& dstPoint);
87*c8dee2aaSAndroid Build Coastguard Worker 
88*c8dee2aaSAndroid Build Coastguard Worker     bool onCopySurface(GrSurface* dst, const SkIRect& dstRect,
89*c8dee2aaSAndroid Build Coastguard Worker                        GrSurface* src, const SkIRect& srcRect,
90*c8dee2aaSAndroid Build Coastguard Worker                        GrSamplerState::Filter) override;
91*c8dee2aaSAndroid Build Coastguard Worker 
92*c8dee2aaSAndroid Build Coastguard Worker     void submit(GrOpsRenderPass* renderPass) override;
93*c8dee2aaSAndroid Build Coastguard Worker 
94*c8dee2aaSAndroid Build Coastguard Worker     [[nodiscard]] std::unique_ptr<GrSemaphore> makeSemaphore(bool isOwned) override;
95*c8dee2aaSAndroid Build Coastguard Worker     std::unique_ptr<GrSemaphore> wrapBackendSemaphore(const GrBackendSemaphore&,
96*c8dee2aaSAndroid Build Coastguard Worker                                                       GrSemaphoreWrapType,
97*c8dee2aaSAndroid Build Coastguard Worker                                                       GrWrapOwnership) override;
98*c8dee2aaSAndroid Build Coastguard Worker     void insertSemaphore(GrSemaphore* semaphore) override;
99*c8dee2aaSAndroid Build Coastguard Worker     void waitSemaphore(GrSemaphore* semaphore) override;
checkFinishedCallbacks()100*c8dee2aaSAndroid Build Coastguard Worker     void checkFinishedCallbacks() override { this->checkForFinishedCommandBuffers(); }
101*c8dee2aaSAndroid Build Coastguard Worker     void finishOutstandingGpuWork() override;
102*c8dee2aaSAndroid Build Coastguard Worker     std::unique_ptr<GrSemaphore> prepareTextureForCrossContextUsage(GrTexture*) override;
103*c8dee2aaSAndroid Build Coastguard Worker 
104*c8dee2aaSAndroid Build Coastguard Worker     GrMtlRenderCommandEncoder* loadMSAAFromResolve(GrAttachment* dst,
105*c8dee2aaSAndroid Build Coastguard Worker                                                    GrMtlAttachment* src,
106*c8dee2aaSAndroid Build Coastguard Worker                                                    const SkIRect& srcRect,
107*c8dee2aaSAndroid Build Coastguard Worker                                                    MTLRenderPassStencilAttachmentDescriptor*);
108*c8dee2aaSAndroid Build Coastguard Worker 
109*c8dee2aaSAndroid Build Coastguard Worker     // When the Metal backend actually uses indirect command buffers, this function will actually do
110*c8dee2aaSAndroid Build Coastguard Worker     // what it says. For now, every command is encoded directly into the primary command buffer, so
111*c8dee2aaSAndroid Build Coastguard Worker     // this function is pretty useless, except for indicating that a render target has been drawn
112*c8dee2aaSAndroid Build Coastguard Worker     // to.
submitIndirectCommandBuffer(GrSurface * surface,GrSurfaceOrigin origin,const SkIRect * bounds)113*c8dee2aaSAndroid Build Coastguard Worker     void submitIndirectCommandBuffer(GrSurface* surface, GrSurfaceOrigin origin,
114*c8dee2aaSAndroid Build Coastguard Worker                                      const SkIRect* bounds) {
115*c8dee2aaSAndroid Build Coastguard Worker         this->didWriteToSurface(surface, origin, bounds);
116*c8dee2aaSAndroid Build Coastguard Worker     }
117*c8dee2aaSAndroid Build Coastguard Worker 
uniformsRingBuffer()118*c8dee2aaSAndroid Build Coastguard Worker     GrRingBuffer* uniformsRingBuffer() override { return &fUniformsRingBuffer; }
119*c8dee2aaSAndroid Build Coastguard Worker 
120*c8dee2aaSAndroid Build Coastguard Worker private:
121*c8dee2aaSAndroid Build Coastguard Worker     GrMtlGpu(GrDirectContext*, const GrContextOptions&, id<MTLDevice>, id<MTLCommandQueue>);
122*c8dee2aaSAndroid Build Coastguard Worker 
123*c8dee2aaSAndroid Build Coastguard Worker     void destroyResources();
124*c8dee2aaSAndroid Build Coastguard Worker 
xferBarrier(GrRenderTarget *,GrXferBarrierType)125*c8dee2aaSAndroid Build Coastguard Worker     void xferBarrier(GrRenderTarget*, GrXferBarrierType) override {}
126*c8dee2aaSAndroid Build Coastguard Worker 
127*c8dee2aaSAndroid Build Coastguard Worker     void takeOwnershipOfBuffer(sk_sp<GrGpuBuffer>) override;
128*c8dee2aaSAndroid Build Coastguard Worker 
129*c8dee2aaSAndroid Build Coastguard Worker     GrBackendTexture onCreateBackendTexture(SkISize dimensions,
130*c8dee2aaSAndroid Build Coastguard Worker                                             const GrBackendFormat&,
131*c8dee2aaSAndroid Build Coastguard Worker                                             GrRenderable,
132*c8dee2aaSAndroid Build Coastguard Worker                                             skgpu::Mipmapped,
133*c8dee2aaSAndroid Build Coastguard Worker                                             GrProtected,
134*c8dee2aaSAndroid Build Coastguard Worker                                             std::string_view label) override;
135*c8dee2aaSAndroid Build Coastguard Worker 
136*c8dee2aaSAndroid Build Coastguard Worker     bool onClearBackendTexture(const GrBackendTexture&,
137*c8dee2aaSAndroid Build Coastguard Worker                                sk_sp<skgpu::RefCntedCallback> finishedCallback,
138*c8dee2aaSAndroid Build Coastguard Worker                                std::array<float, 4> color) override;
139*c8dee2aaSAndroid Build Coastguard Worker 
140*c8dee2aaSAndroid Build Coastguard Worker     GrBackendTexture onCreateCompressedBackendTexture(SkISize dimensions,
141*c8dee2aaSAndroid Build Coastguard Worker                                                       const GrBackendFormat&,
142*c8dee2aaSAndroid Build Coastguard Worker                                                       skgpu::Mipmapped,
143*c8dee2aaSAndroid Build Coastguard Worker                                                       GrProtected) override;
144*c8dee2aaSAndroid Build Coastguard Worker 
145*c8dee2aaSAndroid Build Coastguard Worker     bool onUpdateCompressedBackendTexture(const GrBackendTexture&,
146*c8dee2aaSAndroid Build Coastguard Worker                                           sk_sp<skgpu::RefCntedCallback> finishedCallback,
147*c8dee2aaSAndroid Build Coastguard Worker                                           const void* data,
148*c8dee2aaSAndroid Build Coastguard Worker                                           size_t size) override;
149*c8dee2aaSAndroid Build Coastguard Worker 
150*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<GrTexture> onCreateTexture(SkISize,
151*c8dee2aaSAndroid Build Coastguard Worker                                      const GrBackendFormat&,
152*c8dee2aaSAndroid Build Coastguard Worker                                      GrRenderable,
153*c8dee2aaSAndroid Build Coastguard Worker                                      int renderTargetSampleCnt,
154*c8dee2aaSAndroid Build Coastguard Worker                                      skgpu::Budgeted,
155*c8dee2aaSAndroid Build Coastguard Worker                                      GrProtected,
156*c8dee2aaSAndroid Build Coastguard Worker                                      int mipLevelCount,
157*c8dee2aaSAndroid Build Coastguard Worker                                      uint32_t levelClearMask,
158*c8dee2aaSAndroid Build Coastguard Worker                                      std::string_view label) override;
159*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<GrTexture> onCreateCompressedTexture(SkISize dimensions,
160*c8dee2aaSAndroid Build Coastguard Worker                                                const GrBackendFormat&,
161*c8dee2aaSAndroid Build Coastguard Worker                                                skgpu::Budgeted,
162*c8dee2aaSAndroid Build Coastguard Worker                                                skgpu::Mipmapped,
163*c8dee2aaSAndroid Build Coastguard Worker                                                GrProtected,
164*c8dee2aaSAndroid Build Coastguard Worker                                                const void* data,
165*c8dee2aaSAndroid Build Coastguard Worker                                                size_t dataSize) override;
166*c8dee2aaSAndroid Build Coastguard Worker 
167*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<GrTexture> onWrapBackendTexture(const GrBackendTexture&,
168*c8dee2aaSAndroid Build Coastguard Worker                                           GrWrapOwnership,
169*c8dee2aaSAndroid Build Coastguard Worker                                           GrWrapCacheable,
170*c8dee2aaSAndroid Build Coastguard Worker                                           GrIOType) override;
171*c8dee2aaSAndroid Build Coastguard Worker 
172*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<GrTexture> onWrapCompressedBackendTexture(const GrBackendTexture&,
173*c8dee2aaSAndroid Build Coastguard Worker                                                     GrWrapOwnership,
174*c8dee2aaSAndroid Build Coastguard Worker                                                     GrWrapCacheable) override;
175*c8dee2aaSAndroid Build Coastguard Worker 
176*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<GrTexture> onWrapRenderableBackendTexture(const GrBackendTexture&,
177*c8dee2aaSAndroid Build Coastguard Worker                                                     int sampleCnt,
178*c8dee2aaSAndroid Build Coastguard Worker                                                     GrWrapOwnership,
179*c8dee2aaSAndroid Build Coastguard Worker                                                     GrWrapCacheable) override;
180*c8dee2aaSAndroid Build Coastguard Worker 
181*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<GrRenderTarget> onWrapBackendRenderTarget(const GrBackendRenderTarget&) override;
182*c8dee2aaSAndroid Build Coastguard Worker 
183*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<GrGpuBuffer> onCreateBuffer(size_t, GrGpuBufferType, GrAccessPattern) override;
184*c8dee2aaSAndroid Build Coastguard Worker 
185*c8dee2aaSAndroid Build Coastguard Worker     bool onReadPixels(GrSurface* surface,
186*c8dee2aaSAndroid Build Coastguard Worker                       SkIRect,
187*c8dee2aaSAndroid Build Coastguard Worker                       GrColorType surfaceColorType,
188*c8dee2aaSAndroid Build Coastguard Worker                       GrColorType bufferColorType,
189*c8dee2aaSAndroid Build Coastguard Worker                       void*,
190*c8dee2aaSAndroid Build Coastguard Worker                       size_t rowBytes) override;
191*c8dee2aaSAndroid Build Coastguard Worker 
192*c8dee2aaSAndroid Build Coastguard Worker     bool onTransferFromBufferToBuffer(sk_sp<GrGpuBuffer> src,
193*c8dee2aaSAndroid Build Coastguard Worker                                       size_t srcOffset,
194*c8dee2aaSAndroid Build Coastguard Worker                                       sk_sp<GrGpuBuffer> dst,
195*c8dee2aaSAndroid Build Coastguard Worker                                       size_t dstOffset,
196*c8dee2aaSAndroid Build Coastguard Worker                                       size_t size) override;
197*c8dee2aaSAndroid Build Coastguard Worker 
198*c8dee2aaSAndroid Build Coastguard Worker     bool onWritePixels(GrSurface*,
199*c8dee2aaSAndroid Build Coastguard Worker                        SkIRect,
200*c8dee2aaSAndroid Build Coastguard Worker                        GrColorType surfaceColorType,
201*c8dee2aaSAndroid Build Coastguard Worker                        GrColorType bufferColorType,
202*c8dee2aaSAndroid Build Coastguard Worker                        const GrMipLevel[],
203*c8dee2aaSAndroid Build Coastguard Worker                        int mipLevelCount,
204*c8dee2aaSAndroid Build Coastguard Worker                        bool prepForTexSampling) override;
205*c8dee2aaSAndroid Build Coastguard Worker 
206*c8dee2aaSAndroid Build Coastguard Worker     bool onTransferPixelsTo(GrTexture*,
207*c8dee2aaSAndroid Build Coastguard Worker                             SkIRect,
208*c8dee2aaSAndroid Build Coastguard Worker                             GrColorType textureColorType,
209*c8dee2aaSAndroid Build Coastguard Worker                             GrColorType bufferColorType,
210*c8dee2aaSAndroid Build Coastguard Worker                             sk_sp<GrGpuBuffer>,
211*c8dee2aaSAndroid Build Coastguard Worker                             size_t offset,
212*c8dee2aaSAndroid Build Coastguard Worker                             size_t rowBytes) override;
213*c8dee2aaSAndroid Build Coastguard Worker 
214*c8dee2aaSAndroid Build Coastguard Worker     bool onTransferPixelsFrom(GrSurface*,
215*c8dee2aaSAndroid Build Coastguard Worker                               SkIRect,
216*c8dee2aaSAndroid Build Coastguard Worker                               GrColorType surfaceColorType,
217*c8dee2aaSAndroid Build Coastguard Worker                               GrColorType bufferColorType,
218*c8dee2aaSAndroid Build Coastguard Worker                               sk_sp<GrGpuBuffer>,
219*c8dee2aaSAndroid Build Coastguard Worker                               size_t offset) override;
220*c8dee2aaSAndroid Build Coastguard Worker 
221*c8dee2aaSAndroid Build Coastguard Worker     bool onRegenerateMipMapLevels(GrTexture*) override;
222*c8dee2aaSAndroid Build Coastguard Worker 
223*c8dee2aaSAndroid Build Coastguard Worker     void onResolveRenderTarget(GrRenderTarget* target, const SkIRect& resolveRect) override;
224*c8dee2aaSAndroid Build Coastguard Worker 
225*c8dee2aaSAndroid Build Coastguard Worker     void resolve(GrMtlAttachment* resolveAttachment, GrMtlAttachment* msaaAttachment);
226*c8dee2aaSAndroid Build Coastguard Worker 
addFinishedCallback(skgpu::AutoCallback callback,std::optional<GrTimerQuery> timerQuery)227*c8dee2aaSAndroid Build Coastguard Worker     void addFinishedCallback(skgpu::AutoCallback callback,
228*c8dee2aaSAndroid Build Coastguard Worker                              std::optional<GrTimerQuery> timerQuery) override {
229*c8dee2aaSAndroid Build Coastguard Worker         SkASSERT(!timerQuery);
230*c8dee2aaSAndroid Build Coastguard Worker         this->addFinishedCallback(skgpu::RefCntedCallback::Make(std::move(callback)));
231*c8dee2aaSAndroid Build Coastguard Worker     }
232*c8dee2aaSAndroid Build Coastguard Worker 
233*c8dee2aaSAndroid Build Coastguard Worker     void addFinishedCallback(sk_sp<skgpu::RefCntedCallback> finishedCallback);
234*c8dee2aaSAndroid Build Coastguard Worker 
235*c8dee2aaSAndroid Build Coastguard Worker     GrOpsRenderPass* onGetOpsRenderPass(
236*c8dee2aaSAndroid Build Coastguard Worker             GrRenderTarget*,
237*c8dee2aaSAndroid Build Coastguard Worker             bool useMSAASurface,
238*c8dee2aaSAndroid Build Coastguard Worker             GrAttachment*,
239*c8dee2aaSAndroid Build Coastguard Worker             GrSurfaceOrigin,
240*c8dee2aaSAndroid Build Coastguard Worker             const SkIRect&,
241*c8dee2aaSAndroid Build Coastguard Worker             const GrOpsRenderPass::LoadAndStoreInfo&,
242*c8dee2aaSAndroid Build Coastguard Worker             const GrOpsRenderPass::StencilLoadAndStoreInfo&,
243*c8dee2aaSAndroid Build Coastguard Worker             const skia_private::TArray<GrSurfaceProxy*, true>& sampledProxies,
244*c8dee2aaSAndroid Build Coastguard Worker             GrXferBarrierFlags renderPassXferBarriers) override;
245*c8dee2aaSAndroid Build Coastguard Worker 
246*c8dee2aaSAndroid Build Coastguard Worker     bool onSubmitToGpu(const GrSubmitInfo& info) override;
247*c8dee2aaSAndroid Build Coastguard Worker 
248*c8dee2aaSAndroid Build Coastguard Worker     // Commits the current command buffer to the queue and then creates a new command buffer. If
249*c8dee2aaSAndroid Build Coastguard Worker     // sync is set to kForce_SyncQueue, the function will wait for all work in the committed
250*c8dee2aaSAndroid Build Coastguard Worker     // command buffer to finish before returning.
251*c8dee2aaSAndroid Build Coastguard Worker     bool submitCommandBuffer(SyncQueue sync);
252*c8dee2aaSAndroid Build Coastguard Worker 
253*c8dee2aaSAndroid Build Coastguard Worker     void checkForFinishedCommandBuffers();
254*c8dee2aaSAndroid Build Coastguard Worker 
255*c8dee2aaSAndroid Build Coastguard Worker     // Function that uploads data onto textures with private storage mode (GPU access only).
256*c8dee2aaSAndroid Build Coastguard Worker     bool uploadToTexture(GrMtlTexture* tex,
257*c8dee2aaSAndroid Build Coastguard Worker                          SkIRect rect,
258*c8dee2aaSAndroid Build Coastguard Worker                          GrColorType dataColorType,
259*c8dee2aaSAndroid Build Coastguard Worker                          const GrMipLevel texels[],
260*c8dee2aaSAndroid Build Coastguard Worker                          int mipLevels);
261*c8dee2aaSAndroid Build Coastguard Worker 
262*c8dee2aaSAndroid Build Coastguard Worker     // Function that fills texture levels with transparent black based on levelMask.
263*c8dee2aaSAndroid Build Coastguard Worker     bool clearTexture(GrMtlTexture*, size_t bbp, uint32_t levelMask);
264*c8dee2aaSAndroid Build Coastguard Worker 
265*c8dee2aaSAndroid Build Coastguard Worker     bool readOrTransferPixels(GrSurface* surface,
266*c8dee2aaSAndroid Build Coastguard Worker                               SkIRect rect,
267*c8dee2aaSAndroid Build Coastguard Worker                               GrColorType dstColorType,
268*c8dee2aaSAndroid Build Coastguard Worker                               id<MTLBuffer> transferBuffer,
269*c8dee2aaSAndroid Build Coastguard Worker                               size_t offset,
270*c8dee2aaSAndroid Build Coastguard Worker                               size_t imageBytes,
271*c8dee2aaSAndroid Build Coastguard Worker                               size_t rowBytes);
272*c8dee2aaSAndroid Build Coastguard Worker 
273*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<GrAttachment> makeStencilAttachment(const GrBackendFormat& /*colorFormat*/,
274*c8dee2aaSAndroid Build Coastguard Worker                                               SkISize dimensions, int numStencilSamples) override;
275*c8dee2aaSAndroid Build Coastguard Worker 
getPreferredStencilFormat(const GrBackendFormat &)276*c8dee2aaSAndroid Build Coastguard Worker     GrBackendFormat getPreferredStencilFormat(const GrBackendFormat&) override {
277*c8dee2aaSAndroid Build Coastguard Worker         return GrBackendFormats::MakeMtl(this->mtlCaps().preferredStencilFormat());
278*c8dee2aaSAndroid Build Coastguard Worker     }
279*c8dee2aaSAndroid Build Coastguard Worker 
280*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<GrAttachment> makeMSAAAttachment(SkISize dimensions,
281*c8dee2aaSAndroid Build Coastguard Worker                                            const GrBackendFormat& format,
282*c8dee2aaSAndroid Build Coastguard Worker                                            int numSamples,
283*c8dee2aaSAndroid Build Coastguard Worker                                            GrProtected isProtected,
284*c8dee2aaSAndroid Build Coastguard Worker                                            GrMemoryless isMemoryless) override;
285*c8dee2aaSAndroid Build Coastguard Worker 
286*c8dee2aaSAndroid Build Coastguard Worker     bool createMtlTextureForBackendSurface(MTLPixelFormat,
287*c8dee2aaSAndroid Build Coastguard Worker                                            SkISize dimensions,
288*c8dee2aaSAndroid Build Coastguard Worker                                            int sampleCnt,
289*c8dee2aaSAndroid Build Coastguard Worker                                            GrTexturable,
290*c8dee2aaSAndroid Build Coastguard Worker                                            GrRenderable,
291*c8dee2aaSAndroid Build Coastguard Worker                                            skgpu::Mipmapped,
292*c8dee2aaSAndroid Build Coastguard Worker                                            GrMtlTextureInfo*);
293*c8dee2aaSAndroid Build Coastguard Worker 
294*c8dee2aaSAndroid Build Coastguard Worker #if defined(GPU_TEST_UTILS)
295*c8dee2aaSAndroid Build Coastguard Worker     void testingOnly_startCapture() override;
296*c8dee2aaSAndroid Build Coastguard Worker     void testingOnly_stopCapture() override;
297*c8dee2aaSAndroid Build Coastguard Worker #endif
298*c8dee2aaSAndroid Build Coastguard Worker 
299*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_ENABLE_DUMP_GPU
300*c8dee2aaSAndroid Build Coastguard Worker     void onDumpJSON(SkJSONWriter*) const override;
301*c8dee2aaSAndroid Build Coastguard Worker #endif
302*c8dee2aaSAndroid Build Coastguard Worker 
303*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<GrMtlCaps> fMtlCaps;
304*c8dee2aaSAndroid Build Coastguard Worker 
305*c8dee2aaSAndroid Build Coastguard Worker     id<MTLDevice> fDevice;
306*c8dee2aaSAndroid Build Coastguard Worker     id<MTLCommandQueue> fQueue;
307*c8dee2aaSAndroid Build Coastguard Worker 
308*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<GrMtlCommandBuffer> fCurrentCmdBuffer;
309*c8dee2aaSAndroid Build Coastguard Worker 
310*c8dee2aaSAndroid Build Coastguard Worker     using OutstandingCommandBuffer = sk_sp<GrMtlCommandBuffer>;
311*c8dee2aaSAndroid Build Coastguard Worker     SkDeque fOutstandingCommandBuffers;
312*c8dee2aaSAndroid Build Coastguard Worker 
313*c8dee2aaSAndroid Build Coastguard Worker     GrMtlResourceProvider fResourceProvider;
314*c8dee2aaSAndroid Build Coastguard Worker     GrStagingBufferManager fStagingBufferManager;
315*c8dee2aaSAndroid Build Coastguard Worker     GrRingBuffer fUniformsRingBuffer;
316*c8dee2aaSAndroid Build Coastguard Worker 
317*c8dee2aaSAndroid Build Coastguard Worker     bool fDisconnected;
318*c8dee2aaSAndroid Build Coastguard Worker 
319*c8dee2aaSAndroid Build Coastguard Worker     using INHERITED = GrGpu;
320*c8dee2aaSAndroid Build Coastguard Worker };
321*c8dee2aaSAndroid Build Coastguard Worker 
322*c8dee2aaSAndroid Build Coastguard Worker #endif
323