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