1 /*
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 GrMtlCopyManager_DEFINED
9 #define GrMtlCopyManager_DEFINED
10 
11 #include "GrTypes.h"
12 
13 #import <metal/metal.h>
14 
15 class GrMtlCopyPipelineState;
16 class GrMtlGpu;
17 class GrSurface;
18 struct SkIPoint;
19 struct SkIRect;
20 
21 class GrMtlCopyManager {
22 public:
GrMtlCopyManager(GrMtlGpu * gpu)23     GrMtlCopyManager(GrMtlGpu* gpu) : fGpu(gpu) {}
24 
25     bool copySurfaceAsDraw(GrSurface* dst, GrSurfaceOrigin dstOrigin,
26                            GrSurface* src, GrSurfaceOrigin srcOrigin,
27                            const SkIRect& srcRect, const SkIPoint& dstPoint,
28                            bool canDiscardOutsideDstRect);
29 
30     static bool IsCompatible(const GrMtlCopyPipelineState*, MTLPixelFormat dstPixelFormat);
31 
32 private:
33     enum BufferIndex {
34         kUniform_BufferIndex,
35         kAttribute_BufferIndex,
36     };
37 
38     void createCopyProgramBuffer();
39     void createCopyProgramShaders();
40     void createCopyProgramVertexDescriptor();
41 
42     void createCopyProgram();
43 
44     id<MTLSamplerState>  fSamplerState;
45     id<MTLBuffer>        fVertexAttributeBuffer;
46     id<MTLFunction>      fVertexFunction;
47     id<MTLFunction>      fFragmentFunction;
48     MTLVertexDescriptor* fVertexDescriptor;
49 
50     GrMtlGpu* fGpu;
51 };
52 
53 #endif
54