1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2021 Google LLC 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker #ifndef skgpu_graphite_MtlGraphicsPipeline_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker #define skgpu_graphite_MtlGraphicsPipeline_DEFINED 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSpan.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "include/ports/SkCFObject.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/GraphicsPipeline.h" 15*c8dee2aaSAndroid Build Coastguard Worker #include <memory> 16*c8dee2aaSAndroid Build Coastguard Worker 17*c8dee2aaSAndroid Build Coastguard Worker #import <Metal/Metal.h> 18*c8dee2aaSAndroid Build Coastguard Worker 19*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu { 20*c8dee2aaSAndroid Build Coastguard Worker struct BlendInfo; 21*c8dee2aaSAndroid Build Coastguard Worker } 22*c8dee2aaSAndroid Build Coastguard Worker 23*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu::graphite { 24*c8dee2aaSAndroid Build Coastguard Worker 25*c8dee2aaSAndroid Build Coastguard Worker class Attribute; 26*c8dee2aaSAndroid Build Coastguard Worker class Context; 27*c8dee2aaSAndroid Build Coastguard Worker class GraphicsPipelineDesc; 28*c8dee2aaSAndroid Build Coastguard Worker class MtlResourceProvider; 29*c8dee2aaSAndroid Build Coastguard Worker class MtlSharedContext; 30*c8dee2aaSAndroid Build Coastguard Worker struct RenderPassDesc; 31*c8dee2aaSAndroid Build Coastguard Worker class RuntimeEffectDictionary; 32*c8dee2aaSAndroid Build Coastguard Worker 33*c8dee2aaSAndroid Build Coastguard Worker class MtlGraphicsPipeline final : public GraphicsPipeline { 34*c8dee2aaSAndroid Build Coastguard Worker public: 35*c8dee2aaSAndroid Build Coastguard Worker inline static constexpr unsigned int kIntrinsicUniformBufferIndex = 0; 36*c8dee2aaSAndroid Build Coastguard Worker inline static constexpr unsigned int kRenderStepUniformBufferIndex = 1; 37*c8dee2aaSAndroid Build Coastguard Worker inline static constexpr unsigned int kPaintUniformBufferIndex = 2; 38*c8dee2aaSAndroid Build Coastguard Worker inline static constexpr unsigned int kVertexBufferIndex = 3; 39*c8dee2aaSAndroid Build Coastguard Worker inline static constexpr unsigned int kInstanceBufferIndex = 4; 40*c8dee2aaSAndroid Build Coastguard Worker inline static constexpr unsigned int kGradientBufferIndex = 5; 41*c8dee2aaSAndroid Build Coastguard Worker 42*c8dee2aaSAndroid Build Coastguard Worker static sk_sp<MtlGraphicsPipeline> Make(const MtlSharedContext*, 43*c8dee2aaSAndroid Build Coastguard Worker MtlResourceProvider*, 44*c8dee2aaSAndroid Build Coastguard Worker const RuntimeEffectDictionary*, 45*c8dee2aaSAndroid Build Coastguard Worker const GraphicsPipelineDesc&, 46*c8dee2aaSAndroid Build Coastguard Worker const RenderPassDesc&, 47*c8dee2aaSAndroid Build Coastguard Worker SkEnumBitMask<PipelineCreationFlags>); 48*c8dee2aaSAndroid Build Coastguard Worker 49*c8dee2aaSAndroid Build Coastguard Worker static sk_sp<MtlGraphicsPipeline> MakeLoadMSAAPipeline(const MtlSharedContext*, 50*c8dee2aaSAndroid Build Coastguard Worker MtlResourceProvider*, 51*c8dee2aaSAndroid Build Coastguard Worker const RenderPassDesc&); 52*c8dee2aaSAndroid Build Coastguard Worker ~MtlGraphicsPipeline()53*c8dee2aaSAndroid Build Coastguard Worker ~MtlGraphicsPipeline() override {} 54*c8dee2aaSAndroid Build Coastguard Worker mtlPipelineState()55*c8dee2aaSAndroid Build Coastguard Worker id<MTLRenderPipelineState> mtlPipelineState() const { return fPipelineState.get(); } mtlDepthStencilState()56*c8dee2aaSAndroid Build Coastguard Worker id<MTLDepthStencilState> mtlDepthStencilState() const { return fDepthStencilState.get(); } stencilReferenceValue()57*c8dee2aaSAndroid Build Coastguard Worker uint32_t stencilReferenceValue() const { return fStencilReferenceValue; } 58*c8dee2aaSAndroid Build Coastguard Worker 59*c8dee2aaSAndroid Build Coastguard Worker private: 60*c8dee2aaSAndroid Build Coastguard Worker MtlGraphicsPipeline(const skgpu::graphite::SharedContext* sharedContext, 61*c8dee2aaSAndroid Build Coastguard Worker const PipelineInfo& pipelineInfo, 62*c8dee2aaSAndroid Build Coastguard Worker sk_cfp<id<MTLRenderPipelineState>> pso, 63*c8dee2aaSAndroid Build Coastguard Worker sk_cfp<id<MTLDepthStencilState>> dss, 64*c8dee2aaSAndroid Build Coastguard Worker uint32_t refValue); 65*c8dee2aaSAndroid Build Coastguard Worker 66*c8dee2aaSAndroid Build Coastguard Worker using MSLFunction = std::pair<id<MTLLibrary>, std::string>; 67*c8dee2aaSAndroid Build Coastguard Worker static sk_sp<MtlGraphicsPipeline> Make(const MtlSharedContext*, 68*c8dee2aaSAndroid Build Coastguard Worker const std::string& label, 69*c8dee2aaSAndroid Build Coastguard Worker const PipelineInfo&, 70*c8dee2aaSAndroid Build Coastguard Worker MSLFunction vertexMain, 71*c8dee2aaSAndroid Build Coastguard Worker SkSpan<const Attribute> vertexAttrs, 72*c8dee2aaSAndroid Build Coastguard Worker SkSpan<const Attribute> instanceAttrs, 73*c8dee2aaSAndroid Build Coastguard Worker MSLFunction fragmentMain, 74*c8dee2aaSAndroid Build Coastguard Worker sk_cfp<id<MTLDepthStencilState>>, 75*c8dee2aaSAndroid Build Coastguard Worker uint32_t stencilRefValue, 76*c8dee2aaSAndroid Build Coastguard Worker const BlendInfo& blendInfo, 77*c8dee2aaSAndroid Build Coastguard Worker const RenderPassDesc&); 78*c8dee2aaSAndroid Build Coastguard Worker 79*c8dee2aaSAndroid Build Coastguard Worker void freeGpuData() override; 80*c8dee2aaSAndroid Build Coastguard Worker 81*c8dee2aaSAndroid Build Coastguard Worker sk_cfp<id<MTLRenderPipelineState>> fPipelineState; 82*c8dee2aaSAndroid Build Coastguard Worker sk_cfp<id<MTLDepthStencilState>> fDepthStencilState; 83*c8dee2aaSAndroid Build Coastguard Worker uint32_t fStencilReferenceValue; 84*c8dee2aaSAndroid Build Coastguard Worker }; 85*c8dee2aaSAndroid Build Coastguard Worker 86*c8dee2aaSAndroid Build Coastguard Worker } // namespace skgpu::graphite 87*c8dee2aaSAndroid Build Coastguard Worker 88*c8dee2aaSAndroid Build Coastguard Worker #endif // skgpu_graphite_MtlGraphicsPipeline_DEFINED 89