blob: cde80ae10a7e8cf9e6869392a05e8213976c3d45 [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
Mike Kleinc0bd9f92019-04-23 12:05:21 -050011#include "src/gpu/GrPipeline.h"
12#include "src/gpu/gl/GrGLProgram.h"
13#include "src/gpu/gl/GrGLProgramDataManager.h"
14#include "src/gpu/gl/GrGLUniformHandler.h"
15#include "src/gpu/gl/GrGLVaryingHandler.h"
16#include "src/gpu/glsl/GrGLSLProgramBuilder.h"
17#include "src/gpu/glsl/GrGLSLProgramDataManager.h"
18#include "src/sksl/ir/SkSLProgram.h"
joshualitt89c7a2e2014-10-10 14:11:59 -070019
bsalomonac856c92015-08-27 06:30:17 -070020class GrFragmentProcessor;
egdaniel574a4c12015-11-02 06:22:44 -080021class GrGLContextInfo;
egdaniel5d8f69f2016-09-07 07:24:12 -070022class GrProgramDesc;
egdaniel2d721d32015-11-11 13:06:05 -080023class GrGLSLShaderBuilder;
Brian Salomon94efbf52016-11-29 13:43:05 -050024class GrShaderCaps;
bsalomonac856c92015-08-27 06:30:17 -070025
egdaniel8dcdedc2015-11-11 06:27:20 -080026class GrGLProgramBuilder : public GrGLSLProgramBuilder {
joshualitt47bb3822014-10-07 16:43:25 -070027public:
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.
Ethan Nicholas38657112017-02-09 17:01:22 -050033 * 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.
joshualitt47bb3822014-10-07 16:43:25 -070036 * @return true if generation was successful.
37 */
Robert Phillipsd0fe8752019-01-31 14:13:59 -050038 static GrGLProgram* CreateProgram(GrRenderTarget*, GrSurfaceOrigin,
39 const GrPrimitiveProcessor&,
Greg Daniel9a51a862018-11-30 10:18:14 -050040 const GrTextureProxy* const primProcProxies[],
Brian Salomonff168d92018-06-23 15:17:27 -040041 const GrPipeline&,
Ethan Nicholas38657112017-02-09 17:01:22 -050042 GrProgramDesc*,
egdaniel0e1853c2016-03-17 11:35:45 -070043 GrGLGpu*);
joshualitt47bb3822014-10-07 16:43:25 -070044
egdanielfa896322016-01-13 12:19:30 -080045 const GrCaps* caps() const override;
egdanielf5294392015-10-21 07:14:17 -070046
egdaniel8dcdedc2015-11-11 06:27:20 -080047 GrGLGpu* gpu() const { return fGpu; }
joshualitt47bb3822014-10-07 16:43:25 -070048
egdaniel8dcdedc2015-11-11 06:27:20 -080049private:
Robert Phillipsd0fe8752019-01-31 14:13:59 -050050 GrGLProgramBuilder(GrGLGpu*, GrRenderTarget*, GrSurfaceOrigin,
51 const GrPipeline&, const GrPrimitiveProcessor&,
Greg Daniel9a51a862018-11-30 10:18:14 -050052 const GrTextureProxy* const primProcProxies[], GrProgramDesc*);
joshualitt30ba4362014-08-21 20:18:45 -070053
Ethan Nicholascd700e92018-08-24 16:43:57 -040054 void addInputVars(const SkSL::Program::Inputs& inputs);
Brian Osmanac9be9d2019-05-01 10:29:34 -040055 bool compileAndAttachShaders(const SkSL::String& glsl,
Ethan Nicholasd1b2eec2017-11-01 15:45:43 -040056 GrGLuint programId,
57 GrGLenum type,
58 SkTDArray<GrGLuint>* shaderIds,
Ethan Nicholasd1b2eec2017-11-01 15:45:43 -040059 const SkSL::Program::Inputs& inputs);
60
Ethan Nicholasad77dce2018-07-11 13:59:03 -040061 void computeCountsAndStrides(GrGLuint programID, const GrPrimitiveProcessor& primProc,
62 bool bindAttribLocations);
Ethan Nicholas8d058832019-01-07 10:49:58 -050063 void storeShaderInCache(const SkSL::Program::Inputs& inputs, GrGLuint programID,
Brian Osmana085a412019-04-25 09:44:43 -040064 const SkSL::String shaders[], bool isSkSL);
joshualitt47bb3822014-10-07 16:43:25 -070065 GrGLProgram* finalize();
egdaniel8dcdedc2015-11-11 06:27:20 -080066 void bindProgramResourceLocations(GrGLuint programID);
joshualitt47bb3822014-10-07 16:43:25 -070067 bool checkLinkStatus(GrGLuint programID);
egdaniel8dcdedc2015-11-11 06:27:20 -080068 void resolveProgramResourceLocations(GrGLuint programID);
joshualitt47bb3822014-10-07 16:43:25 -070069 void cleanupProgram(GrGLuint programID, const SkTDArray<GrGLuint>& shaderIDs);
70 void cleanupShaders(const SkTDArray<GrGLuint>& shaderIDs);
joshualitt30ba4362014-08-21 20:18:45 -070071
joshualitt47bb3822014-10-07 16:43:25 -070072 // Subclasses create different programs
egdaniel8dcdedc2015-11-11 06:27:20 -080073 GrGLProgram* createProgram(GrGLuint programID);
joshualitt47bb3822014-10-07 16:43:25 -070074
egdaniel7ea439b2015-12-03 09:20:44 -080075 GrGLSLUniformHandler* uniformHandler() override { return &fUniformHandler; }
76 const GrGLSLUniformHandler* uniformHandler() const override { return &fUniformHandler; }
egdaniel0eafe792015-11-20 14:01:22 -080077 GrGLSLVaryingHandler* varyingHandler() override { return &fVaryingHandler; }
78
cdalton9c3f1432016-03-11 10:07:37 -080079 GrGLGpu* fGpu;
80 GrGLVaryingHandler fVaryingHandler;
81 GrGLUniformHandler fUniformHandler;
egdaniel0eafe792015-11-20 14:01:22 -080082
Brian Salomon802cb312018-06-08 18:05:20 -040083 std::unique_ptr<GrGLProgram::Attribute[]> fAttributes;
Brian Salomon92be2f72018-06-19 14:33:47 -040084 int fVertexAttributeCnt;
85 int fInstanceAttributeCnt;
86 size_t fVertexStride;
87 size_t fInstanceStride;
Brian Salomon802cb312018-06-08 18:05:20 -040088
Ethan Nicholasd1b2eec2017-11-01 15:45:43 -040089 // shader pulled from cache. Data is organized as:
90 // SkSL::Program::Inputs inputs
91 // int binaryFormat
92 // (all remaining bytes) char[] binary
93 sk_sp<SkData> fCached;
94
halcanary9d524f22016-03-29 09:03:52 -070095 typedef GrGLSLProgramBuilder INHERITED;
joshualitt47bb3822014-10-07 16:43:25 -070096};
joshualitt30ba4362014-08-21 20:18:45 -070097#endif