1e5ddff55536f35873d49f6c33e5d9db750d3fdf3Greg Daniel/* 2e5ddff55536f35873d49f6c33e5d9db750d3fdf3Greg Daniel * Copyright 2017 Google Inc. 3e5ddff55536f35873d49f6c33e5d9db750d3fdf3Greg Daniel * 4e5ddff55536f35873d49f6c33e5d9db750d3fdf3Greg Daniel * Use of this source code is governed by a BSD-style license that can be 5e5ddff55536f35873d49f6c33e5d9db750d3fdf3Greg Daniel * found in the LICENSE file. 6e5ddff55536f35873d49f6c33e5d9db750d3fdf3Greg Daniel */ 7e5ddff55536f35873d49f6c33e5d9db750d3fdf3Greg Daniel 8e5ddff55536f35873d49f6c33e5d9db750d3fdf3Greg Daniel#ifndef GrMtlGpu_DEFINED 9e5ddff55536f35873d49f6c33e5d9db750d3fdf3Greg Daniel#define GrMtlGpu_DEFINED 10e5ddff55536f35873d49f6c33e5d9db750d3fdf3Greg Daniel 11e5ddff55536f35873d49f6c33e5d9db750d3fdf3Greg Daniel#include "GrGpu.h" 12e5ddff55536f35873d49f6c33e5d9db750d3fdf3Greg Daniel#include "GrRenderTarget.h" 13e5ddff55536f35873d49f6c33e5d9db750d3fdf3Greg Daniel#include "GrSemaphore.h" 14e5ddff55536f35873d49f6c33e5d9db750d3fdf3Greg Daniel#include "GrTexture.h" 15e5ddff55536f35873d49f6c33e5d9db750d3fdf3Greg Daniel 16cebcb84739c261e729a054ff097adca32a1b537fGreg Daniel#include "GrMtlCaps.h" 17cebcb84739c261e729a054ff097adca32a1b537fGreg Daniel 18e5ddff55536f35873d49f6c33e5d9db750d3fdf3Greg Daniel#import <Metal/Metal.h> 19e5ddff55536f35873d49f6c33e5d9db750d3fdf3Greg Daniel 20e5ddff55536f35873d49f6c33e5d9db750d3fdf3Greg Danielclass GrSemaphore; 21b76a72a659f53b8bf449c5ca2685045d08a21e43Greg Danielstruct GrMtlBackendContext; 22e5ddff55536f35873d49f6c33e5d9db750d3fdf3Greg Daniel 23e5ddff55536f35873d49f6c33e5d9db750d3fdf3Greg Danielclass GrMtlGpu : public GrGpu { 24e5ddff55536f35873d49f6c33e5d9db750d3fdf3Greg Danielpublic: 25384fab467e2a5f1754ec26eecde946ce28046d20Brian Salomon static sk_sp<GrGpu> Make(GrContext* context, const GrContextOptions& options, 26384fab467e2a5f1754ec26eecde946ce28046d20Brian Salomon id<MTLDevice> device, id<MTLCommandQueue> queue); 27e5ddff55536f35873d49f6c33e5d9db750d3fdf3Greg Daniel 28e5ddff55536f35873d49f6c33e5d9db750d3fdf3Greg Daniel ~GrMtlGpu() override {} 294a081e2475fa69dd55fcace9f8e6d3166ea25ad1Greg Daniel 30cebcb84739c261e729a054ff097adca32a1b537fGreg Daniel const GrMtlCaps& mtlCaps() const { return *fMtlCaps.get(); } 31e5ddff55536f35873d49f6c33e5d9db750d3fdf3Greg Daniel 324a081e2475fa69dd55fcace9f8e6d3166ea25ad1Greg Daniel id<MTLDevice> device() const { return fDevice; } 334a081e2475fa69dd55fcace9f8e6d3166ea25ad1Greg Daniel 34c320b1576850745a1011ada0bcef3de5f9b9f649Brian Salomon bool onGetReadPixelsInfo(GrSurface* srcSurface, GrSurfaceOrigin origin, int readWidth, 35c320b1576850745a1011ada0bcef3de5f9b9f649Brian Salomon int readHeight, size_t rowBytes, GrColorType readConfig, 36c320b1576850745a1011ada0bcef3de5f9b9f649Brian Salomon DrawPreference*, ReadPixelTempDrawInfo*) override { 37c320b1576850745a1011ada0bcef3de5f9b9f649Brian Salomon return false; 38c320b1576850745a1011ada0bcef3de5f9b9f649Brian Salomon } 39e5ddff55536f35873d49f6c33e5d9db750d3fdf3Greg Daniel 40c320b1576850745a1011ada0bcef3de5f9b9f649Brian Salomon bool onGetWritePixelsInfo(GrSurface* dstSurface, GrSurfaceOrigin dstOrigin, int width, 41c320b1576850745a1011ada0bcef3de5f9b9f649Brian Salomon int height, GrColorType srcColorType, DrawPreference*, 42c320b1576850745a1011ada0bcef3de5f9b9f649Brian Salomon WritePixelTempDrawInfo*) override { 43c320b1576850745a1011ada0bcef3de5f9b9f649Brian Salomon return false; 44c320b1576850745a1011ada0bcef3de5f9b9f649Brian Salomon } 45e5ddff55536f35873d49f6c33e5d9db750d3fdf3Greg Daniel 46b0e93a22bbfad05bb834e33387880ece56e0f6d2Robert Phillips bool onCopySurface(GrSurface* dst, GrSurfaceOrigin dstOrigin, 47b0e93a22bbfad05bb834e33387880ece56e0f6d2Robert Phillips GrSurface* src, GrSurfaceOrigin srcOrigin, 48e5ddff55536f35873d49f6c33e5d9db750d3fdf3Greg Daniel const SkIRect& srcRect, 49e5ddff55536f35873d49f6c33e5d9db750d3fdf3Greg Daniel const SkIPoint& dstPoint) override { return false; } 50e5ddff55536f35873d49f6c33e5d9db750d3fdf3Greg Daniel 516682ff2e1be13b4552c1a5330a0c3a88d2808f0cGreg Daniel GrGpuRTCommandBuffer* createCommandBuffer( 52952144753dc31d9d935683123cae43fca483badeRobert Phillips GrRenderTarget*, GrSurfaceOrigin, 536682ff2e1be13b4552c1a5330a0c3a88d2808f0cGreg Daniel const GrGpuRTCommandBuffer::LoadAndStoreInfo&, 546682ff2e1be13b4552c1a5330a0c3a88d2808f0cGreg Daniel const GrGpuRTCommandBuffer::StencilLoadAndStoreInfo&) override { 556682ff2e1be13b4552c1a5330a0c3a88d2808f0cGreg Daniel return nullptr; 566682ff2e1be13b4552c1a5330a0c3a88d2808f0cGreg Daniel } 576682ff2e1be13b4552c1a5330a0c3a88d2808f0cGreg Daniel 586682ff2e1be13b4552c1a5330a0c3a88d2808f0cGreg Daniel GrGpuTextureCommandBuffer* createCommandBuffer(GrTexture*, GrSurfaceOrigin) override { 59e5ddff55536f35873d49f6c33e5d9db750d3fdf3Greg Daniel return nullptr; 60e5ddff55536f35873d49f6c33e5d9db750d3fdf3Greg Daniel } 61e5ddff55536f35873d49f6c33e5d9db750d3fdf3Greg Daniel 62e5ddff55536f35873d49f6c33e5d9db750d3fdf3Greg Daniel GrFence SK_WARN_UNUSED_RESULT insertFence() override { return 0; } 63e5ddff55536f35873d49f6c33e5d9db750d3fdf3Greg Daniel bool waitFence(GrFence, uint64_t) override { return true; } 64e5ddff55536f35873d49f6c33e5d9db750d3fdf3Greg Daniel void deleteFence(GrFence) const override {} 65e5ddff55536f35873d49f6c33e5d9db750d3fdf3Greg Daniel 66e5ddff55536f35873d49f6c33e5d9db750d3fdf3Greg Daniel sk_sp<GrSemaphore> SK_WARN_UNUSED_RESULT makeSemaphore(bool isOwned) override { 67e5ddff55536f35873d49f6c33e5d9db750d3fdf3Greg Daniel return nullptr; 68e5ddff55536f35873d49f6c33e5d9db750d3fdf3Greg Daniel } 6948661b868fbbf7a6193ef49bb6a05a0df61e7c45Greg Daniel sk_sp<GrSemaphore> wrapBackendSemaphore(const GrBackendSemaphore& semaphore, 7048661b868fbbf7a6193ef49bb6a05a0df61e7c45Greg Daniel GrResourceProvider::SemaphoreWrapType wrapType, 7148661b868fbbf7a6193ef49bb6a05a0df61e7c45Greg Daniel GrWrapOwnership ownership) override { return nullptr; } 7248661b868fbbf7a6193ef49bb6a05a0df61e7c45Greg Daniel void insertSemaphore(sk_sp<GrSemaphore> semaphore, bool flush) override {} 7348661b868fbbf7a6193ef49bb6a05a0df61e7c45Greg Daniel void waitSemaphore(sk_sp<GrSemaphore> semaphore) override {} 74e5ddff55536f35873d49f6c33e5d9db750d3fdf3Greg Daniel sk_sp<GrSemaphore> prepareTextureForCrossContextUsage(GrTexture*) override { return nullptr; } 75e5ddff55536f35873d49f6c33e5d9db750d3fdf3Greg Daniel 76e5ddff55536f35873d49f6c33e5d9db750d3fdf3Greg Danielprivate: 77b76a72a659f53b8bf449c5ca2685045d08a21e43Greg Daniel GrMtlGpu(GrContext* context, const GrContextOptions& options, 78cebcb84739c261e729a054ff097adca32a1b537fGreg Daniel id<MTLDevice> device, id<MTLCommandQueue> queue, MTLFeatureSet featureSet); 79e5ddff55536f35873d49f6c33e5d9db750d3fdf3Greg Daniel 80e5ddff55536f35873d49f6c33e5d9db750d3fdf3Greg Daniel void onResetContext(uint32_t resetBits) override {} 81e5ddff55536f35873d49f6c33e5d9db750d3fdf3Greg Daniel 82e5ddff55536f35873d49f6c33e5d9db750d3fdf3Greg Daniel void xferBarrier(GrRenderTarget*, GrXferBarrierType) override {} 83e5ddff55536f35873d49f6c33e5d9db750d3fdf3Greg Daniel 84e5ddff55536f35873d49f6c33e5d9db750d3fdf3Greg Daniel sk_sp<GrTexture> onCreateTexture(const GrSurfaceDesc& desc, SkBudgeted budgeted, 854a081e2475fa69dd55fcace9f8e6d3166ea25ad1Greg Daniel const GrMipLevel texels[], int mipLevelCount) override; 86e5ddff55536f35873d49f6c33e5d9db750d3fdf3Greg Daniel 87b0e93a22bbfad05bb834e33387880ece56e0f6d2Robert Phillips sk_sp<GrTexture> onWrapBackendTexture(const GrBackendTexture&, GrWrapOwnership) override { 88e5ddff55536f35873d49f6c33e5d9db750d3fdf3Greg Daniel return nullptr; 89e5ddff55536f35873d49f6c33e5d9db750d3fdf3Greg Daniel } 90e5ddff55536f35873d49f6c33e5d9db750d3fdf3Greg Daniel 91d17f6584df9e48146dac28a1df56fb4978de6ba3Brian Salomon sk_sp<GrTexture> onWrapRenderableBackendTexture(const GrBackendTexture&, 92d17f6584df9e48146dac28a1df56fb4978de6ba3Brian Salomon int sampleCnt, 93d17f6584df9e48146dac28a1df56fb4978de6ba3Brian Salomon GrWrapOwnership) override { 94d17f6584df9e48146dac28a1df56fb4978de6ba3Brian Salomon return nullptr; 95d17f6584df9e48146dac28a1df56fb4978de6ba3Brian Salomon } 96d17f6584df9e48146dac28a1df56fb4978de6ba3Brian Salomon 97b0e93a22bbfad05bb834e33387880ece56e0f6d2Robert Phillips sk_sp<GrRenderTarget> onWrapBackendRenderTarget(const GrBackendRenderTarget&) override { 98e5ddff55536f35873d49f6c33e5d9db750d3fdf3Greg Daniel return nullptr; 99e5ddff55536f35873d49f6c33e5d9db750d3fdf3Greg Daniel } 100e5ddff55536f35873d49f6c33e5d9db750d3fdf3Greg Daniel 101e5ddff55536f35873d49f6c33e5d9db750d3fdf3Greg Daniel sk_sp<GrRenderTarget> onWrapBackendTextureAsRenderTarget(const GrBackendTexture&, 102e5ddff55536f35873d49f6c33e5d9db750d3fdf3Greg Daniel int sampleCnt) override { 103e5ddff55536f35873d49f6c33e5d9db750d3fdf3Greg Daniel return nullptr; 104e5ddff55536f35873d49f6c33e5d9db750d3fdf3Greg Daniel } 105e5ddff55536f35873d49f6c33e5d9db750d3fdf3Greg Daniel 106e5ddff55536f35873d49f6c33e5d9db750d3fdf3Greg Daniel GrBuffer* onCreateBuffer(size_t, GrBufferType, GrAccessPattern, const void*) override { 107e5ddff55536f35873d49f6c33e5d9db750d3fdf3Greg Daniel return nullptr; 108e5ddff55536f35873d49f6c33e5d9db750d3fdf3Greg Daniel } 109e5ddff55536f35873d49f6c33e5d9db750d3fdf3Greg Daniel 110c320b1576850745a1011ada0bcef3de5f9b9f649Brian Salomon bool onReadPixels(GrSurface* surface, GrSurfaceOrigin, int left, int top, int width, int height, 111c320b1576850745a1011ada0bcef3de5f9b9f649Brian Salomon GrColorType, void* buffer, size_t rowBytes) override { 112e5ddff55536f35873d49f6c33e5d9db750d3fdf3Greg Daniel return false; 113e5ddff55536f35873d49f6c33e5d9db750d3fdf3Greg Daniel } 114e5ddff55536f35873d49f6c33e5d9db750d3fdf3Greg Daniel 115c320b1576850745a1011ada0bcef3de5f9b9f649Brian Salomon bool onWritePixels(GrSurface*, GrSurfaceOrigin, int left, int top, int width, 116c320b1576850745a1011ada0bcef3de5f9b9f649Brian Salomon int height, GrColorType, const GrMipLevel[], 117c320b1576850745a1011ada0bcef3de5f9b9f649Brian Salomon int) override { 118e5ddff55536f35873d49f6c33e5d9db750d3fdf3Greg Daniel return false; 119e5ddff55536f35873d49f6c33e5d9db750d3fdf3Greg Daniel } 120e5ddff55536f35873d49f6c33e5d9db750d3fdf3Greg Daniel 121c320b1576850745a1011ada0bcef3de5f9b9f649Brian Salomon bool onTransferPixels(GrTexture*, 122e5ddff55536f35873d49f6c33e5d9db750d3fdf3Greg Daniel int left, int top, int width, int height, 123c320b1576850745a1011ada0bcef3de5f9b9f649Brian Salomon GrColorType, GrBuffer*, 124e5ddff55536f35873d49f6c33e5d9db750d3fdf3Greg Daniel size_t offset, size_t rowBytes) override { 125e5ddff55536f35873d49f6c33e5d9db750d3fdf3Greg Daniel return false; 126e5ddff55536f35873d49f6c33e5d9db750d3fdf3Greg Daniel } 127e5ddff55536f35873d49f6c33e5d9db750d3fdf3Greg Daniel 1281fabd51f585383b0f7b8f82c4489989e9379627bBrian Salomon void onResolveRenderTarget(GrRenderTarget* target) override { return; } 129e5ddff55536f35873d49f6c33e5d9db750d3fdf3Greg Daniel 1305131678123839cec0e974069b6d3f047c8a82049Greg Daniel void onFinishFlush(bool insertedSemaphores) override {} 1315131678123839cec0e974069b6d3f047c8a82049Greg Daniel 132e5ddff55536f35873d49f6c33e5d9db750d3fdf3Greg Daniel GrStencilAttachment* createStencilAttachmentForRenderTarget(const GrRenderTarget*, 133e5ddff55536f35873d49f6c33e5d9db750d3fdf3Greg Daniel int width, 134e5ddff55536f35873d49f6c33e5d9db750d3fdf3Greg Daniel int height) override { 135e5ddff55536f35873d49f6c33e5d9db750d3fdf3Greg Daniel return nullptr; 136e5ddff55536f35873d49f6c33e5d9db750d3fdf3Greg Daniel } 137e5ddff55536f35873d49f6c33e5d9db750d3fdf3Greg Daniel 138952144753dc31d9d935683123cae43fca483badeRobert Phillips void clearStencil(GrRenderTarget* target, int clearValue) override {} 139e5ddff55536f35873d49f6c33e5d9db750d3fdf3Greg Daniel 140d21b2a5d5c5dca87b7df02713782e722a2c0ae92Robert Phillips GrBackendTexture createTestingOnlyBackendTexture(void* pixels, int w, int h, 141d21b2a5d5c5dca87b7df02713782e722a2c0ae92Robert Phillips GrPixelConfig config, bool isRT, 142d21b2a5d5c5dca87b7df02713782e722a2c0ae92Robert Phillips GrMipMapped) override { 143d21b2a5d5c5dca87b7df02713782e722a2c0ae92Robert Phillips return GrBackendTexture(); 144d21b2a5d5c5dca87b7df02713782e722a2c0ae92Robert Phillips } 145d21b2a5d5c5dca87b7df02713782e722a2c0ae92Robert Phillips bool isTestingOnlyBackendTexture(const GrBackendTexture&) const override { return false; } 146d21b2a5d5c5dca87b7df02713782e722a2c0ae92Robert Phillips void deleteTestingOnlyBackendTexture(GrBackendTexture*, bool abandon = false) override {} 147e5ddff55536f35873d49f6c33e5d9db750d3fdf3Greg Daniel 148cebcb84739c261e729a054ff097adca32a1b537fGreg Daniel sk_sp<GrMtlCaps> fMtlCaps; 149cebcb84739c261e729a054ff097adca32a1b537fGreg Daniel 150b76a72a659f53b8bf449c5ca2685045d08a21e43Greg Daniel id<MTLDevice> fDevice; 151b76a72a659f53b8bf449c5ca2685045d08a21e43Greg Daniel id<MTLCommandQueue> fQueue; 152b76a72a659f53b8bf449c5ca2685045d08a21e43Greg Daniel 153e5ddff55536f35873d49f6c33e5d9db750d3fdf3Greg Daniel 154e5ddff55536f35873d49f6c33e5d9db750d3fdf3Greg Daniel typedef GrGpu INHERITED; 155e5ddff55536f35873d49f6c33e5d9db750d3fdf3Greg Daniel}; 156e5ddff55536f35873d49f6c33e5d9db750d3fdf3Greg Daniel 157e5ddff55536f35873d49f6c33e5d9db750d3fdf3Greg Daniel#endif 158e5ddff55536f35873d49f6c33e5d9db750d3fdf3Greg Daniel 159