• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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