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