blob: 06d0fa074496adf63f70f7dbea7c58f4e23fc73e [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"
joshualitt47bb3822014-10-07 16:43:25 -070014#include "../GrGLProgramDataManager.h"
kkinnunen7aedda52015-06-29 23:01:28 -070015#include "../GrGLPathProgramDataManager.h"
joshualitt47bb3822014-10-07 16:43:25 -070016#include "../GrGLUniformHandle.h"
joshualitt8072caa2015-02-12 14:20:52 -080017#include "../GrGLPrimitiveProcessor.h"
egdanielc2304142014-12-11 13:15:13 -080018#include "../GrGLXferProcessor.h"
egdaniel8dd688b2015-01-22 10:16:09 -080019#include "../../GrPipeline.h"
joshualitt89c7a2e2014-10-10 14:11:59 -070020
bsalomonac856c92015-08-27 06:30:17 -070021class GrFragmentProcessor;
22
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
joshualitt30ba4362014-08-21 20:18:45 -070046 typedef GrGLProgramDataManager::UniformHandle UniformHandle;
kkinnunen7aedda52015-06-29 23:01:28 -070047 typedef GrGLPathProgramDataManager::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
52 supported at this time. The actual uniform name will be mangled. If outName is not NULL then
53 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,
59 const char** outName = NULL) {
60 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,
69 const char** outName = NULL) = 0;
joshualitt47bb3822014-10-07 16:43:25 -070070
71 virtual const GrGLShaderVar& getUniformVariable(UniformHandle u) const = 0;
72
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
bsalomon861e1032014-12-16 07:33:49 -080080 virtual GrGLGpu* gpu() const = 0;
joshualitt47bb3822014-10-07 16:43:25 -070081
82 /*
83 * *NOTE* NO MEMBERS ALLOWED, MULTIPLE INHERITANCE
84 */
85};
86
joshualitt74077b92014-10-24 11:26:03 -070087// TODO move this into GrGLGPBuilder and move them both out of this file
88class GrGLVarying {
89public:
90 bool vsVarying() const { return kVertToFrag_Varying == fVarying ||
91 kVertToGeo_Varying == fVarying; }
92 bool fsVarying() const { return kVertToFrag_Varying == fVarying ||
93 kGeoToFrag_Varying == fVarying; }
94 const char* vsOut() const { return fVsOut; }
95 const char* gsIn() const { return fGsIn; }
96 const char* gsOut() const { return fGsOut; }
97 const char* fsIn() const { return fFsIn; }
joshualittabb52a12015-01-13 15:02:10 -080098 GrSLType type() const { return fType; }
joshualitt74077b92014-10-24 11:26:03 -070099
100protected:
101 enum Varying {
102 kVertToFrag_Varying,
103 kVertToGeo_Varying,
104 kGeoToFrag_Varying,
105 };
106
107 GrGLVarying(GrSLType type, Varying varying)
108 : fVarying(varying), fType(type), fVsOut(NULL), fGsIn(NULL), fGsOut(NULL),
109 fFsIn(NULL) {}
110
111 Varying fVarying;
112
113private:
114 GrSLType fType;
115 const char* fVsOut;
116 const char* fGsIn;
117 const char* fGsOut;
118 const char* fFsIn;
119
120 friend class GrGLVertexBuilder;
121 friend class GrGLGeometryBuilder;
egdanielc2304142014-12-11 13:15:13 -0800122 friend class GrGLXferBuilder;
joshualitt74077b92014-10-24 11:26:03 -0700123 friend class GrGLFragmentShaderBuilder;
124};
125
126struct GrGLVertToFrag : public GrGLVarying {
127 GrGLVertToFrag(GrSLType type)
128 : GrGLVarying(type, kVertToFrag_Varying) {}
129};
130
131struct GrGLVertToGeo : public GrGLVarying {
132 GrGLVertToGeo(GrSLType type)
133 : GrGLVarying(type, kVertToGeo_Varying) {}
134};
135
136struct GrGLGeoToFrag : public GrGLVarying {
137 GrGLGeoToFrag(GrSLType type)
138 : GrGLVarying(type, kGeoToFrag_Varying) {}
139};
140
joshualitt47bb3822014-10-07 16:43:25 -0700141/* a specialization of the above for GPs. Lets the user add uniforms, varyings, and VS / FS code */
142class GrGLGPBuilder : public virtual GrGLUniformBuilder {
143public:
joshualitt2dd1ae02014-12-03 06:24:10 -0800144 /*
145 * addVarying allows fine grained control for setting up varyings between stages. If you just
146 * need to take an attribute and pass it through to an output value in a fragment shader, use
147 * addPassThroughAttribute.
148 * TODO convert most uses of addVarying to addPassThroughAttribute
149 */
joshualitt74077b92014-10-24 11:26:03 -0700150 virtual void addVarying(const char* name,
151 GrGLVarying*,
bsalomonc0bd6482014-12-09 10:04:14 -0800152 GrSLPrecision fsPrecision = kDefault_GrSLPrecision) = 0;
joshualitt47bb3822014-10-07 16:43:25 -0700153
joshualitt2dd1ae02014-12-03 06:24:10 -0800154 /*
155 * This call can be used by GP to pass an attribute through all shaders directly to 'output' in
156 * the fragment shader. Though this call effects both the vertex shader and fragment shader,
157 * it expects 'output' to be defined in the fragment shader before this call is made.
158 * TODO it might be nicer behavior to have a flag to declare output inside this call
159 */
joshualitt71c92602015-01-14 08:12:47 -0800160 virtual void addPassThroughAttribute(const GrGeometryProcessor::Attribute*,
joshualitt2dd1ae02014-12-03 06:24:10 -0800161 const char* output) = 0;
162
kkinnunen7aedda52015-06-29 23:01:28 -0700163 /*
164 * Creates a fragment shader varying that can be referred to.
165 * Comparable to GrGLUniformBuilder::addUniform().
166 */
167 virtual SeparableVaryingHandle addSeparableVarying(
168 const char* name, GrGLVertToFrag*, GrSLPrecision fsPrecision = kDefault_GrSLPrecision) = 0;
169
joshualitt47bb3822014-10-07 16:43:25 -0700170 // TODO rename getFragmentBuilder
egdaniel29bee0f2015-04-29 11:54:42 -0700171 virtual GrGLFragmentBuilder* getFragmentShaderBuilder() = 0;
joshualitt47bb3822014-10-07 16:43:25 -0700172 virtual GrGLVertexBuilder* getVertexShaderBuilder() = 0;
173
174 /*
175 * *NOTE* NO MEMBERS ALLOWED, MULTIPLE INHERITANCE
176 */
177};
178
179/* a specializations for FPs. Lets the user add uniforms and FS code */
180class GrGLFPBuilder : public virtual GrGLUniformBuilder {
181public:
egdaniel29bee0f2015-04-29 11:54:42 -0700182 virtual GrGLFragmentBuilder* getFragmentShaderBuilder() = 0;
joshualitt47bb3822014-10-07 16:43:25 -0700183
184 /*
185 * *NOTE* NO MEMBERS ALLOWED, MULTIPLE INHERITANCE
186 */
187};
188
egdanielc2304142014-12-11 13:15:13 -0800189/* a specializations for XPs. Lets the user add uniforms and FS code */
190class GrGLXPBuilder : public virtual GrGLUniformBuilder {
191public:
egdaniel29bee0f2015-04-29 11:54:42 -0700192 virtual GrGLXPFragmentBuilder* getFragmentShaderBuilder() = 0;
egdanielc2304142014-12-11 13:15:13 -0800193
194 /*
195 * *NOTE* NO MEMBERS ALLOWED, MULTIPLE INHERITANCE
196 */
197};
joshualittabb52a12015-01-13 15:02:10 -0800198
199/**
200 * The below struct represent processors installed in programs.
201 */
202template <class Proc>
203struct GrGLInstalledProc {
cdalton42717652015-06-18 11:54:30 -0700204 SkDEBUGCODE(int fSamplersIdx;)
205 SkAutoTDelete<Proc> fGLProc;
joshualittabb52a12015-01-13 15:02:10 -0800206};
207
208typedef GrGLInstalledProc<GrGLPrimitiveProcessor> GrGLInstalledGeoProc;
209typedef GrGLInstalledProc<GrGLXferProcessor> GrGLInstalledXferProc;
210typedef GrGLInstalledProc<GrGLFragmentProcessor> GrGLInstalledFragProc;
211
212struct GrGLInstalledFragProcs : public SkRefCnt {
213 virtual ~GrGLInstalledFragProcs();
214 SkSTArray<8, GrGLInstalledFragProc*, true> fProcs;
215};
joshualitta5305a12014-10-10 17:47:00 -0700216
joshualitt47bb3822014-10-07 16:43:25 -0700217/*
218 * Please note - no diamond problems because of virtual inheritance. Also, both base classes
219 * are pure virtual with no data members. This is the base class for program building.
220 * Subclasses are nearly identical but each has their own way of emitting transforms. State for
221 * each of the elements of the shader pipeline, ie vertex, fragment, geometry, etc, lives in those
222 * respective builders
223*/
224class GrGLProgramBuilder : public GrGLGPBuilder,
egdanielc2304142014-12-11 13:15:13 -0800225 public GrGLFPBuilder,
226 public GrGLXPBuilder {
joshualitt47bb3822014-10-07 16:43:25 -0700227public:
joshualitt873ad0e2015-01-20 09:08:51 -0800228 typedef GrGpu::DrawArgs DrawArgs;
joshualitt47bb3822014-10-07 16:43:25 -0700229 /** Generates a shader program.
230 *
231 * The program implements what is specified in the stages given as input.
232 * After successful generation, the builder result objects are available
233 * to be used.
234 * @return true if generation was successful.
235 */
joshualitt873ad0e2015-01-20 09:08:51 -0800236 static GrGLProgram* CreateProgram(const DrawArgs&, GrGLGpu*);
joshualitt47bb3822014-10-07 16:43:25 -0700237
bsalomon422f56f2014-12-09 10:18:12 -0800238 UniformHandle addUniformArray(uint32_t visibility,
239 GrSLType type,
240 GrSLPrecision precision,
241 const char* name,
242 int arrayCount,
mtklein36352bf2015-03-25 18:17:31 -0700243 const char** outName) override;
joshualitt47bb3822014-10-07 16:43:25 -0700244
mtklein36352bf2015-03-25 18:17:31 -0700245 const GrGLShaderVar& getUniformVariable(UniformHandle u) const override {
joshualitt47bb3822014-10-07 16:43:25 -0700246 return fUniforms[u.toShaderBuilderIndex()].fVariable;
247 }
248
mtklein36352bf2015-03-25 18:17:31 -0700249 const char* getUniformCStr(UniformHandle u) const override {
joshualitt47bb3822014-10-07 16:43:25 -0700250 return this->getUniformVariable(u).c_str();
251 }
252
mtklein36352bf2015-03-25 18:17:31 -0700253 const GrGLContextInfo& ctxInfo() const override;
joshualitt47bb3822014-10-07 16:43:25 -0700254
mtklein36352bf2015-03-25 18:17:31 -0700255 GrGLGpu* gpu() const override { return fGpu; }
joshualitt47bb3822014-10-07 16:43:25 -0700256
egdaniel29bee0f2015-04-29 11:54:42 -0700257 GrGLXPFragmentBuilder* getFragmentShaderBuilder() override { return &fFS; }
mtklein36352bf2015-03-25 18:17:31 -0700258 GrGLVertexBuilder* getVertexShaderBuilder() override { return &fVS; }
joshualitt47bb3822014-10-07 16:43:25 -0700259
bsalomon422f56f2014-12-09 10:18:12 -0800260 void addVarying(
joshualitta5305a12014-10-10 17:47:00 -0700261 const char* name,
joshualitt74077b92014-10-24 11:26:03 -0700262 GrGLVarying*,
mtklein36352bf2015-03-25 18:17:31 -0700263 GrSLPrecision fsPrecision = kDefault_GrSLPrecision) override;
joshualitt30ba4362014-08-21 20:18:45 -0700264
joshualitt71c92602015-01-14 08:12:47 -0800265 void addPassThroughAttribute(const GrPrimitiveProcessor::Attribute*,
mtklein36352bf2015-03-25 18:17:31 -0700266 const char* output) override;
joshualitt2dd1ae02014-12-03 06:24:10 -0800267
kkinnunen7aedda52015-06-29 23:01:28 -0700268 SeparableVaryingHandle addSeparableVarying(
269 const char* name,
270 GrGLVertToFrag*,
271 GrSLPrecision fsPrecision = kDefault_GrSLPrecision) override;
joshualitt2dd1ae02014-12-03 06:24:10 -0800272
joshualitt30ba4362014-08-21 20:18:45 -0700273 // Handles for program uniforms (other than per-effect uniforms)
274 struct BuiltinUniformHandles {
joshualitt30ba4362014-08-21 20:18:45 -0700275 UniformHandle fRTAdjustmentUni;
joshualitt30ba4362014-08-21 20:18:45 -0700276
277 // We use the render target height to provide a y-down frag coord when specifying
278 // origin_upper_left is not supported.
279 UniformHandle fRTHeightUni;
joshualitt30ba4362014-08-21 20:18:45 -0700280 };
281
joshualittdb0d3ca2014-10-07 12:42:26 -0700282protected:
joshualitta5305a12014-10-10 17:47:00 -0700283 typedef GrGLProgramDataManager::UniformInfo UniformInfo;
284 typedef GrGLProgramDataManager::UniformInfoArray UniformInfoArray;
285
joshualitt873ad0e2015-01-20 09:08:51 -0800286 static GrGLProgramBuilder* CreateProgramBuilder(const DrawArgs&, GrGLGpu*);
joshualitt47bb3822014-10-07 16:43:25 -0700287
joshualitt873ad0e2015-01-20 09:08:51 -0800288 GrGLProgramBuilder(GrGLGpu*, const DrawArgs&);
joshualitt30ba4362014-08-21 20:18:45 -0700289
joshualitt873ad0e2015-01-20 09:08:51 -0800290 const GrPrimitiveProcessor& primitiveProcessor() const { return *fArgs.fPrimitiveProcessor; }
egdaniel8dd688b2015-01-22 10:16:09 -0800291 const GrPipeline& pipeline() const { return *fArgs.fPipeline; }
joshualitt873ad0e2015-01-20 09:08:51 -0800292 const GrProgramDesc& desc() const { return *fArgs.fDesc; }
293 const GrBatchTracker& batchTracker() const { return *fArgs.fBatchTracker; }
294 const GrProgramDesc::KeyHeader& header() const { return fArgs.fDesc->header(); }
joshualitt23e280d2014-09-18 12:26:38 -0700295
joshualitt30ba4362014-08-21 20:18:45 -0700296 // Generates a name for a variable. The generated string will be name prefixed by the prefix
297 // char (unless the prefix is '\0'). It also mangles the name to be stage-specific if we're
298 // generating stage code.
299 void nameVariable(SkString* out, char prefix, const char* name);
joshualitt2dd1ae02014-12-03 06:24:10 -0800300 // Generates a possibly mangled name for a stage variable and writes it to the fragment shader.
301 // If GrGLSLExpr4 has a valid name then it will use that instead
302 void nameExpression(GrGLSLExpr4*, const char* baseName);
joshualitt6c891102015-05-13 08:51:49 -0700303 bool emitAndInstallProcs(GrGLSLExpr4* inputColor, GrGLSLExpr4* inputCoverage);
joshualitta5305a12014-10-10 17:47:00 -0700304 void emitAndInstallFragProcs(int procOffset, int numProcs, GrGLSLExpr4* inOut);
bsalomonac856c92015-08-27 06:30:17 -0700305 void emitAndInstallProc(const GrFragmentProcessor&,
joshualitta5305a12014-10-10 17:47:00 -0700306 int index,
joshualitta5305a12014-10-10 17:47:00 -0700307 const GrGLSLExpr4& input,
308 GrGLSLExpr4* output);
309
joshualitt9b989322014-12-15 14:16:27 -0800310 void emitAndInstallProc(const GrPrimitiveProcessor&,
joshualitt2dd1ae02014-12-03 06:24:10 -0800311 GrGLSLExpr4* outputColor,
312 GrGLSLExpr4* outputCoverage);
313
joshualitta5305a12014-10-10 17:47:00 -0700314 // these emit functions help to keep the createAndEmitProcessors template general
bsalomonac856c92015-08-27 06:30:17 -0700315 void emitAndInstallProc(const GrFragmentProcessor&,
joshualittabb52a12015-01-13 15:02:10 -0800316 int index,
joshualitta5305a12014-10-10 17:47:00 -0700317 const char* outColor,
318 const char* inColor);
joshualitt9b989322014-12-15 14:16:27 -0800319 void emitAndInstallProc(const GrPrimitiveProcessor&,
joshualitt2dd1ae02014-12-03 06:24:10 -0800320 const char* outColor,
321 const char* outCoverage);
egdanielc2304142014-12-11 13:15:13 -0800322 void emitAndInstallXferProc(const GrXferProcessor&,
323 const GrGLSLExpr4& colorIn,
324 const GrGLSLExpr4& coverageIn);
joshualitt2dd1ae02014-12-03 06:24:10 -0800325
joshualitt9b989322014-12-15 14:16:27 -0800326 void verify(const GrPrimitiveProcessor&);
egdanielc2304142014-12-11 13:15:13 -0800327 void verify(const GrXferProcessor&);
joshualitt47bb3822014-10-07 16:43:25 -0700328 void verify(const GrFragmentProcessor&);
joshualittabb52a12015-01-13 15:02:10 -0800329 template <class Proc>
joshualitt47bb3822014-10-07 16:43:25 -0700330 void emitSamplers(const GrProcessor&,
331 GrGLProcessor::TextureSamplerArray* outSamplers,
joshualittabb52a12015-01-13 15:02:10 -0800332 GrGLInstalledProc<Proc>*);
joshualitt30ba4362014-08-21 20:18:45 -0700333
joshualitt47bb3822014-10-07 16:43:25 -0700334 GrGLProgram* finalize();
kkinnunen6bb6d402015-07-14 10:59:23 -0700335 virtual void bindProgramResourceLocations(GrGLuint programID);
joshualitt47bb3822014-10-07 16:43:25 -0700336 bool checkLinkStatus(GrGLuint programID);
kkinnunen7aedda52015-06-29 23:01:28 -0700337 virtual void resolveProgramResourceLocations(GrGLuint programID);
joshualitt47bb3822014-10-07 16:43:25 -0700338 void cleanupProgram(GrGLuint programID, const SkTDArray<GrGLuint>& shaderIDs);
339 void cleanupShaders(const SkTDArray<GrGLuint>& shaderIDs);
joshualitt30ba4362014-08-21 20:18:45 -0700340
joshualitt47bb3822014-10-07 16:43:25 -0700341 // Subclasses create different programs
342 virtual GrGLProgram* createProgram(GrGLuint programID);
343
joshualitt30ba4362014-08-21 20:18:45 -0700344 void appendUniformDecls(ShaderVisibility, SkString*) const;
345
joshualitt47bb3822014-10-07 16:43:25 -0700346 // reset is called by program creator between each processor's emit code. It increments the
347 // stage offset for variable name mangling, and also ensures verfication variables in the
348 // fragment shader are cleared.
349 void reset() {
350 this->enterStage();
351 this->addStage();
352 fFS.reset();
353 }
354 void addStage() { fStageIndex++; }
355
356 // This simple class exits the stage and then restores the stage when it goes out of scope
357 class AutoStageRestore {
joshualitt30ba4362014-08-21 20:18:45 -0700358 public:
joshualitt47bb3822014-10-07 16:43:25 -0700359 AutoStageRestore(GrGLProgramBuilder* pb)
360 : fPB(pb), fOutOfStage(pb->fOutOfStage) { pb->exitStage(); }
361 ~AutoStageRestore() { fPB->fOutOfStage = fOutOfStage; }
joshualittb0a8a372014-09-23 09:50:21 -0700362 private:
joshualitt47bb3822014-10-07 16:43:25 -0700363 GrGLProgramBuilder* fPB;
364 bool fOutOfStage;
joshualittb0a8a372014-09-23 09:50:21 -0700365 };
joshualitt47bb3822014-10-07 16:43:25 -0700366 class AutoStageAdvance {
joshualittdb0d3ca2014-10-07 12:42:26 -0700367 public:
joshualitt43466a12015-02-13 17:18:27 -0800368 AutoStageAdvance(GrGLProgramBuilder* pb)
369 : fPB(pb) {
370 fPB->reset();
371 // Each output to the fragment processor gets its own code section
372 fPB->fFS.nextStage();
373 }
joshualitt47bb3822014-10-07 16:43:25 -0700374 ~AutoStageAdvance() { fPB->exitStage(); }
joshualittdb0d3ca2014-10-07 12:42:26 -0700375 private:
joshualitt47bb3822014-10-07 16:43:25 -0700376 GrGLProgramBuilder* fPB;
377 };
378 void exitStage() { fOutOfStage = true; }
379 void enterStage() { fOutOfStage = false; }
380 int stageIndex() const { return fStageIndex; }
381
joshualitt4973d9d2014-11-08 09:24:25 -0800382 const char* rtAdjustment() const { return "rtAdjustment"; }
383
joshualitt47bb3822014-10-07 16:43:25 -0700384 // number of each input/output type in a single allocation block, used by many builders
385 static const int kVarsPerBlock;
386
387 BuiltinUniformHandles fUniformHandles;
388 GrGLVertexBuilder fVS;
389 GrGLGeometryBuilder fGS;
390 GrGLFragmentShaderBuilder fFS;
391 bool fOutOfStage;
392 int fStageIndex;
393
joshualitta5305a12014-10-10 17:47:00 -0700394 GrGLInstalledGeoProc* fGeometryProcessor;
egdanielc2304142014-12-11 13:15:13 -0800395 GrGLInstalledXferProc* fXferProcessor;
joshualitta5305a12014-10-10 17:47:00 -0700396 SkAutoTUnref<GrGLInstalledFragProcs> fFragmentProcessors;
joshualitt47bb3822014-10-07 16:43:25 -0700397
joshualitt873ad0e2015-01-20 09:08:51 -0800398 const DrawArgs& fArgs;
bsalomon861e1032014-12-16 07:33:49 -0800399 GrGLGpu* fGpu;
joshualitt47bb3822014-10-07 16:43:25 -0700400 UniformInfoArray fUniforms;
joshualittabb52a12015-01-13 15:02:10 -0800401 GrGLPrimitiveProcessor::TransformsIn fCoordTransforms;
402 GrGLPrimitiveProcessor::TransformsOut fOutCoords;
cdalton42717652015-06-18 11:54:30 -0700403 SkTArray<UniformHandle> fSamplerUniforms;
joshualitt47bb3822014-10-07 16:43:25 -0700404
405 friend class GrGLShaderBuilder;
406 friend class GrGLVertexBuilder;
407 friend class GrGLFragmentShaderBuilder;
408 friend class GrGLGeometryBuilder;
409};
joshualitt30ba4362014-08-21 20:18:45 -0700410#endif