blob: bdd96d212e768dd8fdd48dd4f4b9ab0596b6815e [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"
joshualitt69684282015-07-13 13:29:13 -070019#include "../../GrPendingFragmentStage.h"
egdaniel8dd688b2015-01-22 10:16:09 -080020#include "../../GrPipeline.h"
joshualitt89c7a2e2014-10-10 14:11:59 -070021
joshualitt7375d6b2015-08-07 13:36:44 -070022// Enough precision to represent 1 / 2048 accurately in printf
23#define GR_SIGNIFICANT_POW2_DECIMAL_DIG 11
24
joshualitt47bb3822014-10-07 16:43:25 -070025/*
26 * This is the base class for a series of interfaces. This base class *MUST* remain abstract with
27 * NO data members because it is used in multiple interface inheritance.
28 * Heirarchy:
29 * GrGLUniformBuilder
30 * / \
31 * GrGLFPBuilder GrGLGPBuilder
32 * \ /
33 * GrGLProgramBuilder(internal use only)
34 */
35class GrGLUniformBuilder {
joshualitt30ba4362014-08-21 20:18:45 -070036public:
37 enum ShaderVisibility {
bsalomon17168df2014-12-09 09:00:49 -080038 kVertex_Visibility = 1 << kVertex_GrShaderType,
39 kGeometry_Visibility = 1 << kGeometry_GrShaderType,
40 kFragment_Visibility = 1 << kFragment_GrShaderType,
joshualitt30ba4362014-08-21 20:18:45 -070041 };
42
joshualitt47bb3822014-10-07 16:43:25 -070043 virtual ~GrGLUniformBuilder() {}
44
joshualitt30ba4362014-08-21 20:18:45 -070045 typedef GrGLProgramDataManager::UniformHandle UniformHandle;
kkinnunen7aedda52015-06-29 23:01:28 -070046 typedef GrGLPathProgramDataManager::SeparableVaryingHandle SeparableVaryingHandle;
joshualitt47bb3822014-10-07 16:43:25 -070047
48 /** Add a uniform variable to the current program, that has visibility in one or more shaders.
49 visibility is a bitfield of ShaderVisibility values indicating from which shaders the
50 uniform should be accessible. At least one bit must be set. Geometry shader uniforms are not
51 supported at this time. The actual uniform name will be mangled. If outName is not NULL then
52 it will refer to the final uniform name after return. Use the addUniformArray variant to add
53 an array of uniforms. */
bsalomon422f56f2014-12-09 10:18:12 -080054 UniformHandle addUniform(uint32_t visibility,
55 GrSLType type,
56 GrSLPrecision precision,
57 const char* name,
58 const char** outName = NULL) {
59 return this->addUniformArray(visibility, type, precision, name, 0, outName);
60 }
61
62 virtual UniformHandle addUniformArray(
63 uint32_t visibility,
64 GrSLType type,
65 GrSLPrecision precision,
66 const char* name,
67 int arrayCount,
68 const char** outName = NULL) = 0;
joshualitt47bb3822014-10-07 16:43:25 -070069
70 virtual const GrGLShaderVar& getUniformVariable(UniformHandle u) const = 0;
71
72 /**
73 * Shortcut for getUniformVariable(u).c_str()
74 */
75 virtual const char* getUniformCStr(UniformHandle u) const = 0;
76
77 virtual const GrGLContextInfo& ctxInfo() const = 0;
78
bsalomon861e1032014-12-16 07:33:49 -080079 virtual GrGLGpu* gpu() const = 0;
joshualitt47bb3822014-10-07 16:43:25 -070080
81 /*
82 * *NOTE* NO MEMBERS ALLOWED, MULTIPLE INHERITANCE
83 */
84};
85
joshualitt74077b92014-10-24 11:26:03 -070086// TODO move this into GrGLGPBuilder and move them both out of this file
87class GrGLVarying {
88public:
89 bool vsVarying() const { return kVertToFrag_Varying == fVarying ||
90 kVertToGeo_Varying == fVarying; }
91 bool fsVarying() const { return kVertToFrag_Varying == fVarying ||
92 kGeoToFrag_Varying == fVarying; }
93 const char* vsOut() const { return fVsOut; }
94 const char* gsIn() const { return fGsIn; }
95 const char* gsOut() const { return fGsOut; }
96 const char* fsIn() const { return fFsIn; }
joshualittabb52a12015-01-13 15:02:10 -080097 GrSLType type() const { return fType; }
joshualitt74077b92014-10-24 11:26:03 -070098
99protected:
100 enum Varying {
101 kVertToFrag_Varying,
102 kVertToGeo_Varying,
103 kGeoToFrag_Varying,
104 };
105
106 GrGLVarying(GrSLType type, Varying varying)
107 : fVarying(varying), fType(type), fVsOut(NULL), fGsIn(NULL), fGsOut(NULL),
108 fFsIn(NULL) {}
109
110 Varying fVarying;
111
112private:
113 GrSLType fType;
114 const char* fVsOut;
115 const char* fGsIn;
116 const char* fGsOut;
117 const char* fFsIn;
118
119 friend class GrGLVertexBuilder;
120 friend class GrGLGeometryBuilder;
egdanielc2304142014-12-11 13:15:13 -0800121 friend class GrGLXferBuilder;
joshualitt74077b92014-10-24 11:26:03 -0700122 friend class GrGLFragmentShaderBuilder;
123};
124
125struct GrGLVertToFrag : public GrGLVarying {
126 GrGLVertToFrag(GrSLType type)
127 : GrGLVarying(type, kVertToFrag_Varying) {}
128};
129
130struct GrGLVertToGeo : public GrGLVarying {
131 GrGLVertToGeo(GrSLType type)
132 : GrGLVarying(type, kVertToGeo_Varying) {}
133};
134
135struct GrGLGeoToFrag : public GrGLVarying {
136 GrGLGeoToFrag(GrSLType type)
137 : GrGLVarying(type, kGeoToFrag_Varying) {}
138};
139
joshualitt47bb3822014-10-07 16:43:25 -0700140/* a specialization of the above for GPs. Lets the user add uniforms, varyings, and VS / FS code */
141class GrGLGPBuilder : public virtual GrGLUniformBuilder {
142public:
joshualitt2dd1ae02014-12-03 06:24:10 -0800143 /*
144 * addVarying allows fine grained control for setting up varyings between stages. If you just
145 * need to take an attribute and pass it through to an output value in a fragment shader, use
146 * addPassThroughAttribute.
147 * TODO convert most uses of addVarying to addPassThroughAttribute
148 */
joshualitt74077b92014-10-24 11:26:03 -0700149 virtual void addVarying(const char* name,
150 GrGLVarying*,
bsalomonc0bd6482014-12-09 10:04:14 -0800151 GrSLPrecision fsPrecision = kDefault_GrSLPrecision) = 0;
joshualitt47bb3822014-10-07 16:43:25 -0700152
joshualitt2dd1ae02014-12-03 06:24:10 -0800153 /*
154 * This call can be used by GP to pass an attribute through all shaders directly to 'output' in
155 * the fragment shader. Though this call effects both the vertex shader and fragment shader,
156 * it expects 'output' to be defined in the fragment shader before this call is made.
157 * TODO it might be nicer behavior to have a flag to declare output inside this call
158 */
joshualitt71c92602015-01-14 08:12:47 -0800159 virtual void addPassThroughAttribute(const GrGeometryProcessor::Attribute*,
joshualitt2dd1ae02014-12-03 06:24:10 -0800160 const char* output) = 0;
161
kkinnunen7aedda52015-06-29 23:01:28 -0700162 /*
163 * Creates a fragment shader varying that can be referred to.
164 * Comparable to GrGLUniformBuilder::addUniform().
165 */
166 virtual SeparableVaryingHandle addSeparableVarying(
167 const char* name, GrGLVertToFrag*, GrSLPrecision fsPrecision = kDefault_GrSLPrecision) = 0;
168
joshualitt47bb3822014-10-07 16:43:25 -0700169 // TODO rename getFragmentBuilder
egdaniel29bee0f2015-04-29 11:54:42 -0700170 virtual GrGLFragmentBuilder* getFragmentShaderBuilder() = 0;
joshualitt47bb3822014-10-07 16:43:25 -0700171 virtual GrGLVertexBuilder* getVertexShaderBuilder() = 0;
172
173 /*
174 * *NOTE* NO MEMBERS ALLOWED, MULTIPLE INHERITANCE
175 */
176};
177
178/* a specializations for FPs. Lets the user add uniforms and FS code */
179class GrGLFPBuilder : public virtual GrGLUniformBuilder {
180public:
egdaniel29bee0f2015-04-29 11:54:42 -0700181 virtual GrGLFragmentBuilder* getFragmentShaderBuilder() = 0;
joshualitt47bb3822014-10-07 16:43:25 -0700182
183 /*
184 * *NOTE* NO MEMBERS ALLOWED, MULTIPLE INHERITANCE
185 */
186};
187
egdanielc2304142014-12-11 13:15:13 -0800188/* a specializations for XPs. Lets the user add uniforms and FS code */
189class GrGLXPBuilder : public virtual GrGLUniformBuilder {
190public:
egdaniel29bee0f2015-04-29 11:54:42 -0700191 virtual GrGLXPFragmentBuilder* getFragmentShaderBuilder() = 0;
egdanielc2304142014-12-11 13:15:13 -0800192
193 /*
194 * *NOTE* NO MEMBERS ALLOWED, MULTIPLE INHERITANCE
195 */
196};
joshualittabb52a12015-01-13 15:02:10 -0800197
198/**
199 * The below struct represent processors installed in programs.
200 */
201template <class Proc>
202struct GrGLInstalledProc {
cdalton42717652015-06-18 11:54:30 -0700203 SkDEBUGCODE(int fSamplersIdx;)
204 SkAutoTDelete<Proc> fGLProc;
joshualittabb52a12015-01-13 15:02:10 -0800205};
206
207typedef GrGLInstalledProc<GrGLPrimitiveProcessor> GrGLInstalledGeoProc;
208typedef GrGLInstalledProc<GrGLXferProcessor> GrGLInstalledXferProc;
209typedef GrGLInstalledProc<GrGLFragmentProcessor> GrGLInstalledFragProc;
210
211struct GrGLInstalledFragProcs : public SkRefCnt {
212 virtual ~GrGLInstalledFragProcs();
213 SkSTArray<8, GrGLInstalledFragProc*, true> fProcs;
214};
joshualitta5305a12014-10-10 17:47:00 -0700215
joshualitt47bb3822014-10-07 16:43:25 -0700216/*
217 * Please note - no diamond problems because of virtual inheritance. Also, both base classes
218 * are pure virtual with no data members. This is the base class for program building.
219 * Subclasses are nearly identical but each has their own way of emitting transforms. State for
220 * each of the elements of the shader pipeline, ie vertex, fragment, geometry, etc, lives in those
221 * respective builders
222*/
223class GrGLProgramBuilder : public GrGLGPBuilder,
egdanielc2304142014-12-11 13:15:13 -0800224 public GrGLFPBuilder,
225 public GrGLXPBuilder {
joshualitt47bb3822014-10-07 16:43:25 -0700226public:
joshualitt873ad0e2015-01-20 09:08:51 -0800227 typedef GrGpu::DrawArgs DrawArgs;
joshualitt47bb3822014-10-07 16:43:25 -0700228 /** Generates a shader program.
229 *
230 * The program implements what is specified in the stages given as input.
231 * After successful generation, the builder result objects are available
232 * to be used.
233 * @return true if generation was successful.
234 */
joshualitt873ad0e2015-01-20 09:08:51 -0800235 static GrGLProgram* CreateProgram(const DrawArgs&, GrGLGpu*);
joshualitt47bb3822014-10-07 16:43:25 -0700236
bsalomon422f56f2014-12-09 10:18:12 -0800237 UniformHandle addUniformArray(uint32_t visibility,
238 GrSLType type,
239 GrSLPrecision precision,
240 const char* name,
241 int arrayCount,
mtklein36352bf2015-03-25 18:17:31 -0700242 const char** outName) override;
joshualitt47bb3822014-10-07 16:43:25 -0700243
mtklein36352bf2015-03-25 18:17:31 -0700244 const GrGLShaderVar& getUniformVariable(UniformHandle u) const override {
joshualitt47bb3822014-10-07 16:43:25 -0700245 return fUniforms[u.toShaderBuilderIndex()].fVariable;
246 }
247
mtklein36352bf2015-03-25 18:17:31 -0700248 const char* getUniformCStr(UniformHandle u) const override {
joshualitt47bb3822014-10-07 16:43:25 -0700249 return this->getUniformVariable(u).c_str();
250 }
251
mtklein36352bf2015-03-25 18:17:31 -0700252 const GrGLContextInfo& ctxInfo() const override;
joshualitt47bb3822014-10-07 16:43:25 -0700253
mtklein36352bf2015-03-25 18:17:31 -0700254 GrGLGpu* gpu() const override { return fGpu; }
joshualitt47bb3822014-10-07 16:43:25 -0700255
egdaniel29bee0f2015-04-29 11:54:42 -0700256 GrGLXPFragmentBuilder* getFragmentShaderBuilder() override { return &fFS; }
mtklein36352bf2015-03-25 18:17:31 -0700257 GrGLVertexBuilder* getVertexShaderBuilder() override { return &fVS; }
joshualitt47bb3822014-10-07 16:43:25 -0700258
bsalomon422f56f2014-12-09 10:18:12 -0800259 void addVarying(
joshualitta5305a12014-10-10 17:47:00 -0700260 const char* name,
joshualitt74077b92014-10-24 11:26:03 -0700261 GrGLVarying*,
mtklein36352bf2015-03-25 18:17:31 -0700262 GrSLPrecision fsPrecision = kDefault_GrSLPrecision) override;
joshualitt30ba4362014-08-21 20:18:45 -0700263
joshualitt71c92602015-01-14 08:12:47 -0800264 void addPassThroughAttribute(const GrPrimitiveProcessor::Attribute*,
mtklein36352bf2015-03-25 18:17:31 -0700265 const char* output) override;
joshualitt2dd1ae02014-12-03 06:24:10 -0800266
kkinnunen7aedda52015-06-29 23:01:28 -0700267 SeparableVaryingHandle addSeparableVarying(
268 const char* name,
269 GrGLVertToFrag*,
270 GrSLPrecision fsPrecision = kDefault_GrSLPrecision) override;
joshualitt2dd1ae02014-12-03 06:24:10 -0800271
joshualitt30ba4362014-08-21 20:18:45 -0700272 // Handles for program uniforms (other than per-effect uniforms)
273 struct BuiltinUniformHandles {
joshualitt30ba4362014-08-21 20:18:45 -0700274 UniformHandle fRTAdjustmentUni;
joshualitt30ba4362014-08-21 20:18:45 -0700275
276 // We use the render target height to provide a y-down frag coord when specifying
277 // origin_upper_left is not supported.
278 UniformHandle fRTHeightUni;
joshualitt30ba4362014-08-21 20:18:45 -0700279 };
280
joshualittdb0d3ca2014-10-07 12:42:26 -0700281protected:
joshualitta5305a12014-10-10 17:47:00 -0700282 typedef GrGLProgramDataManager::UniformInfo UniformInfo;
283 typedef GrGLProgramDataManager::UniformInfoArray UniformInfoArray;
284
joshualitt873ad0e2015-01-20 09:08:51 -0800285 static GrGLProgramBuilder* CreateProgramBuilder(const DrawArgs&, GrGLGpu*);
joshualitt47bb3822014-10-07 16:43:25 -0700286
joshualitt873ad0e2015-01-20 09:08:51 -0800287 GrGLProgramBuilder(GrGLGpu*, const DrawArgs&);
joshualitt30ba4362014-08-21 20:18:45 -0700288
joshualitt873ad0e2015-01-20 09:08:51 -0800289 const GrPrimitiveProcessor& primitiveProcessor() const { return *fArgs.fPrimitiveProcessor; }
egdaniel8dd688b2015-01-22 10:16:09 -0800290 const GrPipeline& pipeline() const { return *fArgs.fPipeline; }
joshualitt873ad0e2015-01-20 09:08:51 -0800291 const GrProgramDesc& desc() const { return *fArgs.fDesc; }
292 const GrBatchTracker& batchTracker() const { return *fArgs.fBatchTracker; }
293 const GrProgramDesc::KeyHeader& header() const { return fArgs.fDesc->header(); }
joshualitt23e280d2014-09-18 12:26:38 -0700294
joshualitt30ba4362014-08-21 20:18:45 -0700295 // Generates a name for a variable. The generated string will be name prefixed by the prefix
296 // char (unless the prefix is '\0'). It also mangles the name to be stage-specific if we're
297 // generating stage code.
298 void nameVariable(SkString* out, char prefix, const char* name);
joshualitt2dd1ae02014-12-03 06:24:10 -0800299 // Generates a possibly mangled name for a stage variable and writes it to the fragment shader.
300 // If GrGLSLExpr4 has a valid name then it will use that instead
301 void nameExpression(GrGLSLExpr4*, const char* baseName);
joshualitt6c891102015-05-13 08:51:49 -0700302 bool emitAndInstallProcs(GrGLSLExpr4* inputColor, GrGLSLExpr4* inputCoverage);
joshualitta5305a12014-10-10 17:47:00 -0700303 void emitAndInstallFragProcs(int procOffset, int numProcs, GrGLSLExpr4* inOut);
joshualitt2dd1ae02014-12-03 06:24:10 -0800304 void emitAndInstallProc(const GrPendingFragmentStage&,
joshualitta5305a12014-10-10 17:47:00 -0700305 int index,
joshualitta5305a12014-10-10 17:47:00 -0700306 const GrGLSLExpr4& input,
307 GrGLSLExpr4* output);
308
joshualitt9b989322014-12-15 14:16:27 -0800309 void emitAndInstallProc(const GrPrimitiveProcessor&,
joshualitt2dd1ae02014-12-03 06:24:10 -0800310 GrGLSLExpr4* outputColor,
311 GrGLSLExpr4* outputCoverage);
312
joshualitta5305a12014-10-10 17:47:00 -0700313 // these emit functions help to keep the createAndEmitProcessors template general
bsalomonae59b772014-11-19 08:23:49 -0800314 void emitAndInstallProc(const GrPendingFragmentStage&,
joshualittabb52a12015-01-13 15:02:10 -0800315 int index,
joshualitta5305a12014-10-10 17:47:00 -0700316 const char* outColor,
317 const char* inColor);
joshualitt9b989322014-12-15 14:16:27 -0800318 void emitAndInstallProc(const GrPrimitiveProcessor&,
joshualitt2dd1ae02014-12-03 06:24:10 -0800319 const char* outColor,
320 const char* outCoverage);
egdanielc2304142014-12-11 13:15:13 -0800321 void emitAndInstallXferProc(const GrXferProcessor&,
322 const GrGLSLExpr4& colorIn,
323 const GrGLSLExpr4& coverageIn);
joshualitt2dd1ae02014-12-03 06:24:10 -0800324
joshualitt9b989322014-12-15 14:16:27 -0800325 void verify(const GrPrimitiveProcessor&);
egdanielc2304142014-12-11 13:15:13 -0800326 void verify(const GrXferProcessor&);
joshualitt47bb3822014-10-07 16:43:25 -0700327 void verify(const GrFragmentProcessor&);
joshualittabb52a12015-01-13 15:02:10 -0800328 template <class Proc>
joshualitt47bb3822014-10-07 16:43:25 -0700329 void emitSamplers(const GrProcessor&,
330 GrGLProcessor::TextureSamplerArray* outSamplers,
joshualittabb52a12015-01-13 15:02:10 -0800331 GrGLInstalledProc<Proc>*);
joshualitt30ba4362014-08-21 20:18:45 -0700332
joshualitt47bb3822014-10-07 16:43:25 -0700333 GrGLProgram* finalize();
kkinnunen6bb6d402015-07-14 10:59:23 -0700334 virtual void bindProgramResourceLocations(GrGLuint programID);
joshualitt47bb3822014-10-07 16:43:25 -0700335 bool checkLinkStatus(GrGLuint programID);
kkinnunen7aedda52015-06-29 23:01:28 -0700336 virtual void resolveProgramResourceLocations(GrGLuint programID);
joshualitt47bb3822014-10-07 16:43:25 -0700337 void cleanupProgram(GrGLuint programID, const SkTDArray<GrGLuint>& shaderIDs);
338 void cleanupShaders(const SkTDArray<GrGLuint>& shaderIDs);
joshualitt30ba4362014-08-21 20:18:45 -0700339
joshualitt47bb3822014-10-07 16:43:25 -0700340 // Subclasses create different programs
341 virtual GrGLProgram* createProgram(GrGLuint programID);
342
joshualitt30ba4362014-08-21 20:18:45 -0700343 void appendUniformDecls(ShaderVisibility, SkString*) const;
344
joshualitt47bb3822014-10-07 16:43:25 -0700345 // reset is called by program creator between each processor's emit code. It increments the
346 // stage offset for variable name mangling, and also ensures verfication variables in the
347 // fragment shader are cleared.
348 void reset() {
349 this->enterStage();
350 this->addStage();
351 fFS.reset();
352 }
353 void addStage() { fStageIndex++; }
354
355 // This simple class exits the stage and then restores the stage when it goes out of scope
356 class AutoStageRestore {
joshualitt30ba4362014-08-21 20:18:45 -0700357 public:
joshualitt47bb3822014-10-07 16:43:25 -0700358 AutoStageRestore(GrGLProgramBuilder* pb)
359 : fPB(pb), fOutOfStage(pb->fOutOfStage) { pb->exitStage(); }
360 ~AutoStageRestore() { fPB->fOutOfStage = fOutOfStage; }
joshualittb0a8a372014-09-23 09:50:21 -0700361 private:
joshualitt47bb3822014-10-07 16:43:25 -0700362 GrGLProgramBuilder* fPB;
363 bool fOutOfStage;
joshualittb0a8a372014-09-23 09:50:21 -0700364 };
joshualitt47bb3822014-10-07 16:43:25 -0700365 class AutoStageAdvance {
joshualittdb0d3ca2014-10-07 12:42:26 -0700366 public:
joshualitt43466a12015-02-13 17:18:27 -0800367 AutoStageAdvance(GrGLProgramBuilder* pb)
368 : fPB(pb) {
369 fPB->reset();
370 // Each output to the fragment processor gets its own code section
371 fPB->fFS.nextStage();
372 }
joshualitt47bb3822014-10-07 16:43:25 -0700373 ~AutoStageAdvance() { fPB->exitStage(); }
joshualittdb0d3ca2014-10-07 12:42:26 -0700374 private:
joshualitt47bb3822014-10-07 16:43:25 -0700375 GrGLProgramBuilder* fPB;
376 };
377 void exitStage() { fOutOfStage = true; }
378 void enterStage() { fOutOfStage = false; }
379 int stageIndex() const { return fStageIndex; }
380
joshualitt4973d9d2014-11-08 09:24:25 -0800381 const char* rtAdjustment() const { return "rtAdjustment"; }
382
joshualitt47bb3822014-10-07 16:43:25 -0700383 // number of each input/output type in a single allocation block, used by many builders
384 static const int kVarsPerBlock;
385
386 BuiltinUniformHandles fUniformHandles;
387 GrGLVertexBuilder fVS;
388 GrGLGeometryBuilder fGS;
389 GrGLFragmentShaderBuilder fFS;
390 bool fOutOfStage;
391 int fStageIndex;
392
joshualitta5305a12014-10-10 17:47:00 -0700393 GrGLInstalledGeoProc* fGeometryProcessor;
egdanielc2304142014-12-11 13:15:13 -0800394 GrGLInstalledXferProc* fXferProcessor;
joshualitta5305a12014-10-10 17:47:00 -0700395 SkAutoTUnref<GrGLInstalledFragProcs> fFragmentProcessors;
joshualitt47bb3822014-10-07 16:43:25 -0700396
joshualitt873ad0e2015-01-20 09:08:51 -0800397 const DrawArgs& fArgs;
bsalomon861e1032014-12-16 07:33:49 -0800398 GrGLGpu* fGpu;
joshualitt47bb3822014-10-07 16:43:25 -0700399 UniformInfoArray fUniforms;
joshualittabb52a12015-01-13 15:02:10 -0800400 GrGLPrimitiveProcessor::TransformsIn fCoordTransforms;
401 GrGLPrimitiveProcessor::TransformsOut fOutCoords;
cdalton42717652015-06-18 11:54:30 -0700402 SkTArray<UniformHandle> fSamplerUniforms;
joshualitt47bb3822014-10-07 16:43:25 -0700403
404 friend class GrGLShaderBuilder;
405 friend class GrGLVertexBuilder;
406 friend class GrGLFragmentShaderBuilder;
407 friend class GrGLGeometryBuilder;
408};
joshualitt30ba4362014-08-21 20:18:45 -0700409#endif