blob: 69eed27252f9c37cad2588988d6a688659e0d878 [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
74 virtual GrGpuGL* gpu() const = 0;
75
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 */
joshualittdafa4d02014-12-04 08:59:10 -0800208 static GrGLProgram* CreateProgram(const GrOptDrawState&, GrGpuGL*);
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
bsalomon422f56f2014-12-09 10:18:12 -0800227 GrGpuGL* 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;
245 UniformHandle fColorUni;
246 UniformHandle fCoverageUni;
247
248 // We use the render target height to provide a y-down frag coord when specifying
249 // origin_upper_left is not supported.
250 UniformHandle fRTHeightUni;
251
252 // Uniforms for computing texture coords to do the dst-copy lookup
253 UniformHandle fDstCopyTopLeftUni;
254 UniformHandle fDstCopyScaleUni;
255 UniformHandle fDstCopySamplerUni;
256 };
257
joshualittdb0d3ca2014-10-07 12:42:26 -0700258protected:
joshualitta5305a12014-10-10 17:47:00 -0700259 typedef GrGLProgramDataManager::UniformInfo UniformInfo;
260 typedef GrGLProgramDataManager::UniformInfoArray UniformInfoArray;
261
joshualitt79f8fae2014-10-28 17:59:26 -0700262 static GrGLProgramBuilder* CreateProgramBuilder(const GrOptDrawState&,
joshualitt47bb3822014-10-07 16:43:25 -0700263 bool hasGeometryProcessor,
264 GrGpuGL*);
265
joshualitt79f8fae2014-10-28 17:59:26 -0700266 GrGLProgramBuilder(GrGpuGL*, const GrOptDrawState&);
joshualitt30ba4362014-08-21 20:18:45 -0700267
egdaniel307796b2014-10-06 12:13:54 -0700268 const GrOptDrawState& optState() const { return fOptState; }
joshualitt79f8fae2014-10-28 17:59:26 -0700269 const GrProgramDesc& desc() const { return fDesc; }
270 const GrProgramDesc::KeyHeader& header() const { return fDesc.header(); }
joshualitt23e280d2014-09-18 12:26:38 -0700271
joshualitt30ba4362014-08-21 20:18:45 -0700272 // Generates a name for a variable. The generated string will be name prefixed by the prefix
273 // char (unless the prefix is '\0'). It also mangles the name to be stage-specific if we're
274 // generating stage code.
275 void nameVariable(SkString* out, char prefix, const char* name);
egdaniel37b4d862014-11-03 10:07:07 -0800276 void setupUniformColorAndCoverageIfNeeded(GrGLSLExpr4* inputColor, GrGLSLExpr1* inputCoverage);
joshualitt2dd1ae02014-12-03 06:24:10 -0800277 // Generates a possibly mangled name for a stage variable and writes it to the fragment shader.
278 // If GrGLSLExpr4 has a valid name then it will use that instead
279 void nameExpression(GrGLSLExpr4*, const char* baseName);
joshualitt4973d9d2014-11-08 09:24:25 -0800280 void emitAndInstallProcs(GrGLSLExpr4* inputColor,
joshualitta5305a12014-10-10 17:47:00 -0700281 GrGLSLExpr4* inputCoverage);
282 void emitAndInstallFragProcs(int procOffset, int numProcs, GrGLSLExpr4* inOut);
joshualitt2dd1ae02014-12-03 06:24:10 -0800283 void emitAndInstallProc(const GrPendingFragmentStage&,
joshualitta5305a12014-10-10 17:47:00 -0700284 int index,
joshualitta5305a12014-10-10 17:47:00 -0700285 const GrGLSLExpr4& input,
286 GrGLSLExpr4* output);
287
joshualitt2dd1ae02014-12-03 06:24:10 -0800288 void emitAndInstallProc(const GrGeometryProcessor&,
289 GrGLSLExpr4* outputColor,
290 GrGLSLExpr4* outputCoverage);
291
joshualitta5305a12014-10-10 17:47:00 -0700292 // these emit functions help to keep the createAndEmitProcessors template general
bsalomonae59b772014-11-19 08:23:49 -0800293 void emitAndInstallProc(const GrPendingFragmentStage&,
joshualitta5305a12014-10-10 17:47:00 -0700294 const char* outColor,
295 const char* inColor);
296 void emitAndInstallProc(const GrGeometryProcessor&,
joshualitt2dd1ae02014-12-03 06:24:10 -0800297 const char* outColor,
298 const char* outCoverage);
egdanielc2304142014-12-11 13:15:13 -0800299 void emitAndInstallXferProc(const GrXferProcessor&,
300 const GrGLSLExpr4& colorIn,
301 const GrGLSLExpr4& coverageIn);
joshualitt2dd1ae02014-12-03 06:24:10 -0800302
joshualitt47bb3822014-10-07 16:43:25 -0700303 void verify(const GrGeometryProcessor&);
egdanielc2304142014-12-11 13:15:13 -0800304 void verify(const GrXferProcessor&);
joshualitt47bb3822014-10-07 16:43:25 -0700305 void verify(const GrFragmentProcessor&);
306 void emitSamplers(const GrProcessor&,
307 GrGLProcessor::TextureSamplerArray* outSamplers,
joshualitta5305a12014-10-10 17:47:00 -0700308 GrGLInstalledProc*);
joshualitt30ba4362014-08-21 20:18:45 -0700309
joshualitt47bb3822014-10-07 16:43:25 -0700310 // each specific program builder has a distinct transform and must override this function
bsalomonae59b772014-11-19 08:23:49 -0800311 virtual void emitTransforms(const GrPendingFragmentStage&,
joshualitt47bb3822014-10-07 16:43:25 -0700312 GrGLProcessor::TransformedCoordsArray* outCoords,
joshualitta5305a12014-10-10 17:47:00 -0700313 GrGLInstalledFragProc*);
joshualitt47bb3822014-10-07 16:43:25 -0700314 GrGLProgram* finalize();
315 void bindUniformLocations(GrGLuint programID);
316 bool checkLinkStatus(GrGLuint programID);
317 void resolveUniformLocations(GrGLuint programID);
joshualitt47bb3822014-10-07 16:43:25 -0700318 void cleanupProgram(GrGLuint programID, const SkTDArray<GrGLuint>& shaderIDs);
319 void cleanupShaders(const SkTDArray<GrGLuint>& shaderIDs);
joshualitt30ba4362014-08-21 20:18:45 -0700320
joshualitt47bb3822014-10-07 16:43:25 -0700321 // Subclasses create different programs
322 virtual GrGLProgram* createProgram(GrGLuint programID);
323
joshualitt30ba4362014-08-21 20:18:45 -0700324 void appendUniformDecls(ShaderVisibility, SkString*) const;
325
joshualitt47bb3822014-10-07 16:43:25 -0700326 // reset is called by program creator between each processor's emit code. It increments the
327 // stage offset for variable name mangling, and also ensures verfication variables in the
328 // fragment shader are cleared.
329 void reset() {
330 this->enterStage();
331 this->addStage();
332 fFS.reset();
333 }
334 void addStage() { fStageIndex++; }
335
336 // This simple class exits the stage and then restores the stage when it goes out of scope
337 class AutoStageRestore {
joshualitt30ba4362014-08-21 20:18:45 -0700338 public:
joshualitt47bb3822014-10-07 16:43:25 -0700339 AutoStageRestore(GrGLProgramBuilder* pb)
340 : fPB(pb), fOutOfStage(pb->fOutOfStage) { pb->exitStage(); }
341 ~AutoStageRestore() { fPB->fOutOfStage = fOutOfStage; }
joshualittb0a8a372014-09-23 09:50:21 -0700342 private:
joshualitt47bb3822014-10-07 16:43:25 -0700343 GrGLProgramBuilder* fPB;
344 bool fOutOfStage;
joshualittb0a8a372014-09-23 09:50:21 -0700345 };
joshualitt47bb3822014-10-07 16:43:25 -0700346 class AutoStageAdvance {
joshualittdb0d3ca2014-10-07 12:42:26 -0700347 public:
joshualitt47bb3822014-10-07 16:43:25 -0700348 AutoStageAdvance(GrGLProgramBuilder* pb) : fPB(pb) { fPB->reset(); }
349 ~AutoStageAdvance() { fPB->exitStage(); }
joshualittdb0d3ca2014-10-07 12:42:26 -0700350 private:
joshualitt47bb3822014-10-07 16:43:25 -0700351 GrGLProgramBuilder* fPB;
352 };
353 void exitStage() { fOutOfStage = true; }
354 void enterStage() { fOutOfStage = false; }
355 int stageIndex() const { return fStageIndex; }
356
joshualitt4973d9d2014-11-08 09:24:25 -0800357 struct TransformVarying {
358 TransformVarying(const GrGLVarying& v, const char* uniName, const char* sourceCoords)
359 : fV(v), fUniName(uniName), fSourceCoords(sourceCoords) {}
360 GrGLVarying fV;
361 SkString fUniName;
362 SkString fSourceCoords;
363 };
364
joshualitt4973d9d2014-11-08 09:24:25 -0800365 const char* rtAdjustment() const { return "rtAdjustment"; }
366
joshualitt47bb3822014-10-07 16:43:25 -0700367 // number of each input/output type in a single allocation block, used by many builders
368 static const int kVarsPerBlock;
369
370 BuiltinUniformHandles fUniformHandles;
371 GrGLVertexBuilder fVS;
372 GrGLGeometryBuilder fGS;
373 GrGLFragmentShaderBuilder fFS;
374 bool fOutOfStage;
375 int fStageIndex;
376
joshualitta5305a12014-10-10 17:47:00 -0700377 GrGLInstalledGeoProc* fGeometryProcessor;
egdanielc2304142014-12-11 13:15:13 -0800378 GrGLInstalledXferProc* fXferProcessor;
joshualitta5305a12014-10-10 17:47:00 -0700379 SkAutoTUnref<GrGLInstalledFragProcs> fFragmentProcessors;
joshualitt47bb3822014-10-07 16:43:25 -0700380
381 const GrOptDrawState& fOptState;
joshualitt79f8fae2014-10-28 17:59:26 -0700382 const GrProgramDesc& fDesc;
joshualitt47bb3822014-10-07 16:43:25 -0700383 GrGpuGL* fGpu;
384 UniformInfoArray fUniforms;
joshualitt4973d9d2014-11-08 09:24:25 -0800385 SkSTArray<16, TransformVarying, true> fCoordVaryings;
joshualitt47bb3822014-10-07 16:43:25 -0700386
387 friend class GrGLShaderBuilder;
388 friend class GrGLVertexBuilder;
389 friend class GrGLFragmentShaderBuilder;
390 friend class GrGLGeometryBuilder;
391};
392
393/**
joshualitta5305a12014-10-10 17:47:00 -0700394 * The below structs represent processors installed in programs. All processors can have texture
395 * samplers, but only frag processors have coord transforms, hence the need for different structs
joshualitt47bb3822014-10-07 16:43:25 -0700396 */
joshualitta5305a12014-10-10 17:47:00 -0700397struct GrGLInstalledProc {
398 typedef GrGLProgramDataManager::UniformHandle UniformHandle;
joshualitt47bb3822014-10-07 16:43:25 -0700399
joshualitta5305a12014-10-10 17:47:00 -0700400 struct Sampler {
401 SkDEBUGCODE(Sampler() : fTextureUnit(-1) {})
402 UniformHandle fUniform;
403 int fTextureUnit;
404 };
405 SkSTArray<4, Sampler, true> fSamplers;
406};
joshualitt47bb3822014-10-07 16:43:25 -0700407
joshualitta5305a12014-10-10 17:47:00 -0700408struct GrGLInstalledGeoProc : public GrGLInstalledProc {
409 SkAutoTDelete<GrGLGeometryProcessor> fGLProc;
410};
joshualitt47bb3822014-10-07 16:43:25 -0700411
egdanielc2304142014-12-11 13:15:13 -0800412struct GrGLInstalledXferProc : public GrGLInstalledProc {
413 SkAutoTDelete<GrGLXferProcessor> fGLProc;
414};
415
joshualitta5305a12014-10-10 17:47:00 -0700416struct GrGLInstalledFragProc : public GrGLInstalledProc {
joshualitt2dd1ae02014-12-03 06:24:10 -0800417 GrGLInstalledFragProc() : fGLProc(NULL) {}
joshualitt47bb3822014-10-07 16:43:25 -0700418 class ShaderVarHandle {
419 public:
420 bool isValid() const { return fHandle > -1; }
421 ShaderVarHandle() : fHandle(-1) {}
422 ShaderVarHandle(int value) : fHandle(value) { SkASSERT(this->isValid()); }
423 int handle() const { SkASSERT(this->isValid()); return fHandle; }
424 UniformHandle convertToUniformHandle() {
425 SkASSERT(this->isValid());
426 return GrGLProgramDataManager::UniformHandle::CreateFromUniformIndex(fHandle);
427 }
joshualittdb0d3ca2014-10-07 12:42:26 -0700428
joshualitt47bb3822014-10-07 16:43:25 -0700429 private:
430 int fHandle;
431 };
joshualittdb0d3ca2014-10-07 12:42:26 -0700432
joshualitt47bb3822014-10-07 16:43:25 -0700433 struct Transform {
434 Transform() : fType(kVoid_GrSLType) { fCurrentValue = SkMatrix::InvalidMatrix(); }
435 ShaderVarHandle fHandle;
436 SkMatrix fCurrentValue;
437 GrSLType fType;
438 };
joshualittdb0d3ca2014-10-07 12:42:26 -0700439
joshualitta5305a12014-10-10 17:47:00 -0700440 SkAutoTDelete<GrGLFragmentProcessor> fGLProc;
441 SkSTArray<2, Transform, true> fTransforms;
joshualitta5305a12014-10-10 17:47:00 -0700442};
joshualittdb0d3ca2014-10-07 12:42:26 -0700443
joshualitta5305a12014-10-10 17:47:00 -0700444struct GrGLInstalledFragProcs : public SkRefCnt {
445 virtual ~GrGLInstalledFragProcs();
446 SkSTArray<8, GrGLInstalledFragProc*, true> fProcs;
joshualitt30ba4362014-08-21 20:18:45 -0700447};
448
joshualitt30ba4362014-08-21 20:18:45 -0700449#endif