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