• 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 "GrPipeline.h"
12 #include "gl/GrGLProgram.h"
13 #include "gl/GrGLProgramDataManager.h"
14 #include "gl/GrGLUniformHandler.h"
15 #include "gl/GrGLVaryingHandler.h"
16 #include "glsl/GrGLSLProgramBuilder.h"
17 #include "glsl/GrGLSLProgramDataManager.h"
18 #include "ir/SkSLProgram.h"
19 
20 class GrFragmentProcessor;
21 class GrGLContextInfo;
22 class GrProgramDesc;
23 class GrGLSLShaderBuilder;
24 class GrShaderCaps;
25 
26 class GrGLProgramBuilder : public GrGLSLProgramBuilder {
27 public:
28     /** Generates a shader program.
29      *
30      * The program implements what is specified in the stages given as input.
31      * After successful generation, the builder result objects are available
32      * to be used.
33      * This function may modify the GrProgramDesc by setting the surface origin
34      * key to 0 (unspecified) if it turns out the program does not care about
35      * the surface origin.
36      * @return true if generation was successful.
37      */
38     static GrGLProgram* CreateProgram(GrRenderTarget*, GrSurfaceOrigin,
39                                       const GrPrimitiveProcessor&,
40                                       const GrTextureProxy* const primProcProxies[],
41                                       const GrPipeline&,
42                                       GrProgramDesc*,
43                                       GrGLGpu*);
44 
45     const GrCaps* caps() const override;
46 
gpu()47     GrGLGpu* gpu() const { return fGpu; }
48 
49 private:
50     GrGLProgramBuilder(GrGLGpu*, GrRenderTarget*, GrSurfaceOrigin,
51                        const GrPipeline&, const GrPrimitiveProcessor&,
52                        const GrTextureProxy* const primProcProxies[], GrProgramDesc*);
53 
54     void addInputVars(const SkSL::Program::Inputs& inputs);
55     bool compileAndAttachShaders(const char* glsl,
56                                  int length,
57                                  GrGLuint programId,
58                                  GrGLenum type,
59                                  SkTDArray<GrGLuint>* shaderIds,
60                                  const SkSL::Program::Settings& settings,
61                                  const SkSL::Program::Inputs& inputs);
62 
63     bool compileAndAttachShaders(GrGLSLShaderBuilder& shader,
64                                  GrGLuint programId,
65                                  GrGLenum type,
66                                  SkTDArray<GrGLuint>* shaderIds,
67                                  const SkSL::Program::Settings& settings,
68                                  SkSL::Program::Inputs* outInputs);
69     void computeCountsAndStrides(GrGLuint programID, const GrPrimitiveProcessor& primProc,
70                                  bool bindAttribLocations);
71     void storeShaderInCache(const SkSL::Program::Inputs& inputs, GrGLuint programID,
72                             const SkSL::String& glsl);
73     GrGLProgram* finalize();
74     void bindProgramResourceLocations(GrGLuint programID);
75     bool checkLinkStatus(GrGLuint programID);
76     void resolveProgramResourceLocations(GrGLuint programID);
77     void cleanupProgram(GrGLuint programID, const SkTDArray<GrGLuint>& shaderIDs);
78     void cleanupShaders(const SkTDArray<GrGLuint>& shaderIDs);
79 
80     // Subclasses create different programs
81     GrGLProgram* createProgram(GrGLuint programID);
82 
uniformHandler()83     GrGLSLUniformHandler* uniformHandler() override { return &fUniformHandler; }
uniformHandler()84     const GrGLSLUniformHandler* uniformHandler() const override { return &fUniformHandler; }
varyingHandler()85     GrGLSLVaryingHandler* varyingHandler() override { return &fVaryingHandler; }
86 
87     GrGLGpu*              fGpu;
88     GrGLVaryingHandler    fVaryingHandler;
89     GrGLUniformHandler    fUniformHandler;
90 
91     std::unique_ptr<GrGLProgram::Attribute[]> fAttributes;
92     int fVertexAttributeCnt;
93     int fInstanceAttributeCnt;
94     size_t fVertexStride;
95     size_t fInstanceStride;
96 
97     // shader pulled from cache. Data is organized as:
98     // SkSL::Program::Inputs inputs
99     // int binaryFormat
100     // (all remaining bytes) char[] binary
101     sk_sp<SkData> fCached;
102 
103     typedef GrGLSLProgramBuilder INHERITED;
104 };
105 #endif
106