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