joshualitt | 30ba436 | 2014-08-21 20:18:45 -0700 | [diff] [blame] | 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 | |
egdaniel | fa4cc8b | 2015-11-13 08:34:52 -0800 | [diff] [blame] | 11 | #include "GrPipeline.h" |
egdaniel | 574a4c1 | 2015-11-02 06:22:44 -0800 | [diff] [blame] | 12 | #include "gl/GrGLProgramDataManager.h" |
egdaniel | 7ea439b | 2015-12-03 09:20:44 -0800 | [diff] [blame] | 13 | #include "gl/GrGLUniformHandler.h" |
egdaniel | 0eafe79 | 2015-11-20 14:01:22 -0800 | [diff] [blame] | 14 | #include "gl/GrGLVaryingHandler.h" |
egdaniel | 8dcdedc | 2015-11-11 06:27:20 -0800 | [diff] [blame] | 15 | #include "glsl/GrGLSLProgramBuilder.h" |
egdaniel | 018fb62 | 2015-10-28 07:26:40 -0700 | [diff] [blame] | 16 | #include "glsl/GrGLSLProgramDataManager.h" |
joshualitt | 89c7a2e | 2014-10-10 14:11:59 -0700 | [diff] [blame] | 17 | |
bsalomon | ac856c9 | 2015-08-27 06:30:17 -0700 | [diff] [blame] | 18 | class GrFragmentProcessor; |
egdaniel | 574a4c1 | 2015-11-02 06:22:44 -0800 | [diff] [blame] | 19 | class GrGLContextInfo; |
egdaniel | 2d721d3 | 2015-11-11 13:06:05 -0800 | [diff] [blame] | 20 | class GrGLSLShaderBuilder; |
egdaniel | f529439 | 2015-10-21 07:14:17 -0700 | [diff] [blame] | 21 | class GrGLSLCaps; |
bsalomon | ac856c9 | 2015-08-27 06:30:17 -0700 | [diff] [blame] | 22 | |
egdaniel | 8dcdedc | 2015-11-11 06:27:20 -0800 | [diff] [blame] | 23 | class GrGLProgramBuilder : public GrGLSLProgramBuilder { |
joshualitt | 47bb382 | 2014-10-07 16:43:25 -0700 | [diff] [blame] | 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 | */ |
joshualitt | 873ad0e | 2015-01-20 09:08:51 -0800 | [diff] [blame] | 32 | static GrGLProgram* CreateProgram(const DrawArgs&, GrGLGpu*); |
joshualitt | 47bb382 | 2014-10-07 16:43:25 -0700 | [diff] [blame] | 33 | |
egdaniel | fa89632 | 2016-01-13 12:19:30 -0800 | [diff] [blame] | 34 | const GrCaps* caps() const override; |
egdaniel | f529439 | 2015-10-21 07:14:17 -0700 | [diff] [blame] | 35 | const GrGLSLCaps* glslCaps() const override; |
| 36 | |
egdaniel | 8dcdedc | 2015-11-11 06:27:20 -0800 | [diff] [blame] | 37 | GrGLGpu* gpu() const { return fGpu; } |
joshualitt | 47bb382 | 2014-10-07 16:43:25 -0700 | [diff] [blame] | 38 | |
egdaniel | 8dcdedc | 2015-11-11 06:27:20 -0800 | [diff] [blame] | 39 | private: |
joshualitt | 873ad0e | 2015-01-20 09:08:51 -0800 | [diff] [blame] | 40 | GrGLProgramBuilder(GrGLGpu*, const DrawArgs&); |
joshualitt | 30ba436 | 2014-08-21 20:18:45 -0700 | [diff] [blame] | 41 | |
joshualitt | 47bb382 | 2014-10-07 16:43:25 -0700 | [diff] [blame] | 42 | void emitSamplers(const GrProcessor&, |
egdaniel | fa89632 | 2016-01-13 12:19:30 -0800 | [diff] [blame] | 43 | GrGLSLTextureSampler::TextureSamplerArray* outSamplers) override; |
joshualitt | 30ba436 | 2014-08-21 20:18:45 -0700 | [diff] [blame] | 44 | |
egdaniel | 2d721d3 | 2015-11-11 13:06:05 -0800 | [diff] [blame] | 45 | bool compileAndAttachShaders(GrGLSLShaderBuilder& shader, |
egdaniel | 574a4c1 | 2015-11-02 06:22:44 -0800 | [diff] [blame] | 46 | GrGLuint programId, |
| 47 | GrGLenum type, |
| 48 | SkTDArray<GrGLuint>* shaderIds); |
joshualitt | 47bb382 | 2014-10-07 16:43:25 -0700 | [diff] [blame] | 49 | GrGLProgram* finalize(); |
egdaniel | 8dcdedc | 2015-11-11 06:27:20 -0800 | [diff] [blame] | 50 | void bindProgramResourceLocations(GrGLuint programID); |
joshualitt | 47bb382 | 2014-10-07 16:43:25 -0700 | [diff] [blame] | 51 | bool checkLinkStatus(GrGLuint programID); |
egdaniel | 8dcdedc | 2015-11-11 06:27:20 -0800 | [diff] [blame] | 52 | void resolveProgramResourceLocations(GrGLuint programID); |
joshualitt | 47bb382 | 2014-10-07 16:43:25 -0700 | [diff] [blame] | 53 | void cleanupProgram(GrGLuint programID, const SkTDArray<GrGLuint>& shaderIDs); |
| 54 | void cleanupShaders(const SkTDArray<GrGLuint>& shaderIDs); |
joshualitt | 30ba436 | 2014-08-21 20:18:45 -0700 | [diff] [blame] | 55 | |
joshualitt | 47bb382 | 2014-10-07 16:43:25 -0700 | [diff] [blame] | 56 | // Subclasses create different programs |
egdaniel | 8dcdedc | 2015-11-11 06:27:20 -0800 | [diff] [blame] | 57 | GrGLProgram* createProgram(GrGLuint programID); |
joshualitt | 47bb382 | 2014-10-07 16:43:25 -0700 | [diff] [blame] | 58 | |
egdaniel | 7ea439b | 2015-12-03 09:20:44 -0800 | [diff] [blame] | 59 | GrGLSLUniformHandler* uniformHandler() override { return &fUniformHandler; } |
| 60 | const GrGLSLUniformHandler* uniformHandler() const override { return &fUniformHandler; } |
egdaniel | 0eafe79 | 2015-11-20 14:01:22 -0800 | [diff] [blame] | 61 | GrGLSLVaryingHandler* varyingHandler() override { return &fVaryingHandler; } |
| 62 | |
joshualitt | 47bb382 | 2014-10-07 16:43:25 -0700 | [diff] [blame] | 63 | |
bsalomon | 861e103 | 2014-12-16 07:33:49 -0800 | [diff] [blame] | 64 | GrGLGpu* fGpu; |
egdaniel | 7ea439b | 2015-12-03 09:20:44 -0800 | [diff] [blame] | 65 | typedef GrGLSLUniformHandler::UniformHandle UniformHandle; |
cdalton | 4271765 | 2015-06-18 11:54:30 -0700 | [diff] [blame] | 66 | SkTArray<UniformHandle> fSamplerUniforms; |
joshualitt | 47bb382 | 2014-10-07 16:43:25 -0700 | [diff] [blame] | 67 | |
egdaniel | 0eafe79 | 2015-11-20 14:01:22 -0800 | [diff] [blame] | 68 | GrGLVaryingHandler fVaryingHandler; |
egdaniel | 7ea439b | 2015-12-03 09:20:44 -0800 | [diff] [blame] | 69 | GrGLUniformHandler fUniformHandler; |
egdaniel | 0eafe79 | 2015-11-20 14:01:22 -0800 | [diff] [blame] | 70 | |
| 71 | typedef GrGLSLProgramBuilder INHERITED; |
joshualitt | 47bb382 | 2014-10-07 16:43:25 -0700 | [diff] [blame] | 72 | }; |
joshualitt | 30ba436 | 2014-08-21 20:18:45 -0700 | [diff] [blame] | 73 | #endif |