/* * Copyright 2021 Google LLC * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef skgpu_graphite_MtlGraphicsPipeline_DEFINED #define skgpu_graphite_MtlGraphicsPipeline_DEFINED #include "include/core/SkRefCnt.h" #include "include/core/SkSpan.h" #include "include/ports/SkCFObject.h" #include "src/gpu/graphite/GraphicsPipeline.h" #include #import namespace skgpu { struct BlendInfo; } namespace skgpu::graphite { class Attribute; class Context; class GraphicsPipelineDesc; class MtlResourceProvider; class MtlSharedContext; struct RenderPassDesc; class RuntimeEffectDictionary; class MtlGraphicsPipeline final : public GraphicsPipeline { public: inline static constexpr unsigned int kIntrinsicUniformBufferIndex = 0; inline static constexpr unsigned int kRenderStepUniformBufferIndex = 1; inline static constexpr unsigned int kPaintUniformBufferIndex = 2; inline static constexpr unsigned int kVertexBufferIndex = 3; inline static constexpr unsigned int kInstanceBufferIndex = 4; inline static constexpr unsigned int kGradientBufferIndex = 5; static sk_sp Make(const MtlSharedContext*, MtlResourceProvider*, const RuntimeEffectDictionary*, const GraphicsPipelineDesc&, const RenderPassDesc&, SkEnumBitMask); static sk_sp MakeLoadMSAAPipeline(const MtlSharedContext*, MtlResourceProvider*, const RenderPassDesc&); ~MtlGraphicsPipeline() override {} id mtlPipelineState() const { return fPipelineState.get(); } id mtlDepthStencilState() const { return fDepthStencilState.get(); } uint32_t stencilReferenceValue() const { return fStencilReferenceValue; } private: MtlGraphicsPipeline(const skgpu::graphite::SharedContext* sharedContext, const PipelineInfo& pipelineInfo, sk_cfp> pso, sk_cfp> dss, uint32_t refValue); using MSLFunction = std::pair, std::string>; static sk_sp Make(const MtlSharedContext*, const std::string& label, const PipelineInfo&, MSLFunction vertexMain, SkSpan vertexAttrs, SkSpan instanceAttrs, MSLFunction fragmentMain, sk_cfp>, uint32_t stencilRefValue, const BlendInfo& blendInfo, const RenderPassDesc&); void freeGpuData() override; sk_cfp> fPipelineState; sk_cfp> fDepthStencilState; uint32_t fStencilReferenceValue; }; } // namespace skgpu::graphite #endif // skgpu_graphite_MtlGraphicsPipeline_DEFINED