blob: 3fdccca393693688a3fde3c78eaca66b5186b7a7 [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"
15#include "../GrGLUniformHandle.h"
joshualitta5305a12014-10-10 17:47:00 -070016#include "../GrGLGeometryProcessor.h"
egdanielc2304142014-12-11 13:15:13 -080017#include "../GrGLXferProcessor.h"
bsalomon04ddf892014-11-19 12:36:22 -080018#include "../../GrOptDrawState.h"
bsalomonae59b772014-11-19 08:23:49 -080019#include "../../GrPendingFragmentStage.h"
joshualitt89c7a2e2014-10-10 14:11:59 -070020
joshualitt47bb3822014-10-07 16:43:25 -070021/*
22 * This is the base class for a series of interfaces. This base class *MUST* remain abstract with
23 * NO data members because it is used in multiple interface inheritance.
24 * Heirarchy:
25 * GrGLUniformBuilder
26 * / \
27 * GrGLFPBuilder GrGLGPBuilder
28 * \ /
29 * GrGLProgramBuilder(internal use only)
30 */
31class GrGLUniformBuilder {
joshualitt30ba4362014-08-21 20:18:45 -070032public:
33 enum ShaderVisibility {
bsalomon17168df2014-12-09 09:00:49 -080034 kVertex_Visibility = 1 << kVertex_GrShaderType,
35 kGeometry_Visibility = 1 << kGeometry_GrShaderType,
36 kFragment_Visibility = 1 << kFragment_GrShaderType,
joshualitt30ba4362014-08-21 20:18:45 -070037 };
38
joshualitt47bb3822014-10-07 16:43:25 -070039 virtual ~GrGLUniformBuilder() {}
40
joshualitt30ba4362014-08-21 20:18:45 -070041 typedef GrGLProgramDataManager::UniformHandle UniformHandle;
joshualitt47bb3822014-10-07 16:43:25 -070042
43 /** Add a uniform variable to the current program, that has visibility in one or more shaders.
44 visibility is a bitfield of ShaderVisibility values indicating from which shaders the
45 uniform should be accessible. At least one bit must be set. Geometry shader uniforms are not
46 supported at this time. The actual uniform name will be mangled. If outName is not NULL then
47 it will refer to the final uniform name after return. Use the addUniformArray variant to add
48 an array of uniforms. */
bsalomon422f56f2014-12-09 10:18:12 -080049 UniformHandle addUniform(uint32_t visibility,
50 GrSLType type,
51 GrSLPrecision precision,
52 const char* name,
53 const char** outName = NULL) {
54 return this->addUniformArray(visibility, type, precision, name, 0, outName);
55 }
56
57 virtual UniformHandle addUniformArray(
58 uint32_t visibility,
59 GrSLType type,
60 GrSLPrecision precision,
61 const char* name,
62 int arrayCount,
63 const char** outName = NULL) = 0;
joshualitt47bb3822014-10-07 16:43:25 -070064
65 virtual const GrGLShaderVar& getUniformVariable(UniformHandle u) const = 0;
66
67 /**
68 * Shortcut for getUniformVariable(u).c_str()
69 */
70 virtual const char* getUniformCStr(UniformHandle u) const = 0;
71
72 virtual const GrGLContextInfo& ctxInfo() const = 0;
73
bsalomon861e1032014-12-16 07:33:49 -080074 virtual GrGLGpu* gpu() const = 0;
joshualitt47bb3822014-10-07 16:43:25 -070075
76 /*
77 * *NOTE* NO MEMBERS ALLOWED, MULTIPLE INHERITANCE
78 */
79};
80
joshualitt74077b92014-10-24 11:26:03 -070081// TODO move this into GrGLGPBuilder and move them both out of this file
82class GrGLVarying {
83public:
84 bool vsVarying() const { return kVertToFrag_Varying == fVarying ||
85 kVertToGeo_Varying == fVarying; }
86 bool fsVarying() const { return kVertToFrag_Varying == fVarying ||
87 kGeoToFrag_Varying == fVarying; }
88 const char* vsOut() const { return fVsOut; }
89 const char* gsIn() const { return fGsIn; }
90 const char* gsOut() const { return fGsOut; }
91 const char* fsIn() const { return fFsIn; }
92
93protected:
94 enum Varying {
95 kVertToFrag_Varying,
96 kVertToGeo_Varying,
97 kGeoToFrag_Varying,
98 };
99
100 GrGLVarying(GrSLType type, Varying varying)
101 : fVarying(varying), fType(type), fVsOut(NULL), fGsIn(NULL), fGsOut(NULL),
102 fFsIn(NULL) {}
103
104 Varying fVarying;
105
106private:
107 GrSLType fType;
108 const char* fVsOut;
109 const char* fGsIn;
110 const char* fGsOut;
111 const char* fFsIn;
112
113 friend class GrGLVertexBuilder;
114 friend class GrGLGeometryBuilder;
egdanielc2304142014-12-11 13:15:13 -0800115 friend class GrGLXferBuilder;
joshualitt74077b92014-10-24 11:26:03 -0700116 friend class GrGLFragmentShaderBuilder;
117};
118
119struct GrGLVertToFrag : public GrGLVarying {
120 GrGLVertToFrag(GrSLType type)
121 : GrGLVarying(type, kVertToFrag_Varying) {}
122};
123
124struct GrGLVertToGeo : public GrGLVarying {
125 GrGLVertToGeo(GrSLType type)
126 : GrGLVarying(type, kVertToGeo_Varying) {}
127};
128
129struct GrGLGeoToFrag : public GrGLVarying {
130 GrGLGeoToFrag(GrSLType type)
131 : GrGLVarying(type, kGeoToFrag_Varying) {}
132};
133
joshualitt47bb3822014-10-07 16:43:25 -0700134/* a specialization of the above for GPs. Lets the user add uniforms, varyings, and VS / FS code */
135class GrGLGPBuilder : public virtual GrGLUniformBuilder {
136public:
joshualitt2dd1ae02014-12-03 06:24:10 -0800137 /*
138 * addVarying allows fine grained control for setting up varyings between stages. If you just
139 * need to take an attribute and pass it through to an output value in a fragment shader, use
140 * addPassThroughAttribute.
141 * TODO convert most uses of addVarying to addPassThroughAttribute
142 */
joshualitt74077b92014-10-24 11:26:03 -0700143 virtual void addVarying(const char* name,
144 GrGLVarying*,
bsalomonc0bd6482014-12-09 10:04:14 -0800145 GrSLPrecision fsPrecision = kDefault_GrSLPrecision) = 0;
joshualitt47bb3822014-10-07 16:43:25 -0700146
joshualitt2dd1ae02014-12-03 06:24:10 -0800147 /*
148 * This call can be used by GP to pass an attribute through all shaders directly to 'output' in
149 * the fragment shader. Though this call effects both the vertex shader and fragment shader,
150 * it expects 'output' to be defined in the fragment shader before this call is made.
151 * TODO it might be nicer behavior to have a flag to declare output inside this call
152 */
153 virtual void addPassThroughAttribute(const GrGeometryProcessor::GrAttribute*,
154 const char* output) = 0;
155
joshualitt47bb3822014-10-07 16:43:25 -0700156 // TODO rename getFragmentBuilder
157 virtual GrGLGPFragmentBuilder* getFragmentShaderBuilder() = 0;
158 virtual GrGLVertexBuilder* getVertexShaderBuilder() = 0;
159
160 /*
161 * *NOTE* NO MEMBERS ALLOWED, MULTIPLE INHERITANCE
162 */
163};
164
165/* a specializations for FPs. Lets the user add uniforms and FS code */
166class GrGLFPBuilder : public virtual GrGLUniformBuilder {
167public:
168 virtual GrGLFPFragmentBuilder* getFragmentShaderBuilder() = 0;
169
170 /*
171 * *NOTE* NO MEMBERS ALLOWED, MULTIPLE INHERITANCE
172 */
173};
174
egdanielc2304142014-12-11 13:15:13 -0800175/* a specializations for XPs. Lets the user add uniforms and FS code */
176class GrGLXPBuilder : public virtual GrGLUniformBuilder {
177public:
178 virtual GrGLFPFragmentBuilder* getFragmentShaderBuilder() = 0;
179
180 /*
181 * *NOTE* NO MEMBERS ALLOWED, MULTIPLE INHERITANCE
182 */
183};
joshualitta5305a12014-10-10 17:47:00 -0700184struct GrGLInstalledProc;
185struct GrGLInstalledGeoProc;
egdanielc2304142014-12-11 13:15:13 -0800186struct GrGLInstalledXferProc;
joshualitta5305a12014-10-10 17:47:00 -0700187struct GrGLInstalledFragProc;
188struct GrGLInstalledFragProcs;
189
joshualitt47bb3822014-10-07 16:43:25 -0700190/*
191 * Please note - no diamond problems because of virtual inheritance. Also, both base classes
192 * are pure virtual with no data members. This is the base class for program building.
193 * Subclasses are nearly identical but each has their own way of emitting transforms. State for
194 * each of the elements of the shader pipeline, ie vertex, fragment, geometry, etc, lives in those
195 * respective builders
196*/
197class GrGLProgramBuilder : public GrGLGPBuilder,
egdanielc2304142014-12-11 13:15:13 -0800198 public GrGLFPBuilder,
199 public GrGLXPBuilder {
joshualitt47bb3822014-10-07 16:43:25 -0700200public:
201 /** Generates a shader program.
202 *
203 * The program implements what is specified in the stages given as input.
204 * After successful generation, the builder result objects are available
205 * to be used.
206 * @return true if generation was successful.
207 */
bsalomon861e1032014-12-16 07:33:49 -0800208 static GrGLProgram* CreateProgram(const GrOptDrawState&, GrGLGpu*);
joshualitt47bb3822014-10-07 16:43:25 -0700209
bsalomon422f56f2014-12-09 10:18:12 -0800210 UniformHandle addUniformArray(uint32_t visibility,
211 GrSLType type,
212 GrSLPrecision precision,
213 const char* name,
214 int arrayCount,
215 const char** outName) SK_OVERRIDE;
joshualitt47bb3822014-10-07 16:43:25 -0700216
bsalomon422f56f2014-12-09 10:18:12 -0800217 const GrGLShaderVar& getUniformVariable(UniformHandle u) const SK_OVERRIDE {
joshualitt47bb3822014-10-07 16:43:25 -0700218 return fUniforms[u.toShaderBuilderIndex()].fVariable;
219 }
220
bsalomon422f56f2014-12-09 10:18:12 -0800221 const char* getUniformCStr(UniformHandle u) const SK_OVERRIDE {
joshualitt47bb3822014-10-07 16:43:25 -0700222 return this->getUniformVariable(u).c_str();
223 }
224
bsalomon422f56f2014-12-09 10:18:12 -0800225 const GrGLContextInfo& ctxInfo() const SK_OVERRIDE;
joshualitt47bb3822014-10-07 16:43:25 -0700226
bsalomon861e1032014-12-16 07:33:49 -0800227 GrGLGpu* gpu() const SK_OVERRIDE { return fGpu; }
joshualitt47bb3822014-10-07 16:43:25 -0700228
bsalomon422f56f2014-12-09 10:18:12 -0800229 GrGLFPFragmentBuilder* getFragmentShaderBuilder() SK_OVERRIDE { return &fFS; }
230 GrGLVertexBuilder* getVertexShaderBuilder() SK_OVERRIDE { return &fVS; }
joshualitt47bb3822014-10-07 16:43:25 -0700231
bsalomon422f56f2014-12-09 10:18:12 -0800232 void addVarying(
joshualitta5305a12014-10-10 17:47:00 -0700233 const char* name,
joshualitt74077b92014-10-24 11:26:03 -0700234 GrGLVarying*,
bsalomonc0bd6482014-12-09 10:04:14 -0800235 GrSLPrecision fsPrecision = kDefault_GrSLPrecision) SK_OVERRIDE;
joshualitt30ba4362014-08-21 20:18:45 -0700236
bsalomon422f56f2014-12-09 10:18:12 -0800237 void addPassThroughAttribute(const GrGeometryProcessor::GrAttribute*,
joshualitt2dd1ae02014-12-03 06:24:10 -0800238 const char* output) SK_OVERRIDE;
239
240
joshualitt30ba4362014-08-21 20:18:45 -0700241 // Handles for program uniforms (other than per-effect uniforms)
242 struct BuiltinUniformHandles {
243 UniformHandle fViewMatrixUni;
244 UniformHandle fRTAdjustmentUni;
joshualitt30ba4362014-08-21 20:18:45 -0700245
246 // We use the render target height to provide a y-down frag coord when specifying
247 // origin_upper_left is not supported.
248 UniformHandle fRTHeightUni;
249
250 // Uniforms for computing texture coords to do the dst-copy lookup
251 UniformHandle fDstCopyTopLeftUni;
252 UniformHandle fDstCopyScaleUni;
253 UniformHandle fDstCopySamplerUni;
254 };
255
joshualittdb0d3ca2014-10-07 12:42:26 -0700256protected:
joshualitta5305a12014-10-10 17:47:00 -0700257 typedef GrGLProgramDataManager::UniformInfo UniformInfo;
258 typedef GrGLProgramDataManager::UniformInfoArray UniformInfoArray;
259
joshualitt79f8fae2014-10-28 17:59:26 -0700260 static GrGLProgramBuilder* CreateProgramBuilder(const GrOptDrawState&,
joshualitt47bb3822014-10-07 16:43:25 -0700261 bool hasGeometryProcessor,
bsalomon861e1032014-12-16 07:33:49 -0800262 GrGLGpu*);
joshualitt47bb3822014-10-07 16:43:25 -0700263
bsalomon861e1032014-12-16 07:33:49 -0800264 GrGLProgramBuilder(GrGLGpu*, const GrOptDrawState&);
joshualitt30ba4362014-08-21 20:18:45 -0700265
egdaniel307796b2014-10-06 12:13:54 -0700266 const GrOptDrawState& optState() const { return fOptState; }
joshualitt79f8fae2014-10-28 17:59:26 -0700267 const GrProgramDesc& desc() const { return fDesc; }
268 const GrProgramDesc::KeyHeader& header() const { return fDesc.header(); }
joshualitt23e280d2014-09-18 12:26:38 -0700269
joshualitt30ba4362014-08-21 20:18:45 -0700270 // Generates a name for a variable. The generated string will be name prefixed by the prefix
271 // char (unless the prefix is '\0'). It also mangles the name to be stage-specific if we're
272 // generating stage code.
273 void nameVariable(SkString* out, char prefix, const char* name);
joshualitt2dd1ae02014-12-03 06:24:10 -0800274 // Generates a possibly mangled name for a stage variable and writes it to the fragment shader.
275 // If GrGLSLExpr4 has a valid name then it will use that instead
276 void nameExpression(GrGLSLExpr4*, const char* baseName);
joshualitt4973d9d2014-11-08 09:24:25 -0800277 void emitAndInstallProcs(GrGLSLExpr4* inputColor,
joshualitta5305a12014-10-10 17:47:00 -0700278 GrGLSLExpr4* inputCoverage);
279 void emitAndInstallFragProcs(int procOffset, int numProcs, GrGLSLExpr4* inOut);
joshualitt2dd1ae02014-12-03 06:24:10 -0800280 void emitAndInstallProc(const GrPendingFragmentStage&,
joshualitta5305a12014-10-10 17:47:00 -0700281 int index,
joshualitta5305a12014-10-10 17:47:00 -0700282 const GrGLSLExpr4& input,
283 GrGLSLExpr4* output);
284
joshualitt9b989322014-12-15 14:16:27 -0800285 void emitAndInstallProc(const GrPrimitiveProcessor&,
joshualitt2dd1ae02014-12-03 06:24:10 -0800286 GrGLSLExpr4* outputColor,
287 GrGLSLExpr4* outputCoverage);
288
joshualitta5305a12014-10-10 17:47:00 -0700289 // these emit functions help to keep the createAndEmitProcessors template general
bsalomonae59b772014-11-19 08:23:49 -0800290 void emitAndInstallProc(const GrPendingFragmentStage&,
joshualitta5305a12014-10-10 17:47:00 -0700291 const char* outColor,
292 const char* inColor);
joshualitt9b989322014-12-15 14:16:27 -0800293 void emitAndInstallProc(const GrPrimitiveProcessor&,
joshualitt2dd1ae02014-12-03 06:24:10 -0800294 const char* outColor,
295 const char* outCoverage);
egdanielc2304142014-12-11 13:15:13 -0800296 void emitAndInstallXferProc(const GrXferProcessor&,
297 const GrGLSLExpr4& colorIn,
298 const GrGLSLExpr4& coverageIn);
joshualitt2dd1ae02014-12-03 06:24:10 -0800299
joshualitt9b989322014-12-15 14:16:27 -0800300 void verify(const GrPrimitiveProcessor&);
egdanielc2304142014-12-11 13:15:13 -0800301 void verify(const GrXferProcessor&);
joshualitt47bb3822014-10-07 16:43:25 -0700302 void verify(const GrFragmentProcessor&);
303 void emitSamplers(const GrProcessor&,
304 GrGLProcessor::TextureSamplerArray* outSamplers,
joshualitta5305a12014-10-10 17:47:00 -0700305 GrGLInstalledProc*);
joshualitt30ba4362014-08-21 20:18:45 -0700306
joshualitt47bb3822014-10-07 16:43:25 -0700307 // each specific program builder has a distinct transform and must override this function
bsalomonae59b772014-11-19 08:23:49 -0800308 virtual void emitTransforms(const GrPendingFragmentStage&,
joshualitt47bb3822014-10-07 16:43:25 -0700309 GrGLProcessor::TransformedCoordsArray* outCoords,
joshualitta5305a12014-10-10 17:47:00 -0700310 GrGLInstalledFragProc*);
joshualitt47bb3822014-10-07 16:43:25 -0700311 GrGLProgram* finalize();
312 void bindUniformLocations(GrGLuint programID);
313 bool checkLinkStatus(GrGLuint programID);
314 void resolveUniformLocations(GrGLuint programID);
joshualitt47bb3822014-10-07 16:43:25 -0700315 void cleanupProgram(GrGLuint programID, const SkTDArray<GrGLuint>& shaderIDs);
316 void cleanupShaders(const SkTDArray<GrGLuint>& shaderIDs);
joshualitt30ba4362014-08-21 20:18:45 -0700317
joshualitt47bb3822014-10-07 16:43:25 -0700318 // Subclasses create different programs
319 virtual GrGLProgram* createProgram(GrGLuint programID);
320
joshualitt30ba4362014-08-21 20:18:45 -0700321 void appendUniformDecls(ShaderVisibility, SkString*) const;
322
joshualitt47bb3822014-10-07 16:43:25 -0700323 // reset is called by program creator between each processor's emit code. It increments the
324 // stage offset for variable name mangling, and also ensures verfication variables in the
325 // fragment shader are cleared.
326 void reset() {
327 this->enterStage();
328 this->addStage();
329 fFS.reset();
330 }
331 void addStage() { fStageIndex++; }
332
333 // This simple class exits the stage and then restores the stage when it goes out of scope
334 class AutoStageRestore {
joshualitt30ba4362014-08-21 20:18:45 -0700335 public:
joshualitt47bb3822014-10-07 16:43:25 -0700336 AutoStageRestore(GrGLProgramBuilder* pb)
337 : fPB(pb), fOutOfStage(pb->fOutOfStage) { pb->exitStage(); }
338 ~AutoStageRestore() { fPB->fOutOfStage = fOutOfStage; }
joshualittb0a8a372014-09-23 09:50:21 -0700339 private:
joshualitt47bb3822014-10-07 16:43:25 -0700340 GrGLProgramBuilder* fPB;
341 bool fOutOfStage;
joshualittb0a8a372014-09-23 09:50:21 -0700342 };
joshualitt47bb3822014-10-07 16:43:25 -0700343 class AutoStageAdvance {
joshualittdb0d3ca2014-10-07 12:42:26 -0700344 public:
joshualitt47bb3822014-10-07 16:43:25 -0700345 AutoStageAdvance(GrGLProgramBuilder* pb) : fPB(pb) { fPB->reset(); }
346 ~AutoStageAdvance() { fPB->exitStage(); }
joshualittdb0d3ca2014-10-07 12:42:26 -0700347 private:
joshualitt47bb3822014-10-07 16:43:25 -0700348 GrGLProgramBuilder* fPB;
349 };
350 void exitStage() { fOutOfStage = true; }
351 void enterStage() { fOutOfStage = false; }
352 int stageIndex() const { return fStageIndex; }
353
joshualitt4973d9d2014-11-08 09:24:25 -0800354 struct TransformVarying {
355 TransformVarying(const GrGLVarying& v, const char* uniName, const char* sourceCoords)
356 : fV(v), fUniName(uniName), fSourceCoords(sourceCoords) {}
357 GrGLVarying fV;
358 SkString fUniName;
359 SkString fSourceCoords;
360 };
361
joshualitt4973d9d2014-11-08 09:24:25 -0800362 const char* rtAdjustment() const { return "rtAdjustment"; }
363
joshualitt47bb3822014-10-07 16:43:25 -0700364 // number of each input/output type in a single allocation block, used by many builders
365 static const int kVarsPerBlock;
366
367 BuiltinUniformHandles fUniformHandles;
368 GrGLVertexBuilder fVS;
369 GrGLGeometryBuilder fGS;
370 GrGLFragmentShaderBuilder fFS;
371 bool fOutOfStage;
372 int fStageIndex;
373
joshualitta5305a12014-10-10 17:47:00 -0700374 GrGLInstalledGeoProc* fGeometryProcessor;
egdanielc2304142014-12-11 13:15:13 -0800375 GrGLInstalledXferProc* fXferProcessor;
joshualitta5305a12014-10-10 17:47:00 -0700376 SkAutoTUnref<GrGLInstalledFragProcs> fFragmentProcessors;
joshualitt47bb3822014-10-07 16:43:25 -0700377
378 const GrOptDrawState& fOptState;
joshualitt79f8fae2014-10-28 17:59:26 -0700379 const GrProgramDesc& fDesc;
bsalomon861e1032014-12-16 07:33:49 -0800380 GrGLGpu* fGpu;
joshualitt47bb3822014-10-07 16:43:25 -0700381 UniformInfoArray fUniforms;
joshualitt4973d9d2014-11-08 09:24:25 -0800382 SkSTArray<16, TransformVarying, true> fCoordVaryings;
joshualitt47bb3822014-10-07 16:43:25 -0700383
384 friend class GrGLShaderBuilder;
385 friend class GrGLVertexBuilder;
386 friend class GrGLFragmentShaderBuilder;
387 friend class GrGLGeometryBuilder;
388};
389
390/**
joshualitta5305a12014-10-10 17:47:00 -0700391 * The below structs represent processors installed in programs. All processors can have texture
392 * samplers, but only frag processors have coord transforms, hence the need for different structs
joshualitt47bb3822014-10-07 16:43:25 -0700393 */
joshualitta5305a12014-10-10 17:47:00 -0700394struct GrGLInstalledProc {
395 typedef GrGLProgramDataManager::UniformHandle UniformHandle;
joshualitt47bb3822014-10-07 16:43:25 -0700396
joshualitta5305a12014-10-10 17:47:00 -0700397 struct Sampler {
398 SkDEBUGCODE(Sampler() : fTextureUnit(-1) {})
399 UniformHandle fUniform;
400 int fTextureUnit;
401 };
402 SkSTArray<4, Sampler, true> fSamplers;
403};
joshualitt47bb3822014-10-07 16:43:25 -0700404
joshualitta5305a12014-10-10 17:47:00 -0700405struct GrGLInstalledGeoProc : public GrGLInstalledProc {
406 SkAutoTDelete<GrGLGeometryProcessor> fGLProc;
407};
joshualitt47bb3822014-10-07 16:43:25 -0700408
egdanielc2304142014-12-11 13:15:13 -0800409struct GrGLInstalledXferProc : public GrGLInstalledProc {
410 SkAutoTDelete<GrGLXferProcessor> fGLProc;
411};
412
joshualitta5305a12014-10-10 17:47:00 -0700413struct GrGLInstalledFragProc : public GrGLInstalledProc {
joshualitt2dd1ae02014-12-03 06:24:10 -0800414 GrGLInstalledFragProc() : fGLProc(NULL) {}
joshualitt47bb3822014-10-07 16:43:25 -0700415 class ShaderVarHandle {
416 public:
417 bool isValid() const { return fHandle > -1; }
418 ShaderVarHandle() : fHandle(-1) {}
419 ShaderVarHandle(int value) : fHandle(value) { SkASSERT(this->isValid()); }
420 int handle() const { SkASSERT(this->isValid()); return fHandle; }
421 UniformHandle convertToUniformHandle() {
422 SkASSERT(this->isValid());
423 return GrGLProgramDataManager::UniformHandle::CreateFromUniformIndex(fHandle);
424 }
joshualittdb0d3ca2014-10-07 12:42:26 -0700425
joshualitt47bb3822014-10-07 16:43:25 -0700426 private:
427 int fHandle;
428 };
joshualittdb0d3ca2014-10-07 12:42:26 -0700429
joshualitt47bb3822014-10-07 16:43:25 -0700430 struct Transform {
431 Transform() : fType(kVoid_GrSLType) { fCurrentValue = SkMatrix::InvalidMatrix(); }
432 ShaderVarHandle fHandle;
433 SkMatrix fCurrentValue;
434 GrSLType fType;
435 };
joshualittdb0d3ca2014-10-07 12:42:26 -0700436
joshualitta5305a12014-10-10 17:47:00 -0700437 SkAutoTDelete<GrGLFragmentProcessor> fGLProc;
438 SkSTArray<2, Transform, true> fTransforms;
joshualitta5305a12014-10-10 17:47:00 -0700439};
joshualittdb0d3ca2014-10-07 12:42:26 -0700440
joshualitta5305a12014-10-10 17:47:00 -0700441struct GrGLInstalledFragProcs : public SkRefCnt {
442 virtual ~GrGLInstalledFragProcs();
443 SkSTArray<8, GrGLInstalledFragProc*, true> fProcs;
joshualitt30ba4362014-08-21 20:18:45 -0700444};
445
joshualitt30ba4362014-08-21 20:18:45 -0700446#endif