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