blob: fcf7007f72fc1330a40ecb0239a99aaa4d7b7d77 [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"
joshualitt8072caa2015-02-12 14:20:52 -080015#include "../GrGLPrimitiveProcessor.h"
egdanielc2304142014-12-11 13:15:13 -080016#include "../GrGLXferProcessor.h"
egdaniel8dd688b2015-01-22 10:16:09 -080017#include "../../GrPipeline.h"
joshualitt89c7a2e2014-10-10 14:11:59 -070018
bsalomonac856c92015-08-27 06:30:17 -070019class GrFragmentProcessor;
20
joshualitt7375d6b2015-08-07 13:36:44 -070021// Enough precision to represent 1 / 2048 accurately in printf
22#define GR_SIGNIFICANT_POW2_DECIMAL_DIG 11
23
joshualitt47bb3822014-10-07 16:43:25 -070024/*
25 * This is the base class for a series of interfaces. This base class *MUST* remain abstract with
26 * NO data members because it is used in multiple interface inheritance.
27 * Heirarchy:
28 * GrGLUniformBuilder
29 * / \
30 * GrGLFPBuilder GrGLGPBuilder
31 * \ /
32 * GrGLProgramBuilder(internal use only)
33 */
34class GrGLUniformBuilder {
joshualitt30ba4362014-08-21 20:18:45 -070035public:
36 enum ShaderVisibility {
bsalomon17168df2014-12-09 09:00:49 -080037 kVertex_Visibility = 1 << kVertex_GrShaderType,
38 kGeometry_Visibility = 1 << kGeometry_GrShaderType,
39 kFragment_Visibility = 1 << kFragment_GrShaderType,
joshualitt30ba4362014-08-21 20:18:45 -070040 };
41
joshualitt47bb3822014-10-07 16:43:25 -070042 virtual ~GrGLUniformBuilder() {}
43
joshualitt30ba4362014-08-21 20:18:45 -070044 typedef GrGLProgramDataManager::UniformHandle UniformHandle;
joshualittd8dd47b2015-09-11 11:45:01 -070045 typedef GrGLProgramDataManager::SeparableVaryingHandle SeparableVaryingHandle;
joshualitt47bb3822014-10-07 16:43:25 -070046
47 /** Add a uniform variable to the current program, that has visibility in one or more shaders.
48 visibility is a bitfield of ShaderVisibility values indicating from which shaders the
49 uniform should be accessible. At least one bit must be set. Geometry shader uniforms are not
halcanary96fcdcc2015-08-27 07:41:13 -070050 supported at this time. The actual uniform name will be mangled. If outName is not nullptr then
joshualitt47bb3822014-10-07 16:43:25 -070051 it will refer to the final uniform name after return. Use the addUniformArray variant to add
52 an array of uniforms. */
bsalomon422f56f2014-12-09 10:18:12 -080053 UniformHandle addUniform(uint32_t visibility,
54 GrSLType type,
55 GrSLPrecision precision,
56 const char* name,
halcanary96fcdcc2015-08-27 07:41:13 -070057 const char** outName = nullptr) {
bsalomon422f56f2014-12-09 10:18:12 -080058 return this->addUniformArray(visibility, type, precision, name, 0, outName);
59 }
60
61 virtual UniformHandle addUniformArray(
62 uint32_t visibility,
63 GrSLType type,
64 GrSLPrecision precision,
65 const char* name,
66 int arrayCount,
halcanary96fcdcc2015-08-27 07:41:13 -070067 const char** outName = nullptr) = 0;
joshualitt47bb3822014-10-07 16:43:25 -070068
69 virtual const GrGLShaderVar& getUniformVariable(UniformHandle u) const = 0;
70
71 /**
72 * Shortcut for getUniformVariable(u).c_str()
73 */
74 virtual const char* getUniformCStr(UniformHandle u) const = 0;
75
76 virtual const GrGLContextInfo& ctxInfo() const = 0;
77
bsalomon861e1032014-12-16 07:33:49 -080078 virtual GrGLGpu* gpu() const = 0;
joshualitt47bb3822014-10-07 16:43:25 -070079
80 /*
81 * *NOTE* NO MEMBERS ALLOWED, MULTIPLE INHERITANCE
82 */
83};
84
joshualitt74077b92014-10-24 11:26:03 -070085// TODO move this into GrGLGPBuilder and move them both out of this file
86class GrGLVarying {
87public:
88 bool vsVarying() const { return kVertToFrag_Varying == fVarying ||
89 kVertToGeo_Varying == fVarying; }
90 bool fsVarying() const { return kVertToFrag_Varying == fVarying ||
91 kGeoToFrag_Varying == fVarying; }
92 const char* vsOut() const { return fVsOut; }
93 const char* gsIn() const { return fGsIn; }
94 const char* gsOut() const { return fGsOut; }
95 const char* fsIn() const { return fFsIn; }
joshualittabb52a12015-01-13 15:02:10 -080096 GrSLType type() const { return fType; }
joshualitt74077b92014-10-24 11:26:03 -070097
98protected:
99 enum Varying {
100 kVertToFrag_Varying,
101 kVertToGeo_Varying,
102 kGeoToFrag_Varying,
103 };
104
105 GrGLVarying(GrSLType type, Varying varying)
halcanary96fcdcc2015-08-27 07:41:13 -0700106 : fVarying(varying), fType(type), fVsOut(nullptr), fGsIn(nullptr), fGsOut(nullptr),
107 fFsIn(nullptr) {}
joshualitt74077b92014-10-24 11:26:03 -0700108
109 Varying fVarying;
110
111private:
112 GrSLType fType;
113 const char* fVsOut;
114 const char* fGsIn;
115 const char* fGsOut;
116 const char* fFsIn;
117
118 friend class GrGLVertexBuilder;
119 friend class GrGLGeometryBuilder;
egdanielc2304142014-12-11 13:15:13 -0800120 friend class GrGLXferBuilder;
joshualitt74077b92014-10-24 11:26:03 -0700121 friend class GrGLFragmentShaderBuilder;
122};
123
124struct GrGLVertToFrag : public GrGLVarying {
125 GrGLVertToFrag(GrSLType type)
126 : GrGLVarying(type, kVertToFrag_Varying) {}
127};
128
129struct GrGLVertToGeo : public GrGLVarying {
130 GrGLVertToGeo(GrSLType type)
131 : GrGLVarying(type, kVertToGeo_Varying) {}
132};
133
134struct GrGLGeoToFrag : public GrGLVarying {
135 GrGLGeoToFrag(GrSLType type)
136 : GrGLVarying(type, kGeoToFrag_Varying) {}
137};
138
joshualitt47bb3822014-10-07 16:43:25 -0700139/* a specialization of the above for GPs. Lets the user add uniforms, varyings, and VS / FS code */
140class GrGLGPBuilder : public virtual GrGLUniformBuilder {
141public:
joshualitt2dd1ae02014-12-03 06:24:10 -0800142 /*
143 * addVarying allows fine grained control for setting up varyings between stages. If you just
144 * need to take an attribute and pass it through to an output value in a fragment shader, use
145 * addPassThroughAttribute.
146 * TODO convert most uses of addVarying to addPassThroughAttribute
147 */
joshualitt74077b92014-10-24 11:26:03 -0700148 virtual void addVarying(const char* name,
149 GrGLVarying*,
joshualitteb00eab2015-09-15 14:12:22 -0700150 GrSLPrecision precision = kDefault_GrSLPrecision) = 0;
joshualitt47bb3822014-10-07 16:43:25 -0700151
joshualitt2dd1ae02014-12-03 06:24:10 -0800152 /*
153 * This call can be used by GP to pass an attribute through all shaders directly to 'output' in
154 * the fragment shader. Though this call effects both the vertex shader and fragment shader,
155 * it expects 'output' to be defined in the fragment shader before this call is made.
156 * TODO it might be nicer behavior to have a flag to declare output inside this call
157 */
joshualitt71c92602015-01-14 08:12:47 -0800158 virtual void addPassThroughAttribute(const GrGeometryProcessor::Attribute*,
joshualitt2dd1ae02014-12-03 06:24:10 -0800159 const char* output) = 0;
160
kkinnunen7aedda52015-06-29 23:01:28 -0700161 /*
162 * Creates a fragment shader varying that can be referred to.
163 * Comparable to GrGLUniformBuilder::addUniform().
164 */
165 virtual SeparableVaryingHandle addSeparableVarying(
166 const char* name, GrGLVertToFrag*, GrSLPrecision fsPrecision = kDefault_GrSLPrecision) = 0;
167
joshualitt47bb3822014-10-07 16:43:25 -0700168 // TODO rename getFragmentBuilder
egdaniel29bee0f2015-04-29 11:54:42 -0700169 virtual GrGLFragmentBuilder* getFragmentShaderBuilder() = 0;
joshualitt47bb3822014-10-07 16:43:25 -0700170 virtual GrGLVertexBuilder* getVertexShaderBuilder() = 0;
171
172 /*
173 * *NOTE* NO MEMBERS ALLOWED, MULTIPLE INHERITANCE
174 */
175};
176
177/* a specializations for FPs. Lets the user add uniforms and FS code */
178class GrGLFPBuilder : public virtual GrGLUniformBuilder {
179public:
egdaniel29bee0f2015-04-29 11:54:42 -0700180 virtual GrGLFragmentBuilder* getFragmentShaderBuilder() = 0;
joshualitt47bb3822014-10-07 16:43:25 -0700181
182 /*
183 * *NOTE* NO MEMBERS ALLOWED, MULTIPLE INHERITANCE
184 */
185};
186
egdanielc2304142014-12-11 13:15:13 -0800187/* a specializations for XPs. Lets the user add uniforms and FS code */
188class GrGLXPBuilder : public virtual GrGLUniformBuilder {
189public:
egdaniel29bee0f2015-04-29 11:54:42 -0700190 virtual GrGLXPFragmentBuilder* getFragmentShaderBuilder() = 0;
egdanielc2304142014-12-11 13:15:13 -0800191
192 /*
193 * *NOTE* NO MEMBERS ALLOWED, MULTIPLE INHERITANCE
194 */
195};
joshualittabb52a12015-01-13 15:02:10 -0800196
197/**
198 * The below struct represent processors installed in programs.
199 */
200template <class Proc>
201struct GrGLInstalledProc {
cdalton42717652015-06-18 11:54:30 -0700202 SkDEBUGCODE(int fSamplersIdx;)
203 SkAutoTDelete<Proc> fGLProc;
joshualittabb52a12015-01-13 15:02:10 -0800204};
205
206typedef GrGLInstalledProc<GrGLPrimitiveProcessor> GrGLInstalledGeoProc;
207typedef GrGLInstalledProc<GrGLXferProcessor> GrGLInstalledXferProc;
208typedef GrGLInstalledProc<GrGLFragmentProcessor> GrGLInstalledFragProc;
209
210struct GrGLInstalledFragProcs : public SkRefCnt {
211 virtual ~GrGLInstalledFragProcs();
212 SkSTArray<8, GrGLInstalledFragProc*, true> fProcs;
213};
joshualitta5305a12014-10-10 17:47:00 -0700214
joshualitt47bb3822014-10-07 16:43:25 -0700215/*
216 * Please note - no diamond problems because of virtual inheritance. Also, both base classes
217 * are pure virtual with no data members. This is the base class for program building.
218 * Subclasses are nearly identical but each has their own way of emitting transforms. State for
219 * each of the elements of the shader pipeline, ie vertex, fragment, geometry, etc, lives in those
220 * respective builders
221*/
222class GrGLProgramBuilder : public GrGLGPBuilder,
egdanielc2304142014-12-11 13:15:13 -0800223 public GrGLFPBuilder,
224 public GrGLXPBuilder {
joshualitt47bb3822014-10-07 16:43:25 -0700225public:
joshualitt873ad0e2015-01-20 09:08:51 -0800226 typedef GrGpu::DrawArgs DrawArgs;
joshualitt47bb3822014-10-07 16:43:25 -0700227 /** Generates a shader program.
228 *
229 * The program implements what is specified in the stages given as input.
230 * After successful generation, the builder result objects are available
231 * to be used.
232 * @return true if generation was successful.
233 */
joshualitt873ad0e2015-01-20 09:08:51 -0800234 static GrGLProgram* CreateProgram(const DrawArgs&, GrGLGpu*);
joshualitt47bb3822014-10-07 16:43:25 -0700235
bsalomon422f56f2014-12-09 10:18:12 -0800236 UniformHandle addUniformArray(uint32_t visibility,
237 GrSLType type,
238 GrSLPrecision precision,
239 const char* name,
240 int arrayCount,
mtklein36352bf2015-03-25 18:17:31 -0700241 const char** outName) override;
joshualitt47bb3822014-10-07 16:43:25 -0700242
mtklein36352bf2015-03-25 18:17:31 -0700243 const GrGLShaderVar& getUniformVariable(UniformHandle u) const override {
joshualitte7afc2d2015-09-11 10:44:13 -0700244 return fUniforms[u.toIndex()].fVariable;
joshualitt47bb3822014-10-07 16:43:25 -0700245 }
246
mtklein36352bf2015-03-25 18:17:31 -0700247 const char* getUniformCStr(UniformHandle u) const override {
joshualitt47bb3822014-10-07 16:43:25 -0700248 return this->getUniformVariable(u).c_str();
249 }
250
mtklein36352bf2015-03-25 18:17:31 -0700251 const GrGLContextInfo& ctxInfo() const override;
joshualitt47bb3822014-10-07 16:43:25 -0700252
mtklein36352bf2015-03-25 18:17:31 -0700253 GrGLGpu* gpu() const override { return fGpu; }
joshualitt47bb3822014-10-07 16:43:25 -0700254
egdaniel29bee0f2015-04-29 11:54:42 -0700255 GrGLXPFragmentBuilder* getFragmentShaderBuilder() override { return &fFS; }
mtklein36352bf2015-03-25 18:17:31 -0700256 GrGLVertexBuilder* getVertexShaderBuilder() override { return &fVS; }
joshualitt47bb3822014-10-07 16:43:25 -0700257
bsalomon422f56f2014-12-09 10:18:12 -0800258 void addVarying(
joshualitta5305a12014-10-10 17:47:00 -0700259 const char* name,
joshualitt74077b92014-10-24 11:26:03 -0700260 GrGLVarying*,
joshualitteb00eab2015-09-15 14:12:22 -0700261 GrSLPrecision precision = kDefault_GrSLPrecision) override;
joshualitt30ba4362014-08-21 20:18:45 -0700262
joshualitt71c92602015-01-14 08:12:47 -0800263 void addPassThroughAttribute(const GrPrimitiveProcessor::Attribute*,
mtklein36352bf2015-03-25 18:17:31 -0700264 const char* output) override;
joshualitt2dd1ae02014-12-03 06:24:10 -0800265
kkinnunen7aedda52015-06-29 23:01:28 -0700266 SeparableVaryingHandle addSeparableVarying(
267 const char* name,
268 GrGLVertToFrag*,
269 GrSLPrecision fsPrecision = kDefault_GrSLPrecision) override;
joshualitt2dd1ae02014-12-03 06:24:10 -0800270
joshualitt30ba4362014-08-21 20:18:45 -0700271 // Handles for program uniforms (other than per-effect uniforms)
272 struct BuiltinUniformHandles {
joshualitt30ba4362014-08-21 20:18:45 -0700273 UniformHandle fRTAdjustmentUni;
joshualitt30ba4362014-08-21 20:18:45 -0700274
275 // We use the render target height to provide a y-down frag coord when specifying
276 // origin_upper_left is not supported.
277 UniformHandle fRTHeightUni;
joshualitt30ba4362014-08-21 20:18:45 -0700278 };
279
joshualittdb0d3ca2014-10-07 12:42:26 -0700280protected:
joshualitta5305a12014-10-10 17:47:00 -0700281 typedef GrGLProgramDataManager::UniformInfo UniformInfo;
282 typedef GrGLProgramDataManager::UniformInfoArray UniformInfoArray;
joshualittd8dd47b2015-09-11 11:45:01 -0700283 typedef GrGLProgramDataManager::SeparableVaryingInfo SeparableVaryingInfo;
284 typedef GrGLProgramDataManager::SeparableVaryingInfoArray SeparableVaryingInfoArray;
joshualitt47bb3822014-10-07 16:43:25 -0700285
joshualitt873ad0e2015-01-20 09:08:51 -0800286 GrGLProgramBuilder(GrGLGpu*, const DrawArgs&);
joshualitt30ba4362014-08-21 20:18:45 -0700287
joshualitt873ad0e2015-01-20 09:08:51 -0800288 const GrPrimitiveProcessor& primitiveProcessor() const { return *fArgs.fPrimitiveProcessor; }
egdaniel8dd688b2015-01-22 10:16:09 -0800289 const GrPipeline& pipeline() const { return *fArgs.fPipeline; }
joshualitt873ad0e2015-01-20 09:08:51 -0800290 const GrProgramDesc& desc() const { return *fArgs.fDesc; }
joshualitt873ad0e2015-01-20 09:08:51 -0800291 const GrProgramDesc::KeyHeader& header() const { return fArgs.fDesc->header(); }
joshualitt23e280d2014-09-18 12:26:38 -0700292
joshualitt30ba4362014-08-21 20:18:45 -0700293 // Generates a name for a variable. The generated string will be name prefixed by the prefix
294 // char (unless the prefix is '\0'). It also mangles the name to be stage-specific if we're
295 // generating stage code.
296 void nameVariable(SkString* out, char prefix, const char* name);
joshualitt2dd1ae02014-12-03 06:24:10 -0800297 // Generates a possibly mangled name for a stage variable and writes it to the fragment shader.
298 // If GrGLSLExpr4 has a valid name then it will use that instead
299 void nameExpression(GrGLSLExpr4*, const char* baseName);
joshualitt6c891102015-05-13 08:51:49 -0700300 bool emitAndInstallProcs(GrGLSLExpr4* inputColor, GrGLSLExpr4* inputCoverage);
joshualitta5305a12014-10-10 17:47:00 -0700301 void emitAndInstallFragProcs(int procOffset, int numProcs, GrGLSLExpr4* inOut);
bsalomonac856c92015-08-27 06:30:17 -0700302 void emitAndInstallProc(const GrFragmentProcessor&,
joshualitta5305a12014-10-10 17:47:00 -0700303 int index,
joshualitta5305a12014-10-10 17:47:00 -0700304 const GrGLSLExpr4& input,
305 GrGLSLExpr4* output);
306
joshualitt9b989322014-12-15 14:16:27 -0800307 void emitAndInstallProc(const GrPrimitiveProcessor&,
joshualitt2dd1ae02014-12-03 06:24:10 -0800308 GrGLSLExpr4* outputColor,
309 GrGLSLExpr4* outputCoverage);
310
joshualitta5305a12014-10-10 17:47:00 -0700311 // these emit functions help to keep the createAndEmitProcessors template general
bsalomonac856c92015-08-27 06:30:17 -0700312 void emitAndInstallProc(const GrFragmentProcessor&,
joshualittabb52a12015-01-13 15:02:10 -0800313 int index,
joshualitta5305a12014-10-10 17:47:00 -0700314 const char* outColor,
315 const char* inColor);
joshualitt9b989322014-12-15 14:16:27 -0800316 void emitAndInstallProc(const GrPrimitiveProcessor&,
joshualitt2dd1ae02014-12-03 06:24:10 -0800317 const char* outColor,
318 const char* outCoverage);
egdanielc2304142014-12-11 13:15:13 -0800319 void emitAndInstallXferProc(const GrXferProcessor&,
320 const GrGLSLExpr4& colorIn,
321 const GrGLSLExpr4& coverageIn);
joshualitt2dd1ae02014-12-03 06:24:10 -0800322
joshualitt9b989322014-12-15 14:16:27 -0800323 void verify(const GrPrimitiveProcessor&);
egdanielc2304142014-12-11 13:15:13 -0800324 void verify(const GrXferProcessor&);
joshualitt47bb3822014-10-07 16:43:25 -0700325 void verify(const GrFragmentProcessor&);
joshualittabb52a12015-01-13 15:02:10 -0800326 template <class Proc>
joshualitt47bb3822014-10-07 16:43:25 -0700327 void emitSamplers(const GrProcessor&,
328 GrGLProcessor::TextureSamplerArray* outSamplers,
joshualittabb52a12015-01-13 15:02:10 -0800329 GrGLInstalledProc<Proc>*);
joshualitt30ba4362014-08-21 20:18:45 -0700330
joshualitt47bb3822014-10-07 16:43:25 -0700331 GrGLProgram* finalize();
kkinnunen6bb6d402015-07-14 10:59:23 -0700332 virtual void bindProgramResourceLocations(GrGLuint programID);
joshualitt47bb3822014-10-07 16:43:25 -0700333 bool checkLinkStatus(GrGLuint programID);
kkinnunen7aedda52015-06-29 23:01:28 -0700334 virtual void resolveProgramResourceLocations(GrGLuint programID);
joshualitt47bb3822014-10-07 16:43:25 -0700335 void cleanupProgram(GrGLuint programID, const SkTDArray<GrGLuint>& shaderIDs);
336 void cleanupShaders(const SkTDArray<GrGLuint>& shaderIDs);
joshualitt30ba4362014-08-21 20:18:45 -0700337
joshualitt47bb3822014-10-07 16:43:25 -0700338 // Subclasses create different programs
339 virtual GrGLProgram* createProgram(GrGLuint programID);
340
joshualitt30ba4362014-08-21 20:18:45 -0700341 void appendUniformDecls(ShaderVisibility, SkString*) const;
342
joshualitt47bb3822014-10-07 16:43:25 -0700343 // reset is called by program creator between each processor's emit code. It increments the
344 // stage offset for variable name mangling, and also ensures verfication variables in the
345 // fragment shader are cleared.
346 void reset() {
347 this->enterStage();
348 this->addStage();
349 fFS.reset();
350 }
351 void addStage() { fStageIndex++; }
352
353 // This simple class exits the stage and then restores the stage when it goes out of scope
354 class AutoStageRestore {
joshualitt30ba4362014-08-21 20:18:45 -0700355 public:
joshualitt47bb3822014-10-07 16:43:25 -0700356 AutoStageRestore(GrGLProgramBuilder* pb)
357 : fPB(pb), fOutOfStage(pb->fOutOfStage) { pb->exitStage(); }
358 ~AutoStageRestore() { fPB->fOutOfStage = fOutOfStage; }
joshualittb0a8a372014-09-23 09:50:21 -0700359 private:
joshualitt47bb3822014-10-07 16:43:25 -0700360 GrGLProgramBuilder* fPB;
361 bool fOutOfStage;
joshualittb0a8a372014-09-23 09:50:21 -0700362 };
joshualitt47bb3822014-10-07 16:43:25 -0700363 class AutoStageAdvance {
joshualittdb0d3ca2014-10-07 12:42:26 -0700364 public:
joshualitt43466a12015-02-13 17:18:27 -0800365 AutoStageAdvance(GrGLProgramBuilder* pb)
366 : fPB(pb) {
367 fPB->reset();
368 // Each output to the fragment processor gets its own code section
369 fPB->fFS.nextStage();
370 }
joshualitt47bb3822014-10-07 16:43:25 -0700371 ~AutoStageAdvance() { fPB->exitStage(); }
joshualittdb0d3ca2014-10-07 12:42:26 -0700372 private:
joshualitt47bb3822014-10-07 16:43:25 -0700373 GrGLProgramBuilder* fPB;
374 };
375 void exitStage() { fOutOfStage = true; }
376 void enterStage() { fOutOfStage = false; }
377 int stageIndex() const { return fStageIndex; }
378
joshualitt4973d9d2014-11-08 09:24:25 -0800379 const char* rtAdjustment() const { return "rtAdjustment"; }
380
joshualitt47bb3822014-10-07 16:43:25 -0700381 // number of each input/output type in a single allocation block, used by many builders
382 static const int kVarsPerBlock;
383
384 BuiltinUniformHandles fUniformHandles;
385 GrGLVertexBuilder fVS;
386 GrGLGeometryBuilder fGS;
387 GrGLFragmentShaderBuilder fFS;
388 bool fOutOfStage;
389 int fStageIndex;
390
joshualitta5305a12014-10-10 17:47:00 -0700391 GrGLInstalledGeoProc* fGeometryProcessor;
egdanielc2304142014-12-11 13:15:13 -0800392 GrGLInstalledXferProc* fXferProcessor;
joshualitta5305a12014-10-10 17:47:00 -0700393 SkAutoTUnref<GrGLInstalledFragProcs> fFragmentProcessors;
joshualitt47bb3822014-10-07 16:43:25 -0700394
joshualitt873ad0e2015-01-20 09:08:51 -0800395 const DrawArgs& fArgs;
bsalomon861e1032014-12-16 07:33:49 -0800396 GrGLGpu* fGpu;
joshualitt47bb3822014-10-07 16:43:25 -0700397 UniformInfoArray fUniforms;
joshualittabb52a12015-01-13 15:02:10 -0800398 GrGLPrimitiveProcessor::TransformsIn fCoordTransforms;
399 GrGLPrimitiveProcessor::TransformsOut fOutCoords;
cdalton42717652015-06-18 11:54:30 -0700400 SkTArray<UniformHandle> fSamplerUniforms;
joshualittd8dd47b2015-09-11 11:45:01 -0700401 SeparableVaryingInfoArray fSeparableVaryingInfos;
joshualitt47bb3822014-10-07 16:43:25 -0700402
403 friend class GrGLShaderBuilder;
404 friend class GrGLVertexBuilder;
405 friend class GrGLFragmentShaderBuilder;
406 friend class GrGLGeometryBuilder;
407};
joshualitt30ba4362014-08-21 20:18:45 -0700408#endif