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 18class GrFragmentProcessor; 19class GrGLContextInfo; 20class GrGLSLShaderBuilder; 21class GrGLSLCaps; 22 23class GrGLProgramBuilder : public GrGLSLProgramBuilder { 24public: 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 39private: 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