• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2021 Google LLC
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 skgpu_MtlGraphicsPipeline_DEFINED
9 #define skgpu_MtlGraphicsPipeline_DEFINED
10 
11 #include "experimental/graphite/src/GraphicsPipeline.h"
12 #include "include/core/SkRefCnt.h"
13 #include "include/ports/SkCFObject.h"
14 #include <memory>
15 
16 #import <Metal/Metal.h>
17 
18 class SkShaderCodeDictionary;
19 
20 namespace skgpu {
21 class Context;
22 class GraphicsPipelineDesc;
23 struct RenderPassDesc;
24 } // namespace skgpu
25 
26 namespace skgpu::mtl {
27 class Gpu;
28 class ResourceProvider;
29 
30 class GraphicsPipeline final : public skgpu::GraphicsPipeline {
31 public:
32     inline static constexpr unsigned int kIntrinsicUniformBufferIndex = 0;
33     inline static constexpr unsigned int kRenderStepUniformBufferIndex = 1;
34     inline static constexpr unsigned int kPaintUniformBufferIndex = 2;
35     inline static constexpr unsigned int kVertexBufferIndex = 3;
36     inline static constexpr unsigned int kInstanceBufferIndex = 4;
37 
38     static sk_sp<GraphicsPipeline> Make(ResourceProvider*,
39                                         const Gpu*,
40                                         const skgpu::GraphicsPipelineDesc&,
41                                         const skgpu::RenderPassDesc&);
~GraphicsPipeline()42     ~GraphicsPipeline() override {}
43 
mtlPipelineState()44     id<MTLRenderPipelineState> mtlPipelineState() const { return fPipelineState.get(); }
mtlDepthStencilState()45     id<MTLDepthStencilState> mtlDepthStencilState() const { return fDepthStencilState; }
stencilReferenceValue()46     uint32_t stencilReferenceValue() const { return fStencilReferenceValue; }
vertexStride()47     size_t vertexStride() const { return fVertexStride; }
instanceStride()48     size_t instanceStride() const { return fInstanceStride; }
49 
50 private:
GraphicsPipeline(const skgpu::Gpu * gpu,sk_cfp<id<MTLRenderPipelineState>> pso,id<MTLDepthStencilState> dss,uint32_t refValue,size_t vertexStride,size_t instanceStride)51     GraphicsPipeline(const skgpu::Gpu* gpu,
52                      sk_cfp<id<MTLRenderPipelineState>> pso,
53                      id<MTLDepthStencilState> dss,
54                      uint32_t refValue,
55                      size_t vertexStride,
56                      size_t instanceStride)
57         : skgpu::GraphicsPipeline(gpu)
58         , fPipelineState(std::move(pso))
59         , fDepthStencilState(dss)
60         , fStencilReferenceValue(refValue)
61         , fVertexStride(vertexStride)
62         , fInstanceStride(instanceStride) {}
63 
64     void onFreeGpuData() override;
65 
66     sk_cfp<id<MTLRenderPipelineState>> fPipelineState;
67     id<MTLDepthStencilState> fDepthStencilState;
68     uint32_t fStencilReferenceValue;
69     size_t fVertexStride = 0;
70     size_t fInstanceStride = 0;
71 };
72 
73 } // namespace skgpu::mtl
74 
75 #endif // skgpu_MtlGraphicsPipeline_DEFINED
76