blob: 20879253cae37940c21dbbb1c3748e7f1dd30698 [file] [log] [blame]
joshualitt30ba4362014-08-21 20:18:45 -07001/*
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
egdanielfa4cc8b2015-11-13 08:34:52 -080011#include "GrPipeline.h"
egdaniel574a4c12015-11-02 06:22:44 -080012#include "gl/GrGLProgramDataManager.h"
egdaniel7ea439b2015-12-03 09:20:44 -080013#include "gl/GrGLUniformHandler.h"
egdaniel0eafe792015-11-20 14:01:22 -080014#include "gl/GrGLVaryingHandler.h"
egdaniel8dcdedc2015-11-11 06:27:20 -080015#include "glsl/GrGLSLProgramBuilder.h"
egdaniel018fb622015-10-28 07:26:40 -070016#include "glsl/GrGLSLProgramDataManager.h"
joshualitt89c7a2e2014-10-10 14:11:59 -070017
bsalomonac856c92015-08-27 06:30:17 -070018class GrFragmentProcessor;
egdaniel574a4c12015-11-02 06:22:44 -080019class GrGLContextInfo;
egdaniel2d721d32015-11-11 13:06:05 -080020class GrGLSLShaderBuilder;
egdanielf5294392015-10-21 07:14:17 -070021class GrGLSLCaps;
bsalomonac856c92015-08-27 06:30:17 -070022
egdaniel8dcdedc2015-11-11 06:27:20 -080023class GrGLProgramBuilder : public GrGLSLProgramBuilder {
joshualitt47bb3822014-10-07 16:43:25 -070024public:
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 */
joshualitt873ad0e2015-01-20 09:08:51 -080032 static GrGLProgram* CreateProgram(const DrawArgs&, GrGLGpu*);
joshualitt47bb3822014-10-07 16:43:25 -070033
egdanielfa896322016-01-13 12:19:30 -080034 const GrCaps* caps() const override;
egdanielf5294392015-10-21 07:14:17 -070035 const GrGLSLCaps* glslCaps() const override;
36
egdaniel8dcdedc2015-11-11 06:27:20 -080037 GrGLGpu* gpu() const { return fGpu; }
joshualitt47bb3822014-10-07 16:43:25 -070038
egdaniel8dcdedc2015-11-11 06:27:20 -080039private:
joshualitt873ad0e2015-01-20 09:08:51 -080040 GrGLProgramBuilder(GrGLGpu*, const DrawArgs&);
joshualitt30ba4362014-08-21 20:18:45 -070041
joshualitt47bb3822014-10-07 16:43:25 -070042 void emitSamplers(const GrProcessor&,
egdanielfa896322016-01-13 12:19:30 -080043 GrGLSLTextureSampler::TextureSamplerArray* outSamplers) override;
joshualitt30ba4362014-08-21 20:18:45 -070044
egdaniel2d721d32015-11-11 13:06:05 -080045 bool compileAndAttachShaders(GrGLSLShaderBuilder& shader,
egdaniel574a4c12015-11-02 06:22:44 -080046 GrGLuint programId,
47 GrGLenum type,
48 SkTDArray<GrGLuint>* shaderIds);
joshualitt47bb3822014-10-07 16:43:25 -070049 GrGLProgram* finalize();
egdaniel8dcdedc2015-11-11 06:27:20 -080050 void bindProgramResourceLocations(GrGLuint programID);
joshualitt47bb3822014-10-07 16:43:25 -070051 bool checkLinkStatus(GrGLuint programID);
egdaniel8dcdedc2015-11-11 06:27:20 -080052 void resolveProgramResourceLocations(GrGLuint programID);
joshualitt47bb3822014-10-07 16:43:25 -070053 void cleanupProgram(GrGLuint programID, const SkTDArray<GrGLuint>& shaderIDs);
54 void cleanupShaders(const SkTDArray<GrGLuint>& shaderIDs);
joshualitt30ba4362014-08-21 20:18:45 -070055
joshualitt47bb3822014-10-07 16:43:25 -070056 // Subclasses create different programs
egdaniel8dcdedc2015-11-11 06:27:20 -080057 GrGLProgram* createProgram(GrGLuint programID);
joshualitt47bb3822014-10-07 16:43:25 -070058
egdaniel7ea439b2015-12-03 09:20:44 -080059 GrGLSLUniformHandler* uniformHandler() override { return &fUniformHandler; }
60 const GrGLSLUniformHandler* uniformHandler() const override { return &fUniformHandler; }
egdaniel0eafe792015-11-20 14:01:22 -080061 GrGLSLVaryingHandler* varyingHandler() override { return &fVaryingHandler; }
62
joshualitt47bb3822014-10-07 16:43:25 -070063
bsalomon861e1032014-12-16 07:33:49 -080064 GrGLGpu* fGpu;
egdaniel7ea439b2015-12-03 09:20:44 -080065 typedef GrGLSLUniformHandler::UniformHandle UniformHandle;
cdalton42717652015-06-18 11:54:30 -070066 SkTArray<UniformHandle> fSamplerUniforms;
joshualitt47bb3822014-10-07 16:43:25 -070067
egdaniel0eafe792015-11-20 14:01:22 -080068 GrGLVaryingHandler fVaryingHandler;
egdaniel7ea439b2015-12-03 09:20:44 -080069 GrGLUniformHandler fUniformHandler;
egdaniel0eafe792015-11-20 14:01:22 -080070
71 typedef GrGLSLProgramBuilder INHERITED;
joshualitt47bb3822014-10-07 16:43:25 -070072};
joshualitt30ba4362014-08-21 20:18:45 -070073#endif