blob: 474544060bbb8f9312a66b58e3962a12085b0f7c [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
joshualitt30ba4362014-08-21 20:18:45 -070011#include "GrGLFragmentShaderBuilder.h"
12#include "GrGLGeometryShaderBuilder.h"
13#include "GrGLVertexShaderBuilder.h"
egdaniel018fb622015-10-28 07:26:40 -070014#include "glsl/GrGLSLProgramDataManager.h"
egdaniel7dc4bd02015-10-29 07:57:01 -070015#include "glsl/GrGLSLTextureSampler.h"
joshualitt8072caa2015-02-12 14:20:52 -080016#include "../GrGLPrimitiveProcessor.h"
egdanielc2304142014-12-11 13:15:13 -080017#include "../GrGLXferProcessor.h"
egdaniel8dd688b2015-01-22 10:16:09 -080018#include "../../GrPipeline.h"
joshualitt89c7a2e2014-10-10 14:11:59 -070019
bsalomonac856c92015-08-27 06:30:17 -070020class GrFragmentProcessor;
egdanielf5294392015-10-21 07:14:17 -070021class GrGLSLCaps;
bsalomonac856c92015-08-27 06:30:17 -070022
joshualitt7375d6b2015-08-07 13:36:44 -070023// Enough precision to represent 1 / 2048 accurately in printf
24#define GR_SIGNIFICANT_POW2_DECIMAL_DIG 11
25
joshualitt47bb3822014-10-07 16:43:25 -070026/*
27 * This is the base class for a series of interfaces. This base class *MUST* remain abstract with
28 * NO data members because it is used in multiple interface inheritance.
29 * Heirarchy:
30 * GrGLUniformBuilder
31 * / \
32 * GrGLFPBuilder GrGLGPBuilder
33 * \ /
34 * GrGLProgramBuilder(internal use only)
35 */
36class GrGLUniformBuilder {
joshualitt30ba4362014-08-21 20:18:45 -070037public:
38 enum ShaderVisibility {
bsalomon17168df2014-12-09 09:00:49 -080039 kVertex_Visibility = 1 << kVertex_GrShaderType,
40 kGeometry_Visibility = 1 << kGeometry_GrShaderType,
41 kFragment_Visibility = 1 << kFragment_GrShaderType,
joshualitt30ba4362014-08-21 20:18:45 -070042 };
43
joshualitt47bb3822014-10-07 16:43:25 -070044 virtual ~GrGLUniformBuilder() {}
45
egdaniel018fb622015-10-28 07:26:40 -070046 typedef GrGLSLProgramDataManager::UniformHandle UniformHandle;
joshualittd8dd47b2015-09-11 11:45:01 -070047 typedef GrGLProgramDataManager::SeparableVaryingHandle SeparableVaryingHandle;
joshualitt47bb3822014-10-07 16:43:25 -070048
49 /** Add a uniform variable to the current program, that has visibility in one or more shaders.
50 visibility is a bitfield of ShaderVisibility values indicating from which shaders the
51 uniform should be accessible. At least one bit must be set. Geometry shader uniforms are not
halcanary96fcdcc2015-08-27 07:41:13 -070052 supported at this time. The actual uniform name will be mangled. If outName is not nullptr then
joshualitt47bb3822014-10-07 16:43:25 -070053 it will refer to the final uniform name after return. Use the addUniformArray variant to add
54 an array of uniforms. */
bsalomon422f56f2014-12-09 10:18:12 -080055 UniformHandle addUniform(uint32_t visibility,
56 GrSLType type,
57 GrSLPrecision precision,
58 const char* name,
halcanary96fcdcc2015-08-27 07:41:13 -070059 const char** outName = nullptr) {
bsalomon422f56f2014-12-09 10:18:12 -080060 return this->addUniformArray(visibility, type, precision, name, 0, outName);
61 }
62
63 virtual UniformHandle addUniformArray(
64 uint32_t visibility,
65 GrSLType type,
66 GrSLPrecision precision,
67 const char* name,
68 int arrayCount,
halcanary96fcdcc2015-08-27 07:41:13 -070069 const char** outName = nullptr) = 0;
joshualitt47bb3822014-10-07 16:43:25 -070070
egdaniel0d3f0612015-10-21 10:45:48 -070071 virtual const GrGLSLShaderVar& getUniformVariable(UniformHandle u) const = 0;
joshualitt47bb3822014-10-07 16:43:25 -070072
73 /**
74 * Shortcut for getUniformVariable(u).c_str()
75 */
76 virtual const char* getUniformCStr(UniformHandle u) const = 0;
77
78 virtual const GrGLContextInfo& ctxInfo() const = 0;
79
egdanielf5294392015-10-21 07:14:17 -070080 virtual const GrGLSLCaps* glslCaps() const = 0;
81
bsalomon861e1032014-12-16 07:33:49 -080082 virtual GrGLGpu* gpu() const = 0;
joshualitt47bb3822014-10-07 16:43:25 -070083
84 /*
85 * *NOTE* NO MEMBERS ALLOWED, MULTIPLE INHERITANCE
86 */
87};
88
joshualitt74077b92014-10-24 11:26:03 -070089// TODO move this into GrGLGPBuilder and move them both out of this file
90class GrGLVarying {
91public:
92 bool vsVarying() const { return kVertToFrag_Varying == fVarying ||
93 kVertToGeo_Varying == fVarying; }
94 bool fsVarying() const { return kVertToFrag_Varying == fVarying ||
95 kGeoToFrag_Varying == fVarying; }
96 const char* vsOut() const { return fVsOut; }
97 const char* gsIn() const { return fGsIn; }
98 const char* gsOut() const { return fGsOut; }
99 const char* fsIn() const { return fFsIn; }
joshualittabb52a12015-01-13 15:02:10 -0800100 GrSLType type() const { return fType; }
joshualitt74077b92014-10-24 11:26:03 -0700101
102protected:
103 enum Varying {
104 kVertToFrag_Varying,
105 kVertToGeo_Varying,
106 kGeoToFrag_Varying,
107 };
108
109 GrGLVarying(GrSLType type, Varying varying)
halcanary96fcdcc2015-08-27 07:41:13 -0700110 : fVarying(varying), fType(type), fVsOut(nullptr), fGsIn(nullptr), fGsOut(nullptr),
111 fFsIn(nullptr) {}
joshualitt74077b92014-10-24 11:26:03 -0700112
113 Varying fVarying;
114
115private:
116 GrSLType fType;
117 const char* fVsOut;
118 const char* fGsIn;
119 const char* fGsOut;
120 const char* fFsIn;
121
122 friend class GrGLVertexBuilder;
123 friend class GrGLGeometryBuilder;
egdanielc2304142014-12-11 13:15:13 -0800124 friend class GrGLXferBuilder;
joshualitt74077b92014-10-24 11:26:03 -0700125 friend class GrGLFragmentShaderBuilder;
126};
127
128struct GrGLVertToFrag : public GrGLVarying {
129 GrGLVertToFrag(GrSLType type)
130 : GrGLVarying(type, kVertToFrag_Varying) {}
131};
132
133struct GrGLVertToGeo : public GrGLVarying {
134 GrGLVertToGeo(GrSLType type)
135 : GrGLVarying(type, kVertToGeo_Varying) {}
136};
137
138struct GrGLGeoToFrag : public GrGLVarying {
139 GrGLGeoToFrag(GrSLType type)
140 : GrGLVarying(type, kGeoToFrag_Varying) {}
141};
142
joshualitt47bb3822014-10-07 16:43:25 -0700143/* a specialization of the above for GPs. Lets the user add uniforms, varyings, and VS / FS code */
144class GrGLGPBuilder : public virtual GrGLUniformBuilder {
145public:
joshualitt2dd1ae02014-12-03 06:24:10 -0800146 /*
147 * addVarying allows fine grained control for setting up varyings between stages. If you just
148 * need to take an attribute and pass it through to an output value in a fragment shader, use
149 * addPassThroughAttribute.
150 * TODO convert most uses of addVarying to addPassThroughAttribute
151 */
joshualitt74077b92014-10-24 11:26:03 -0700152 virtual void addVarying(const char* name,
153 GrGLVarying*,
joshualitteb00eab2015-09-15 14:12:22 -0700154 GrSLPrecision precision = kDefault_GrSLPrecision) = 0;
joshualitt47bb3822014-10-07 16:43:25 -0700155
joshualitt2dd1ae02014-12-03 06:24:10 -0800156 /*
157 * This call can be used by GP to pass an attribute through all shaders directly to 'output' in
158 * the fragment shader. Though this call effects both the vertex shader and fragment shader,
159 * it expects 'output' to be defined in the fragment shader before this call is made.
160 * TODO it might be nicer behavior to have a flag to declare output inside this call
161 */
joshualitt71c92602015-01-14 08:12:47 -0800162 virtual void addPassThroughAttribute(const GrGeometryProcessor::Attribute*,
joshualitt2dd1ae02014-12-03 06:24:10 -0800163 const char* output) = 0;
164
kkinnunen7aedda52015-06-29 23:01:28 -0700165 /*
166 * Creates a fragment shader varying that can be referred to.
167 * Comparable to GrGLUniformBuilder::addUniform().
168 */
169 virtual SeparableVaryingHandle addSeparableVarying(
170 const char* name, GrGLVertToFrag*, GrSLPrecision fsPrecision = kDefault_GrSLPrecision) = 0;
171
joshualitt47bb3822014-10-07 16:43:25 -0700172 // TODO rename getFragmentBuilder
egdaniel29bee0f2015-04-29 11:54:42 -0700173 virtual GrGLFragmentBuilder* getFragmentShaderBuilder() = 0;
joshualitt47bb3822014-10-07 16:43:25 -0700174 virtual GrGLVertexBuilder* getVertexShaderBuilder() = 0;
175
176 /*
177 * *NOTE* NO MEMBERS ALLOWED, MULTIPLE INHERITANCE
178 */
179};
180
181/* a specializations for FPs. Lets the user add uniforms and FS code */
182class GrGLFPBuilder : public virtual GrGLUniformBuilder {
183public:
egdaniel29bee0f2015-04-29 11:54:42 -0700184 virtual GrGLFragmentBuilder* getFragmentShaderBuilder() = 0;
joshualitt47bb3822014-10-07 16:43:25 -0700185
186 /*
187 * *NOTE* NO MEMBERS ALLOWED, MULTIPLE INHERITANCE
188 */
189};
190
egdanielc2304142014-12-11 13:15:13 -0800191/* a specializations for XPs. Lets the user add uniforms and FS code */
192class GrGLXPBuilder : public virtual GrGLUniformBuilder {
193public:
egdaniel29bee0f2015-04-29 11:54:42 -0700194 virtual GrGLXPFragmentBuilder* getFragmentShaderBuilder() = 0;
egdanielc2304142014-12-11 13:15:13 -0800195
196 /*
197 * *NOTE* NO MEMBERS ALLOWED, MULTIPLE INHERITANCE
198 */
199};
joshualittabb52a12015-01-13 15:02:10 -0800200
201/**
202 * The below struct represent processors installed in programs.
203 */
204template <class Proc>
205struct GrGLInstalledProc {
cdalton42717652015-06-18 11:54:30 -0700206 SkDEBUGCODE(int fSamplersIdx;)
207 SkAutoTDelete<Proc> fGLProc;
joshualittabb52a12015-01-13 15:02:10 -0800208};
209
210typedef GrGLInstalledProc<GrGLPrimitiveProcessor> GrGLInstalledGeoProc;
211typedef GrGLInstalledProc<GrGLXferProcessor> GrGLInstalledXferProc;
212typedef GrGLInstalledProc<GrGLFragmentProcessor> GrGLInstalledFragProc;
213
214struct GrGLInstalledFragProcs : public SkRefCnt {
215 virtual ~GrGLInstalledFragProcs();
216 SkSTArray<8, GrGLInstalledFragProc*, true> fProcs;
217};
joshualitta5305a12014-10-10 17:47:00 -0700218
joshualitt47bb3822014-10-07 16:43:25 -0700219/*
220 * Please note - no diamond problems because of virtual inheritance. Also, both base classes
221 * are pure virtual with no data members. This is the base class for program building.
222 * Subclasses are nearly identical but each has their own way of emitting transforms. State for
223 * each of the elements of the shader pipeline, ie vertex, fragment, geometry, etc, lives in those
224 * respective builders
225*/
226class GrGLProgramBuilder : public GrGLGPBuilder,
egdanielc2304142014-12-11 13:15:13 -0800227 public GrGLFPBuilder,
228 public GrGLXPBuilder {
joshualitt47bb3822014-10-07 16:43:25 -0700229public:
joshualitt873ad0e2015-01-20 09:08:51 -0800230 typedef GrGpu::DrawArgs DrawArgs;
joshualitt47bb3822014-10-07 16:43:25 -0700231 /** Generates a shader program.
232 *
233 * The program implements what is specified in the stages given as input.
234 * After successful generation, the builder result objects are available
235 * to be used.
236 * @return true if generation was successful.
237 */
joshualitt873ad0e2015-01-20 09:08:51 -0800238 static GrGLProgram* CreateProgram(const DrawArgs&, GrGLGpu*);
joshualitt47bb3822014-10-07 16:43:25 -0700239
bsalomon422f56f2014-12-09 10:18:12 -0800240 UniformHandle addUniformArray(uint32_t visibility,
241 GrSLType type,
242 GrSLPrecision precision,
243 const char* name,
244 int arrayCount,
mtklein36352bf2015-03-25 18:17:31 -0700245 const char** outName) override;
joshualitt47bb3822014-10-07 16:43:25 -0700246
egdaniel0d3f0612015-10-21 10:45:48 -0700247 const GrGLSLShaderVar& getUniformVariable(UniformHandle u) const override {
joshualitte7afc2d2015-09-11 10:44:13 -0700248 return fUniforms[u.toIndex()].fVariable;
joshualitt47bb3822014-10-07 16:43:25 -0700249 }
250
mtklein36352bf2015-03-25 18:17:31 -0700251 const char* getUniformCStr(UniformHandle u) const override {
joshualitt47bb3822014-10-07 16:43:25 -0700252 return this->getUniformVariable(u).c_str();
253 }
254
mtklein36352bf2015-03-25 18:17:31 -0700255 const GrGLContextInfo& ctxInfo() const override;
joshualitt47bb3822014-10-07 16:43:25 -0700256
egdanielf5294392015-10-21 07:14:17 -0700257 const GrGLSLCaps* glslCaps() const override;
258
mtklein36352bf2015-03-25 18:17:31 -0700259 GrGLGpu* gpu() const override { return fGpu; }
joshualitt47bb3822014-10-07 16:43:25 -0700260
egdaniel29bee0f2015-04-29 11:54:42 -0700261 GrGLXPFragmentBuilder* getFragmentShaderBuilder() override { return &fFS; }
mtklein36352bf2015-03-25 18:17:31 -0700262 GrGLVertexBuilder* getVertexShaderBuilder() override { return &fVS; }
joshualitt47bb3822014-10-07 16:43:25 -0700263
bsalomon422f56f2014-12-09 10:18:12 -0800264 void addVarying(
joshualitta5305a12014-10-10 17:47:00 -0700265 const char* name,
joshualitt74077b92014-10-24 11:26:03 -0700266 GrGLVarying*,
joshualitteb00eab2015-09-15 14:12:22 -0700267 GrSLPrecision precision = kDefault_GrSLPrecision) override;
joshualitt30ba4362014-08-21 20:18:45 -0700268
joshualitt71c92602015-01-14 08:12:47 -0800269 void addPassThroughAttribute(const GrPrimitiveProcessor::Attribute*,
mtklein36352bf2015-03-25 18:17:31 -0700270 const char* output) override;
joshualitt2dd1ae02014-12-03 06:24:10 -0800271
kkinnunen7aedda52015-06-29 23:01:28 -0700272 SeparableVaryingHandle addSeparableVarying(
273 const char* name,
274 GrGLVertToFrag*,
275 GrSLPrecision fsPrecision = kDefault_GrSLPrecision) override;
joshualitt2dd1ae02014-12-03 06:24:10 -0800276
joshualitt30ba4362014-08-21 20:18:45 -0700277 // Handles for program uniforms (other than per-effect uniforms)
278 struct BuiltinUniformHandles {
joshualitt30ba4362014-08-21 20:18:45 -0700279 UniformHandle fRTAdjustmentUni;
joshualitt30ba4362014-08-21 20:18:45 -0700280
281 // We use the render target height to provide a y-down frag coord when specifying
282 // origin_upper_left is not supported.
283 UniformHandle fRTHeightUni;
joshualitt30ba4362014-08-21 20:18:45 -0700284 };
285
joshualittdb0d3ca2014-10-07 12:42:26 -0700286protected:
joshualitta5305a12014-10-10 17:47:00 -0700287 typedef GrGLProgramDataManager::UniformInfo UniformInfo;
288 typedef GrGLProgramDataManager::UniformInfoArray UniformInfoArray;
joshualittd8dd47b2015-09-11 11:45:01 -0700289 typedef GrGLProgramDataManager::SeparableVaryingInfo SeparableVaryingInfo;
290 typedef GrGLProgramDataManager::SeparableVaryingInfoArray SeparableVaryingInfoArray;
joshualitt47bb3822014-10-07 16:43:25 -0700291
joshualitt873ad0e2015-01-20 09:08:51 -0800292 GrGLProgramBuilder(GrGLGpu*, const DrawArgs&);
joshualitt30ba4362014-08-21 20:18:45 -0700293
joshualitt873ad0e2015-01-20 09:08:51 -0800294 const GrPrimitiveProcessor& primitiveProcessor() const { return *fArgs.fPrimitiveProcessor; }
egdaniel8dd688b2015-01-22 10:16:09 -0800295 const GrPipeline& pipeline() const { return *fArgs.fPipeline; }
joshualitt873ad0e2015-01-20 09:08:51 -0800296 const GrProgramDesc& desc() const { return *fArgs.fDesc; }
joshualitt873ad0e2015-01-20 09:08:51 -0800297 const GrProgramDesc::KeyHeader& header() const { return fArgs.fDesc->header(); }
joshualitt23e280d2014-09-18 12:26:38 -0700298
joshualitt30ba4362014-08-21 20:18:45 -0700299 // Generates a name for a variable. The generated string will be name prefixed by the prefix
300 // char (unless the prefix is '\0'). It also mangles the name to be stage-specific if we're
301 // generating stage code.
302 void nameVariable(SkString* out, char prefix, const char* name);
joshualitt2dd1ae02014-12-03 06:24:10 -0800303 // Generates a possibly mangled name for a stage variable and writes it to the fragment shader.
304 // If GrGLSLExpr4 has a valid name then it will use that instead
305 void nameExpression(GrGLSLExpr4*, const char* baseName);
joshualitt6c891102015-05-13 08:51:49 -0700306 bool emitAndInstallProcs(GrGLSLExpr4* inputColor, GrGLSLExpr4* inputCoverage);
joshualitta5305a12014-10-10 17:47:00 -0700307 void emitAndInstallFragProcs(int procOffset, int numProcs, GrGLSLExpr4* inOut);
bsalomonac856c92015-08-27 06:30:17 -0700308 void emitAndInstallProc(const GrFragmentProcessor&,
joshualitta5305a12014-10-10 17:47:00 -0700309 int index,
joshualitta5305a12014-10-10 17:47:00 -0700310 const GrGLSLExpr4& input,
311 GrGLSLExpr4* output);
312
joshualitt9b989322014-12-15 14:16:27 -0800313 void emitAndInstallProc(const GrPrimitiveProcessor&,
joshualitt2dd1ae02014-12-03 06:24:10 -0800314 GrGLSLExpr4* outputColor,
315 GrGLSLExpr4* outputCoverage);
316
joshualitta5305a12014-10-10 17:47:00 -0700317 // these emit functions help to keep the createAndEmitProcessors template general
bsalomonac856c92015-08-27 06:30:17 -0700318 void emitAndInstallProc(const GrFragmentProcessor&,
joshualittabb52a12015-01-13 15:02:10 -0800319 int index,
joshualitta5305a12014-10-10 17:47:00 -0700320 const char* outColor,
321 const char* inColor);
joshualitt9b989322014-12-15 14:16:27 -0800322 void emitAndInstallProc(const GrPrimitiveProcessor&,
joshualitt2dd1ae02014-12-03 06:24:10 -0800323 const char* outColor,
324 const char* outCoverage);
egdanielc2304142014-12-11 13:15:13 -0800325 void emitAndInstallXferProc(const GrXferProcessor&,
326 const GrGLSLExpr4& colorIn,
327 const GrGLSLExpr4& coverageIn);
joshualitt2dd1ae02014-12-03 06:24:10 -0800328
joshualitt9b989322014-12-15 14:16:27 -0800329 void verify(const GrPrimitiveProcessor&);
egdanielc2304142014-12-11 13:15:13 -0800330 void verify(const GrXferProcessor&);
joshualitt47bb3822014-10-07 16:43:25 -0700331 void verify(const GrFragmentProcessor&);
joshualittabb52a12015-01-13 15:02:10 -0800332 template <class Proc>
joshualitt47bb3822014-10-07 16:43:25 -0700333 void emitSamplers(const GrProcessor&,
egdaniel7dc4bd02015-10-29 07:57:01 -0700334 GrGLSLTextureSampler::TextureSamplerArray* outSamplers,
joshualittabb52a12015-01-13 15:02:10 -0800335 GrGLInstalledProc<Proc>*);
joshualitt30ba4362014-08-21 20:18:45 -0700336
joshualitt47bb3822014-10-07 16:43:25 -0700337 GrGLProgram* finalize();
kkinnunen6bb6d402015-07-14 10:59:23 -0700338 virtual void bindProgramResourceLocations(GrGLuint programID);
joshualitt47bb3822014-10-07 16:43:25 -0700339 bool checkLinkStatus(GrGLuint programID);
kkinnunen7aedda52015-06-29 23:01:28 -0700340 virtual void resolveProgramResourceLocations(GrGLuint programID);
joshualitt47bb3822014-10-07 16:43:25 -0700341 void cleanupProgram(GrGLuint programID, const SkTDArray<GrGLuint>& shaderIDs);
342 void cleanupShaders(const SkTDArray<GrGLuint>& shaderIDs);
joshualitt30ba4362014-08-21 20:18:45 -0700343
joshualitt47bb3822014-10-07 16:43:25 -0700344 // Subclasses create different programs
345 virtual GrGLProgram* createProgram(GrGLuint programID);
346
joshualitt30ba4362014-08-21 20:18:45 -0700347 void appendUniformDecls(ShaderVisibility, SkString*) const;
348
joshualitt47bb3822014-10-07 16:43:25 -0700349 // reset is called by program creator between each processor's emit code. It increments the
350 // stage offset for variable name mangling, and also ensures verfication variables in the
351 // fragment shader are cleared.
352 void reset() {
353 this->enterStage();
354 this->addStage();
355 fFS.reset();
356 }
357 void addStage() { fStageIndex++; }
358
359 // This simple class exits the stage and then restores the stage when it goes out of scope
360 class AutoStageRestore {
joshualitt30ba4362014-08-21 20:18:45 -0700361 public:
joshualitt47bb3822014-10-07 16:43:25 -0700362 AutoStageRestore(GrGLProgramBuilder* pb)
363 : fPB(pb), fOutOfStage(pb->fOutOfStage) { pb->exitStage(); }
364 ~AutoStageRestore() { fPB->fOutOfStage = fOutOfStage; }
joshualittb0a8a372014-09-23 09:50:21 -0700365 private:
joshualitt47bb3822014-10-07 16:43:25 -0700366 GrGLProgramBuilder* fPB;
367 bool fOutOfStage;
joshualittb0a8a372014-09-23 09:50:21 -0700368 };
joshualitt47bb3822014-10-07 16:43:25 -0700369 class AutoStageAdvance {
joshualittdb0d3ca2014-10-07 12:42:26 -0700370 public:
joshualitt43466a12015-02-13 17:18:27 -0800371 AutoStageAdvance(GrGLProgramBuilder* pb)
372 : fPB(pb) {
373 fPB->reset();
374 // Each output to the fragment processor gets its own code section
375 fPB->fFS.nextStage();
376 }
joshualitt47bb3822014-10-07 16:43:25 -0700377 ~AutoStageAdvance() { fPB->exitStage(); }
joshualittdb0d3ca2014-10-07 12:42:26 -0700378 private:
joshualitt47bb3822014-10-07 16:43:25 -0700379 GrGLProgramBuilder* fPB;
380 };
381 void exitStage() { fOutOfStage = true; }
382 void enterStage() { fOutOfStage = false; }
383 int stageIndex() const { return fStageIndex; }
384
joshualitt4973d9d2014-11-08 09:24:25 -0800385 const char* rtAdjustment() const { return "rtAdjustment"; }
386
joshualitt47bb3822014-10-07 16:43:25 -0700387 // number of each input/output type in a single allocation block, used by many builders
388 static const int kVarsPerBlock;
389
390 BuiltinUniformHandles fUniformHandles;
391 GrGLVertexBuilder fVS;
392 GrGLGeometryBuilder fGS;
393 GrGLFragmentShaderBuilder fFS;
394 bool fOutOfStage;
395 int fStageIndex;
396
joshualitta5305a12014-10-10 17:47:00 -0700397 GrGLInstalledGeoProc* fGeometryProcessor;
egdanielc2304142014-12-11 13:15:13 -0800398 GrGLInstalledXferProc* fXferProcessor;
joshualitta5305a12014-10-10 17:47:00 -0700399 SkAutoTUnref<GrGLInstalledFragProcs> fFragmentProcessors;
joshualitt47bb3822014-10-07 16:43:25 -0700400
joshualitt873ad0e2015-01-20 09:08:51 -0800401 const DrawArgs& fArgs;
bsalomon861e1032014-12-16 07:33:49 -0800402 GrGLGpu* fGpu;
joshualitt47bb3822014-10-07 16:43:25 -0700403 UniformInfoArray fUniforms;
joshualittabb52a12015-01-13 15:02:10 -0800404 GrGLPrimitiveProcessor::TransformsIn fCoordTransforms;
405 GrGLPrimitiveProcessor::TransformsOut fOutCoords;
cdalton42717652015-06-18 11:54:30 -0700406 SkTArray<UniformHandle> fSamplerUniforms;
joshualittd8dd47b2015-09-11 11:45:01 -0700407 SeparableVaryingInfoArray fSeparableVaryingInfos;
joshualitt47bb3822014-10-07 16:43:25 -0700408
409 friend class GrGLShaderBuilder;
410 friend class GrGLVertexBuilder;
411 friend class GrGLFragmentShaderBuilder;
412 friend class GrGLGeometryBuilder;
413};
joshualitt30ba4362014-08-21 20:18:45 -0700414#endif