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