blob: 22b67ae58d1db7de0ec7062be295e129eda0a988 [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"
bsalomonae59b772014-11-19 08:23:49 -080019#include "../../GrPendingFragmentStage.h"
egdaniel8dd688b2015-01-22 10:16:09 -080020#include "../../GrPipeline.h"
joshualitt89c7a2e2014-10-10 14:11:59 -070021
joshualitt47bb3822014-10-07 16:43:25 -070022/*
23 * This is the base class for a series of interfaces. This base class *MUST* remain abstract with
24 * NO data members because it is used in multiple interface inheritance.
25 * Heirarchy:
26 * GrGLUniformBuilder
27 * / \
28 * GrGLFPBuilder GrGLGPBuilder
29 * \ /
30 * GrGLProgramBuilder(internal use only)
31 */
32class GrGLUniformBuilder {
joshualitt30ba4362014-08-21 20:18:45 -070033public:
34 enum ShaderVisibility {
bsalomon17168df2014-12-09 09:00:49 -080035 kVertex_Visibility = 1 << kVertex_GrShaderType,
36 kGeometry_Visibility = 1 << kGeometry_GrShaderType,
37 kFragment_Visibility = 1 << kFragment_GrShaderType,
joshualitt30ba4362014-08-21 20:18:45 -070038 };
39
joshualitt47bb3822014-10-07 16:43:25 -070040 virtual ~GrGLUniformBuilder() {}
41
joshualitt30ba4362014-08-21 20:18:45 -070042 typedef GrGLProgramDataManager::UniformHandle UniformHandle;
kkinnunen7aedda52015-06-29 23:01:28 -070043 typedef GrGLPathProgramDataManager::SeparableVaryingHandle SeparableVaryingHandle;
joshualitt47bb3822014-10-07 16:43:25 -070044
45 /** Add a uniform variable to the current program, that has visibility in one or more shaders.
46 visibility is a bitfield of ShaderVisibility values indicating from which shaders the
47 uniform should be accessible. At least one bit must be set. Geometry shader uniforms are not
48 supported at this time. The actual uniform name will be mangled. If outName is not NULL then
49 it will refer to the final uniform name after return. Use the addUniformArray variant to add
50 an array of uniforms. */
bsalomon422f56f2014-12-09 10:18:12 -080051 UniformHandle addUniform(uint32_t visibility,
52 GrSLType type,
53 GrSLPrecision precision,
54 const char* name,
55 const char** outName = NULL) {
56 return this->addUniformArray(visibility, type, precision, name, 0, outName);
57 }
58
59 virtual UniformHandle addUniformArray(
60 uint32_t visibility,
61 GrSLType type,
62 GrSLPrecision precision,
63 const char* name,
64 int arrayCount,
65 const char** outName = NULL) = 0;
joshualitt47bb3822014-10-07 16:43:25 -070066
67 virtual const GrGLShaderVar& getUniformVariable(UniformHandle u) const = 0;
68
69 /**
70 * Shortcut for getUniformVariable(u).c_str()
71 */
72 virtual const char* getUniformCStr(UniformHandle u) const = 0;
73
74 virtual const GrGLContextInfo& ctxInfo() const = 0;
75
bsalomon861e1032014-12-16 07:33:49 -080076 virtual GrGLGpu* gpu() const = 0;
joshualitt47bb3822014-10-07 16:43:25 -070077
78 /*
79 * *NOTE* NO MEMBERS ALLOWED, MULTIPLE INHERITANCE
80 */
81};
82
joshualitt74077b92014-10-24 11:26:03 -070083// TODO move this into GrGLGPBuilder and move them both out of this file
84class GrGLVarying {
85public:
86 bool vsVarying() const { return kVertToFrag_Varying == fVarying ||
87 kVertToGeo_Varying == fVarying; }
88 bool fsVarying() const { return kVertToFrag_Varying == fVarying ||
89 kGeoToFrag_Varying == fVarying; }
90 const char* vsOut() const { return fVsOut; }
91 const char* gsIn() const { return fGsIn; }
92 const char* gsOut() const { return fGsOut; }
93 const char* fsIn() const { return fFsIn; }
joshualittabb52a12015-01-13 15:02:10 -080094 GrSLType type() const { return fType; }
joshualitt74077b92014-10-24 11:26:03 -070095
96protected:
97 enum Varying {
98 kVertToFrag_Varying,
99 kVertToGeo_Varying,
100 kGeoToFrag_Varying,
101 };
102
103 GrGLVarying(GrSLType type, Varying varying)
104 : fVarying(varying), fType(type), fVsOut(NULL), fGsIn(NULL), fGsOut(NULL),
105 fFsIn(NULL) {}
106
107 Varying fVarying;
108
109private:
110 GrSLType fType;
111 const char* fVsOut;
112 const char* fGsIn;
113 const char* fGsOut;
114 const char* fFsIn;
115
116 friend class GrGLVertexBuilder;
117 friend class GrGLGeometryBuilder;
egdanielc2304142014-12-11 13:15:13 -0800118 friend class GrGLXferBuilder;
joshualitt74077b92014-10-24 11:26:03 -0700119 friend class GrGLFragmentShaderBuilder;
120};
121
122struct GrGLVertToFrag : public GrGLVarying {
123 GrGLVertToFrag(GrSLType type)
124 : GrGLVarying(type, kVertToFrag_Varying) {}
125};
126
127struct GrGLVertToGeo : public GrGLVarying {
128 GrGLVertToGeo(GrSLType type)
129 : GrGLVarying(type, kVertToGeo_Varying) {}
130};
131
132struct GrGLGeoToFrag : public GrGLVarying {
133 GrGLGeoToFrag(GrSLType type)
134 : GrGLVarying(type, kGeoToFrag_Varying) {}
135};
136
joshualitt47bb3822014-10-07 16:43:25 -0700137/* a specialization of the above for GPs. Lets the user add uniforms, varyings, and VS / FS code */
138class GrGLGPBuilder : public virtual GrGLUniformBuilder {
139public:
joshualitt2dd1ae02014-12-03 06:24:10 -0800140 /*
141 * addVarying allows fine grained control for setting up varyings between stages. If you just
142 * need to take an attribute and pass it through to an output value in a fragment shader, use
143 * addPassThroughAttribute.
144 * TODO convert most uses of addVarying to addPassThroughAttribute
145 */
joshualitt74077b92014-10-24 11:26:03 -0700146 virtual void addVarying(const char* name,
147 GrGLVarying*,
bsalomonc0bd6482014-12-09 10:04:14 -0800148 GrSLPrecision fsPrecision = kDefault_GrSLPrecision) = 0;
joshualitt47bb3822014-10-07 16:43:25 -0700149
joshualitt2dd1ae02014-12-03 06:24:10 -0800150 /*
151 * This call can be used by GP to pass an attribute through all shaders directly to 'output' in
152 * the fragment shader. Though this call effects both the vertex shader and fragment shader,
153 * it expects 'output' to be defined in the fragment shader before this call is made.
154 * TODO it might be nicer behavior to have a flag to declare output inside this call
155 */
joshualitt71c92602015-01-14 08:12:47 -0800156 virtual void addPassThroughAttribute(const GrGeometryProcessor::Attribute*,
joshualitt2dd1ae02014-12-03 06:24:10 -0800157 const char* output) = 0;
158
kkinnunen7aedda52015-06-29 23:01:28 -0700159 /*
160 * Creates a fragment shader varying that can be referred to.
161 * Comparable to GrGLUniformBuilder::addUniform().
162 */
163 virtual SeparableVaryingHandle addSeparableVarying(
164 const char* name, GrGLVertToFrag*, GrSLPrecision fsPrecision = kDefault_GrSLPrecision) = 0;
165
joshualitt47bb3822014-10-07 16:43:25 -0700166 // TODO rename getFragmentBuilder
egdaniel29bee0f2015-04-29 11:54:42 -0700167 virtual GrGLFragmentBuilder* getFragmentShaderBuilder() = 0;
joshualitt47bb3822014-10-07 16:43:25 -0700168 virtual GrGLVertexBuilder* getVertexShaderBuilder() = 0;
169
170 /*
171 * *NOTE* NO MEMBERS ALLOWED, MULTIPLE INHERITANCE
172 */
173};
174
175/* a specializations for FPs. Lets the user add uniforms and FS code */
176class GrGLFPBuilder : public virtual GrGLUniformBuilder {
177public:
egdaniel29bee0f2015-04-29 11:54:42 -0700178 virtual GrGLFragmentBuilder* getFragmentShaderBuilder() = 0;
joshualitt47bb3822014-10-07 16:43:25 -0700179
180 /*
181 * *NOTE* NO MEMBERS ALLOWED, MULTIPLE INHERITANCE
182 */
183};
184
egdanielc2304142014-12-11 13:15:13 -0800185/* a specializations for XPs. Lets the user add uniforms and FS code */
186class GrGLXPBuilder : public virtual GrGLUniformBuilder {
187public:
egdaniel29bee0f2015-04-29 11:54:42 -0700188 virtual GrGLXPFragmentBuilder* getFragmentShaderBuilder() = 0;
egdanielc2304142014-12-11 13:15:13 -0800189
190 /*
191 * *NOTE* NO MEMBERS ALLOWED, MULTIPLE INHERITANCE
192 */
193};
joshualittabb52a12015-01-13 15:02:10 -0800194
195/**
196 * The below struct represent processors installed in programs.
197 */
198template <class Proc>
199struct GrGLInstalledProc {
cdalton42717652015-06-18 11:54:30 -0700200 SkDEBUGCODE(int fSamplersIdx;)
201 SkAutoTDelete<Proc> fGLProc;
joshualittabb52a12015-01-13 15:02:10 -0800202};
203
204typedef GrGLInstalledProc<GrGLPrimitiveProcessor> GrGLInstalledGeoProc;
205typedef GrGLInstalledProc<GrGLXferProcessor> GrGLInstalledXferProc;
206typedef GrGLInstalledProc<GrGLFragmentProcessor> GrGLInstalledFragProc;
207
208struct GrGLInstalledFragProcs : public SkRefCnt {
209 virtual ~GrGLInstalledFragProcs();
210 SkSTArray<8, GrGLInstalledFragProc*, true> fProcs;
211};
joshualitta5305a12014-10-10 17:47:00 -0700212
joshualitt47bb3822014-10-07 16:43:25 -0700213/*
214 * Please note - no diamond problems because of virtual inheritance. Also, both base classes
215 * are pure virtual with no data members. This is the base class for program building.
216 * Subclasses are nearly identical but each has their own way of emitting transforms. State for
217 * each of the elements of the shader pipeline, ie vertex, fragment, geometry, etc, lives in those
218 * respective builders
219*/
220class GrGLProgramBuilder : public GrGLGPBuilder,
egdanielc2304142014-12-11 13:15:13 -0800221 public GrGLFPBuilder,
222 public GrGLXPBuilder {
joshualitt47bb3822014-10-07 16:43:25 -0700223public:
joshualitt873ad0e2015-01-20 09:08:51 -0800224 typedef GrGpu::DrawArgs DrawArgs;
joshualitt47bb3822014-10-07 16:43:25 -0700225 /** Generates a shader program.
226 *
227 * The program implements what is specified in the stages given as input.
228 * After successful generation, the builder result objects are available
229 * to be used.
230 * @return true if generation was successful.
231 */
joshualitt873ad0e2015-01-20 09:08:51 -0800232 static GrGLProgram* CreateProgram(const DrawArgs&, GrGLGpu*);
joshualitt47bb3822014-10-07 16:43:25 -0700233
bsalomon422f56f2014-12-09 10:18:12 -0800234 UniformHandle addUniformArray(uint32_t visibility,
235 GrSLType type,
236 GrSLPrecision precision,
237 const char* name,
238 int arrayCount,
mtklein36352bf2015-03-25 18:17:31 -0700239 const char** outName) override;
joshualitt47bb3822014-10-07 16:43:25 -0700240
mtklein36352bf2015-03-25 18:17:31 -0700241 const GrGLShaderVar& getUniformVariable(UniformHandle u) const override {
joshualitt47bb3822014-10-07 16:43:25 -0700242 return fUniforms[u.toShaderBuilderIndex()].fVariable;
243 }
244
mtklein36352bf2015-03-25 18:17:31 -0700245 const char* getUniformCStr(UniformHandle u) const override {
joshualitt47bb3822014-10-07 16:43:25 -0700246 return this->getUniformVariable(u).c_str();
247 }
248
mtklein36352bf2015-03-25 18:17:31 -0700249 const GrGLContextInfo& ctxInfo() const override;
joshualitt47bb3822014-10-07 16:43:25 -0700250
mtklein36352bf2015-03-25 18:17:31 -0700251 GrGLGpu* gpu() const override { return fGpu; }
joshualitt47bb3822014-10-07 16:43:25 -0700252
egdaniel29bee0f2015-04-29 11:54:42 -0700253 GrGLXPFragmentBuilder* getFragmentShaderBuilder() override { return &fFS; }
mtklein36352bf2015-03-25 18:17:31 -0700254 GrGLVertexBuilder* getVertexShaderBuilder() override { return &fVS; }
joshualitt47bb3822014-10-07 16:43:25 -0700255
bsalomon422f56f2014-12-09 10:18:12 -0800256 void addVarying(
joshualitta5305a12014-10-10 17:47:00 -0700257 const char* name,
joshualitt74077b92014-10-24 11:26:03 -0700258 GrGLVarying*,
mtklein36352bf2015-03-25 18:17:31 -0700259 GrSLPrecision fsPrecision = kDefault_GrSLPrecision) override;
joshualitt30ba4362014-08-21 20:18:45 -0700260
joshualitt71c92602015-01-14 08:12:47 -0800261 void addPassThroughAttribute(const GrPrimitiveProcessor::Attribute*,
mtklein36352bf2015-03-25 18:17:31 -0700262 const char* output) override;
joshualitt2dd1ae02014-12-03 06:24:10 -0800263
kkinnunen7aedda52015-06-29 23:01:28 -0700264 SeparableVaryingHandle addSeparableVarying(
265 const char* name,
266 GrGLVertToFrag*,
267 GrSLPrecision fsPrecision = kDefault_GrSLPrecision) override;
joshualitt2dd1ae02014-12-03 06:24:10 -0800268
joshualitt30ba4362014-08-21 20:18:45 -0700269 // Handles for program uniforms (other than per-effect uniforms)
270 struct BuiltinUniformHandles {
joshualitt30ba4362014-08-21 20:18:45 -0700271 UniformHandle fRTAdjustmentUni;
joshualitt30ba4362014-08-21 20:18:45 -0700272
273 // We use the render target height to provide a y-down frag coord when specifying
274 // origin_upper_left is not supported.
275 UniformHandle fRTHeightUni;
joshualitt30ba4362014-08-21 20:18:45 -0700276 };
277
joshualittdb0d3ca2014-10-07 12:42:26 -0700278protected:
joshualitta5305a12014-10-10 17:47:00 -0700279 typedef GrGLProgramDataManager::UniformInfo UniformInfo;
280 typedef GrGLProgramDataManager::UniformInfoArray UniformInfoArray;
281
joshualitt873ad0e2015-01-20 09:08:51 -0800282 static GrGLProgramBuilder* CreateProgramBuilder(const DrawArgs&, GrGLGpu*);
joshualitt47bb3822014-10-07 16:43:25 -0700283
joshualitt873ad0e2015-01-20 09:08:51 -0800284 GrGLProgramBuilder(GrGLGpu*, const DrawArgs&);
joshualitt30ba4362014-08-21 20:18:45 -0700285
joshualitt873ad0e2015-01-20 09:08:51 -0800286 const GrPrimitiveProcessor& primitiveProcessor() const { return *fArgs.fPrimitiveProcessor; }
egdaniel8dd688b2015-01-22 10:16:09 -0800287 const GrPipeline& pipeline() const { return *fArgs.fPipeline; }
joshualitt873ad0e2015-01-20 09:08:51 -0800288 const GrProgramDesc& desc() const { return *fArgs.fDesc; }
289 const GrBatchTracker& batchTracker() const { return *fArgs.fBatchTracker; }
290 const GrProgramDesc::KeyHeader& header() const { return fArgs.fDesc->header(); }
joshualitt23e280d2014-09-18 12:26:38 -0700291
joshualitt30ba4362014-08-21 20:18:45 -0700292 // Generates a name for a variable. The generated string will be name prefixed by the prefix
293 // char (unless the prefix is '\0'). It also mangles the name to be stage-specific if we're
294 // generating stage code.
295 void nameVariable(SkString* out, char prefix, const char* name);
joshualitt2dd1ae02014-12-03 06:24:10 -0800296 // Generates a possibly mangled name for a stage variable and writes it to the fragment shader.
297 // If GrGLSLExpr4 has a valid name then it will use that instead
298 void nameExpression(GrGLSLExpr4*, const char* baseName);
joshualitt6c891102015-05-13 08:51:49 -0700299 bool emitAndInstallProcs(GrGLSLExpr4* inputColor, GrGLSLExpr4* inputCoverage);
joshualitta5305a12014-10-10 17:47:00 -0700300 void emitAndInstallFragProcs(int procOffset, int numProcs, GrGLSLExpr4* inOut);
joshualitt2dd1ae02014-12-03 06:24:10 -0800301 void emitAndInstallProc(const GrPendingFragmentStage&,
joshualitta5305a12014-10-10 17:47:00 -0700302 int index,
joshualitta5305a12014-10-10 17:47:00 -0700303 const GrGLSLExpr4& input,
304 GrGLSLExpr4* output);
305
joshualitt9b989322014-12-15 14:16:27 -0800306 void emitAndInstallProc(const GrPrimitiveProcessor&,
joshualitt2dd1ae02014-12-03 06:24:10 -0800307 GrGLSLExpr4* outputColor,
308 GrGLSLExpr4* outputCoverage);
309
joshualitta5305a12014-10-10 17:47:00 -0700310 // these emit functions help to keep the createAndEmitProcessors template general
bsalomonae59b772014-11-19 08:23:49 -0800311 void emitAndInstallProc(const GrPendingFragmentStage&,
joshualittabb52a12015-01-13 15:02:10 -0800312 int index,
joshualitta5305a12014-10-10 17:47:00 -0700313 const char* outColor,
314 const char* inColor);
joshualitt9b989322014-12-15 14:16:27 -0800315 void emitAndInstallProc(const GrPrimitiveProcessor&,
joshualitt2dd1ae02014-12-03 06:24:10 -0800316 const char* outColor,
317 const char* outCoverage);
egdanielc2304142014-12-11 13:15:13 -0800318 void emitAndInstallXferProc(const GrXferProcessor&,
319 const GrGLSLExpr4& colorIn,
320 const GrGLSLExpr4& coverageIn);
joshualitt2dd1ae02014-12-03 06:24:10 -0800321
joshualitt9b989322014-12-15 14:16:27 -0800322 void verify(const GrPrimitiveProcessor&);
egdanielc2304142014-12-11 13:15:13 -0800323 void verify(const GrXferProcessor&);
joshualitt47bb3822014-10-07 16:43:25 -0700324 void verify(const GrFragmentProcessor&);
joshualittabb52a12015-01-13 15:02:10 -0800325 template <class Proc>
joshualitt47bb3822014-10-07 16:43:25 -0700326 void emitSamplers(const GrProcessor&,
327 GrGLProcessor::TextureSamplerArray* outSamplers,
joshualittabb52a12015-01-13 15:02:10 -0800328 GrGLInstalledProc<Proc>*);
joshualitt30ba4362014-08-21 20:18:45 -0700329
joshualitt47bb3822014-10-07 16:43:25 -0700330 GrGLProgram* finalize();
kkinnuneneeef46d2015-07-02 03:01:43 -0700331 virtual void bindProgramResourceLocations(GrGLuint programID);
joshualitt47bb3822014-10-07 16:43:25 -0700332 bool checkLinkStatus(GrGLuint programID);
kkinnunen7aedda52015-06-29 23:01:28 -0700333 virtual void resolveProgramResourceLocations(GrGLuint programID);
joshualitt47bb3822014-10-07 16:43:25 -0700334 void cleanupProgram(GrGLuint programID, const SkTDArray<GrGLuint>& shaderIDs);
335 void cleanupShaders(const SkTDArray<GrGLuint>& shaderIDs);
joshualitt30ba4362014-08-21 20:18:45 -0700336
joshualitt47bb3822014-10-07 16:43:25 -0700337 // Subclasses create different programs
338 virtual GrGLProgram* createProgram(GrGLuint programID);
339
joshualitt30ba4362014-08-21 20:18:45 -0700340 void appendUniformDecls(ShaderVisibility, SkString*) const;
341
joshualitt47bb3822014-10-07 16:43:25 -0700342 // reset is called by program creator between each processor's emit code. It increments the
343 // stage offset for variable name mangling, and also ensures verfication variables in the
344 // fragment shader are cleared.
345 void reset() {
346 this->enterStage();
347 this->addStage();
348 fFS.reset();
349 }
350 void addStage() { fStageIndex++; }
351
352 // This simple class exits the stage and then restores the stage when it goes out of scope
353 class AutoStageRestore {
joshualitt30ba4362014-08-21 20:18:45 -0700354 public:
joshualitt47bb3822014-10-07 16:43:25 -0700355 AutoStageRestore(GrGLProgramBuilder* pb)
356 : fPB(pb), fOutOfStage(pb->fOutOfStage) { pb->exitStage(); }
357 ~AutoStageRestore() { fPB->fOutOfStage = fOutOfStage; }
joshualittb0a8a372014-09-23 09:50:21 -0700358 private:
joshualitt47bb3822014-10-07 16:43:25 -0700359 GrGLProgramBuilder* fPB;
360 bool fOutOfStage;
joshualittb0a8a372014-09-23 09:50:21 -0700361 };
joshualitt47bb3822014-10-07 16:43:25 -0700362 class AutoStageAdvance {
joshualittdb0d3ca2014-10-07 12:42:26 -0700363 public:
joshualitt43466a12015-02-13 17:18:27 -0800364 AutoStageAdvance(GrGLProgramBuilder* pb)
365 : fPB(pb) {
366 fPB->reset();
367 // Each output to the fragment processor gets its own code section
368 fPB->fFS.nextStage();
369 }
joshualitt47bb3822014-10-07 16:43:25 -0700370 ~AutoStageAdvance() { fPB->exitStage(); }
joshualittdb0d3ca2014-10-07 12:42:26 -0700371 private:
joshualitt47bb3822014-10-07 16:43:25 -0700372 GrGLProgramBuilder* fPB;
373 };
374 void exitStage() { fOutOfStage = true; }
375 void enterStage() { fOutOfStage = false; }
376 int stageIndex() const { return fStageIndex; }
377
joshualitt4973d9d2014-11-08 09:24:25 -0800378 const char* rtAdjustment() const { return "rtAdjustment"; }
379
joshualitt47bb3822014-10-07 16:43:25 -0700380 // number of each input/output type in a single allocation block, used by many builders
381 static const int kVarsPerBlock;
382
383 BuiltinUniformHandles fUniformHandles;
384 GrGLVertexBuilder fVS;
385 GrGLGeometryBuilder fGS;
386 GrGLFragmentShaderBuilder fFS;
387 bool fOutOfStage;
388 int fStageIndex;
389
joshualitta5305a12014-10-10 17:47:00 -0700390 GrGLInstalledGeoProc* fGeometryProcessor;
egdanielc2304142014-12-11 13:15:13 -0800391 GrGLInstalledXferProc* fXferProcessor;
joshualitta5305a12014-10-10 17:47:00 -0700392 SkAutoTUnref<GrGLInstalledFragProcs> fFragmentProcessors;
joshualitt47bb3822014-10-07 16:43:25 -0700393
joshualitt873ad0e2015-01-20 09:08:51 -0800394 const DrawArgs& fArgs;
bsalomon861e1032014-12-16 07:33:49 -0800395 GrGLGpu* fGpu;
joshualitt47bb3822014-10-07 16:43:25 -0700396 UniformInfoArray fUniforms;
joshualittabb52a12015-01-13 15:02:10 -0800397 GrGLPrimitiveProcessor::TransformsIn fCoordTransforms;
398 GrGLPrimitiveProcessor::TransformsOut fOutCoords;
cdalton42717652015-06-18 11:54:30 -0700399 SkTArray<UniformHandle> fSamplerUniforms;
joshualitt47bb3822014-10-07 16:43:25 -0700400
401 friend class GrGLShaderBuilder;
402 friend class GrGLVertexBuilder;
403 friend class GrGLFragmentShaderBuilder;
404 friend class GrGLGeometryBuilder;
405};
joshualitt30ba4362014-08-21 20:18:45 -0700406#endif