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 GrMtlPipelineStateBuilder_DEFINED 9 #define GrMtlPipelineStateBuilder_DEFINED 10 11 #include "src/gpu/GrPipeline.h" 12 #include "src/gpu/glsl/GrGLSLProgramBuilder.h" 13 #include "src/gpu/mtl/GrMtlUniformHandler.h" 14 #include "src/gpu/mtl/GrMtlVaryingHandler.h" 15 #include "src/sksl/SkSLCompiler.h" 16 17 #import <Metal/Metal.h> 18 19 class GrProgramDesc; 20 class GrProgramInfo; 21 class GrMtlCaps; 22 class GrMtlGpu; 23 class GrMtlPipelineState; 24 class SkReadBuffer; 25 26 struct GrMtlPrecompiledLibraries { 27 // TODO: wrap these in sk_cfp<> or unique_ptr<> when we remove ARC 28 id<MTLLibrary> fVertexLibrary; 29 id<MTLLibrary> fFragmentLibrary; 30 bool fRTFlip = false; 31 }; 32 33 class GrMtlPipelineStateBuilder : public GrGLSLProgramBuilder { 34 public: 35 /** Generates a pipeline state. 36 * 37 * The returned GrMtlPipelineState implements the supplied GrProgramInfo. 38 * 39 * @return the created pipeline if generation was successful; nullptr otherwise 40 */ 41 static GrMtlPipelineState* CreatePipelineState( 42 GrMtlGpu*, 43 const GrProgramDesc&, 44 const GrProgramInfo&, 45 const GrMtlPrecompiledLibraries* precompiledLibs = nullptr); 46 47 static bool PrecompileShaders(GrMtlGpu*, const SkData&, 48 GrMtlPrecompiledLibraries* precompiledLibs); 49 50 private: 51 GrMtlPipelineStateBuilder(GrMtlGpu*, const GrProgramDesc&, const GrProgramInfo&); 52 53 GrMtlPipelineState* finalize(const GrProgramDesc&, const GrProgramInfo&, 54 const GrMtlPrecompiledLibraries* precompiledLibraries); 55 56 const GrCaps* caps() const override; 57 58 SkSL::Compiler* shaderCompiler() const override; 59 60 void finalizeFragmentOutputColor(GrShaderVar& outputColor) override; 61 62 void finalizeFragmentSecondaryColor(GrShaderVar& outputColor) override; 63 64 id<MTLLibrary> compileMtlShaderLibrary(const SkSL::String& shader, 65 SkSL::Program::Inputs inputs, 66 GrContextOptions::ShaderErrorHandler* errorHandler); 67 void storeShadersInCache(const SkSL::String shaders[], const SkSL::Program::Inputs inputs[], 68 SkSL::Program::Settings*, sk_sp<SkData>, bool isSkSL); 69 uniformHandler()70 GrGLSLUniformHandler* uniformHandler() override { return &fUniformHandler; } uniformHandler()71 const GrGLSLUniformHandler* uniformHandler() const override { return &fUniformHandler; } varyingHandler()72 GrGLSLVaryingHandler* varyingHandler() override { return &fVaryingHandler; } 73 74 GrMtlGpu* fGpu; 75 GrMtlUniformHandler fUniformHandler; 76 GrMtlVaryingHandler fVaryingHandler; 77 78 using INHERITED = GrGLSLProgramBuilder; 79 }; 80 #endif 81