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 
     18 class GrFragmentProcessor;
     19 class GrGLContextInfo;
     20 class GrGLSLShaderBuilder;
     21 class GrGLSLCaps;
     22 
     23 class GrGLProgramBuilder : public GrGLSLProgramBuilder {
     24 public:
     25     /** Generates a shader program.
     26      *
     27      * The program implements what is specified in the stages given as input.
     28      * After successful generation, the builder result objects are available
     29      * to be used.
     30      * @return true if generation was successful.
     31      */
     32     static GrGLProgram* CreateProgram(const DrawArgs&, GrGLGpu*);
     33 
     34     const GrCaps* caps() const override;
     35     const GrGLSLCaps* glslCaps() const override;
     36 
     37     GrGLGpu* gpu() const { return fGpu; }
     38 
     39 private:
     40     GrGLProgramBuilder(GrGLGpu*, const DrawArgs&);
     41 
     42     void emitSamplers(const GrProcessor&,
     43                       GrGLSLTextureSampler::TextureSamplerArray* outSamplers) override;
     44 
     45     bool compileAndAttachShaders(GrGLSLShaderBuilder& shader,
     46                                  GrGLuint programId,
     47                                  GrGLenum type,
     48                                  SkTDArray<GrGLuint>* shaderIds);
     49     GrGLProgram* finalize();
     50     void bindProgramResourceLocations(GrGLuint programID);
     51     bool checkLinkStatus(GrGLuint programID);
     52     void resolveProgramResourceLocations(GrGLuint programID);
     53     void cleanupProgram(GrGLuint programID, const SkTDArray<GrGLuint>& shaderIDs);
     54     void cleanupShaders(const SkTDArray<GrGLuint>& shaderIDs);
     55 
     56     // Subclasses create different programs
     57     GrGLProgram* createProgram(GrGLuint programID);
     58 
     59     GrGLSLUniformHandler* uniformHandler() override { return &fUniformHandler; }
     60     const GrGLSLUniformHandler* uniformHandler() const override { return &fUniformHandler; }
     61     GrGLSLVaryingHandler* varyingHandler() override { return &fVaryingHandler; }
     62 
     63 
     64     GrGLGpu* fGpu;
     65     typedef GrGLSLUniformHandler::UniformHandle UniformHandle;
     66     SkTArray<UniformHandle> fSamplerUniforms;
     67 
     68     GrGLVaryingHandler        fVaryingHandler;
     69     GrGLUniformHandler        fUniformHandler;
     70 
     71     typedef GrGLSLProgramBuilder INHERITED;
     72 };
     73 #endif
     74