• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 GrMtlOpsRenderPass_DEFINED
9 #define GrMtlOpsRenderPass_DEFINED
10 
11 #include "src/gpu/GrMesh.h"
12 #include "src/gpu/GrOpFlushState.h"
13 #include "src/gpu/GrOpsRenderPass.h"
14 #include "src/gpu/mtl/GrMtlGpu.h"
15 
16 #import <Metal/Metal.h>
17 
18 typedef uint32_t GrColor;
19 class GrMtlBuffer;
20 class GrMtlPipelineState;
21 class GrMtlRenderTarget;
22 
23 class GrMtlOpsRenderPass : public GrOpsRenderPass, private GrMesh::SendToGpuImpl {
24 public:
25     GrMtlOpsRenderPass(GrMtlGpu* gpu, GrRenderTarget* rt, GrSurfaceOrigin origin,
26                        const GrOpsRenderPass::LoadAndStoreInfo& colorInfo,
27                        const GrOpsRenderPass::StencilLoadAndStoreInfo& stencilInfo);
28 
29     ~GrMtlOpsRenderPass() override;
30 
begin()31     void begin() override {}
end()32     void end() override {}
33 
34     void initRenderState(id<MTLRenderCommandEncoder>);
35 
36     void inlineUpload(GrOpFlushState* state, GrDeferredTextureUploadFn& upload) override;
37     void submit();
38 
39 private:
gpu()40     GrGpu* gpu() override { return fGpu; }
41 
42     bool onBindPipeline(const GrProgramInfo&, const SkRect& drawBounds) override;
43 
44     void onDrawMeshes(const GrProgramInfo&, const GrMesh[], int meshCount) override;
45 
46     void onClear(const GrFixedClip& clip, const SkPMColor4f& color) override;
47 
48     void onClearStencilClip(const GrFixedClip& clip, bool insideStencilMask) override;
49 
50     void setupRenderPass(const GrOpsRenderPass::LoadAndStoreInfo& colorInfo,
51                          const GrOpsRenderPass::StencilLoadAndStoreInfo& stencilInfo);
52 
53     void bindGeometry(const GrBuffer* vertexBuffer, size_t vertexOffset,
54                       const GrBuffer* instanceBuffer);
55 
56     // GrMesh::SendToGpuImpl methods. These issue the actual Metal draw commands.
57     // Marked final as a hint to the compiler to not use virtual dispatch.
58     void sendArrayMeshToGpu(GrPrimitiveType, const GrMesh&, int vertexCount, int baseVertex) final;
59     void sendIndexedMeshToGpu(GrPrimitiveType, const GrMesh&, int indexCount, int baseIndex,
60                               uint16_t /*minIndexValue*/, uint16_t /*maxIndexValue*/,
61                               int baseVertex) final;
62     void sendInstancedMeshToGpu(GrPrimitiveType, const GrMesh&, int vertexCount, int baseVertex,
63                                 int instanceCount, int baseInstance) final;
64     void sendIndexedInstancedMeshToGpu(GrPrimitiveType, const GrMesh&, int indexCount,
65                                        int baseIndex, int baseVertex, int instanceCount,
66                                        int baseInstance) final;
67 
68     void setVertexBuffer(id<MTLRenderCommandEncoder>, const GrMtlBuffer*, size_t offset,
69                          size_t index);
70     void resetBufferBindings();
71     void precreateCmdEncoder();
72 
73     GrMtlGpu*                   fGpu;
74 
75     id<MTLRenderCommandEncoder> fActiveRenderCmdEncoder;
76     GrMtlPipelineState*         fActivePipelineState = nullptr;
77     MTLRenderPassDescriptor*    fRenderPassDesc;
78     SkRect                      fBounds;
79     size_t                      fCurrentVertexStride;
80 
81     static constexpr size_t kNumBindings = GrMtlUniformHandler::kLastUniformBinding + 3;
82     struct {
83         id<MTLBuffer> fBuffer;
84         size_t fOffset;
85     } fBufferBindings[kNumBindings];
86 
87     typedef GrOpsRenderPass INHERITED;
88 };
89 
90 #endif
91 
92