• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2014 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 GrGLProgramBuilder_DEFINED
9 #define GrGLProgramBuilder_DEFINED
10 
11 #include "include/gpu/GrContextOptions.h"
12 #include "include/private/base/SkTDArray.h"
13 #include "src/gpu/ganesh/GrPipeline.h"
14 #include "src/gpu/ganesh/gl/GrGLProgram.h"
15 #include "src/gpu/ganesh/gl/GrGLProgramDataManager.h"
16 #include "src/gpu/ganesh/gl/GrGLUniformHandler.h"
17 #include "src/gpu/ganesh/gl/GrGLVaryingHandler.h"
18 #include "src/gpu/ganesh/glsl/GrGLSLProgramBuilder.h"
19 #include "src/gpu/ganesh/glsl/GrGLSLProgramDataManager.h"
20 #include "src/sksl/ir/SkSLProgram.h"
21 
22 class GrFragmentProcessor;
23 class GrGLContextInfo;
24 class GrProgramDesc;
25 class GrGLSLShaderBuilder;
26 struct GrShaderCaps;
27 
28 struct GrGLPrecompiledProgram {
29     GrGLPrecompiledProgram(GrGLuint programID = 0,
30                            SkSL::Program::Interface intf = SkSL::Program::Interface())
fProgramIDGrGLPrecompiledProgram31             : fProgramID(programID), fInterface(intf) {}
32 
33     GrGLuint fProgramID;
34     SkSL::Program::Interface fInterface;
35 };
36 
37 class GrGLProgramBuilder : public GrGLSLProgramBuilder {
38 public:
39     /** Generates a shader program.
40      *
41      * The program implements what is specified in the stages given as input.
42      * After successful generation, the builder result objects are available
43      * to be used.
44      * If a GL program has already been created, the program ID and interface can
45      * be supplied to skip the shader compilation.
46      * @return the created program if generation was successful.
47      */
48     static sk_sp<GrGLProgram> CreateProgram(GrDirectContext*,
49                                             const GrProgramDesc&,
50                                             const GrProgramInfo&,
51                                             const GrGLPrecompiledProgram* = nullptr);
52 
53     static bool PrecompileProgram(GrDirectContext*, GrGLPrecompiledProgram*, const SkData&);
54 
55     const GrCaps* caps() const override;
56 
gpu()57     GrGLGpu* gpu() const { return fGpu; }
58 
59 private:
60     GrGLProgramBuilder(GrGLGpu*, const GrProgramDesc&, const GrProgramInfo&);
61 
62     void addInputVars(const SkSL::Program::Interface&);
63     bool compileAndAttachShaders(const std::string& glsl,
64                                  GrGLuint programId,
65                                  GrGLenum type,
66                                  SkTDArray<GrGLuint>* shaderIds,
67                                  bool shaderWasCached,
68                                  GrContextOptions::ShaderErrorHandler* errorHandler);
69 
70     void computeCountsAndStrides(GrGLuint programID,
71                                  const GrGeometryProcessor&,
72                                  bool bindAttribLocations);
73     void storeShaderInCache(const SkSL::Program::Interface&,
74                             GrGLuint programID,
75                             const std::string shaders[],
76                             bool isSkSL,
77                             SkSL::ProgramSettings* settings);
78     sk_sp<GrGLProgram> finalize(const GrGLPrecompiledProgram*);
79     void bindProgramResourceLocations(GrGLuint programID);
80     void resolveProgramResourceLocations(GrGLuint programID, bool force);
81 
82     // Subclasses create different programs
83     sk_sp<GrGLProgram> createProgram(GrGLuint programID);
84 
uniformHandler()85     GrGLSLUniformHandler* uniformHandler() override { return &fUniformHandler; }
uniformHandler()86     const GrGLSLUniformHandler* uniformHandler() const override { return &fUniformHandler; }
varyingHandler()87     GrGLSLVaryingHandler* varyingHandler() override { return &fVaryingHandler; }
88 
89     GrGLGpu*              fGpu;
90     GrGLVaryingHandler    fVaryingHandler;
91     GrGLUniformHandler    fUniformHandler;
92 
93     std::unique_ptr<GrGLProgram::Attribute[]> fAttributes;
94     int fVertexAttributeCnt;
95     int fInstanceAttributeCnt;
96     size_t fVertexStride;
97     size_t fInstanceStride;
98 
99     // shader pulled from cache. Data is organized as:
100     // SkSL::Program::Interface interface
101     // int binaryFormat
102     // (all remaining bytes) char[] binary
103     sk_sp<SkData> fCached;
104 
105     using INHERITED = GrGLSLProgramBuilder;
106 };
107 #endif
108