1249af15fb82833d2274850c589812b6e69df0033joshualitt/*
2249af15fb82833d2274850c589812b6e69df0033joshualitt * Copyright 2014 Google Inc.
3249af15fb82833d2274850c589812b6e69df0033joshualitt *
4249af15fb82833d2274850c589812b6e69df0033joshualitt * Use of this source code is governed by a BSD-style license that can be
5249af15fb82833d2274850c589812b6e69df0033joshualitt * found in the LICENSE file.
6249af15fb82833d2274850c589812b6e69df0033joshualitt */
7249af15fb82833d2274850c589812b6e69df0033joshualitt
8249af15fb82833d2274850c589812b6e69df0033joshualitt#ifndef GrShaderVar_DEFINED
9249af15fb82833d2274850c589812b6e69df0033joshualitt#define GrShaderVar_DEFINED
10249af15fb82833d2274850c589812b6e69df0033joshualitt
11249af15fb82833d2274850c589812b6e69df0033joshualitt#include "GrTypesPriv.h"
12249af15fb82833d2274850c589812b6e69df0033joshualitt#include "SkString.h"
13249af15fb82833d2274850c589812b6e69df0033joshualitt
14249af15fb82833d2274850c589812b6e69df0033joshualittclass GrShaderVar {
15249af15fb82833d2274850c589812b6e69df0033joshualittpublic:
16249af15fb82833d2274850c589812b6e69df0033joshualitt    /**
17249af15fb82833d2274850c589812b6e69df0033joshualitt     * Early versions of GLSL have Varying and Attribute; those are later
18249af15fb82833d2274850c589812b6e69df0033joshualitt     * deprecated, but we still need to know whether a Varying variable
19249af15fb82833d2274850c589812b6e69df0033joshualitt     * should be treated as In or Out.
20249af15fb82833d2274850c589812b6e69df0033joshualitt     *
21249af15fb82833d2274850c589812b6e69df0033joshualitt     * TODO This really shouldn't live here, but until we have c++11, there is really no good way
22249af15fb82833d2274850c589812b6e69df0033joshualitt     * to write extensible enums.  In reality, only none, out, in, inout, and uniform really
23249af15fb82833d2274850c589812b6e69df0033joshualitt     * make sense on this base class
24249af15fb82833d2274850c589812b6e69df0033joshualitt     */
25249af15fb82833d2274850c589812b6e69df0033joshualitt    enum TypeModifier {
26249af15fb82833d2274850c589812b6e69df0033joshualitt        kNone_TypeModifier,
27249af15fb82833d2274850c589812b6e69df0033joshualitt        kOut_TypeModifier,
28249af15fb82833d2274850c589812b6e69df0033joshualitt        kIn_TypeModifier,
29249af15fb82833d2274850c589812b6e69df0033joshualitt        kInOut_TypeModifier,
30249af15fb82833d2274850c589812b6e69df0033joshualitt        kUniform_TypeModifier,
31249af15fb82833d2274850c589812b6e69df0033joshualitt        // GL Specific types below
32249af15fb82833d2274850c589812b6e69df0033joshualitt        kAttribute_TypeModifier,
33249af15fb82833d2274850c589812b6e69df0033joshualitt        kVaryingIn_TypeModifier,
34249af15fb82833d2274850c589812b6e69df0033joshualitt        kVaryingOut_TypeModifier
35249af15fb82833d2274850c589812b6e69df0033joshualitt    };
36249af15fb82833d2274850c589812b6e69df0033joshualitt
37249af15fb82833d2274850c589812b6e69df0033joshualitt    enum Precision {
38249af15fb82833d2274850c589812b6e69df0033joshualitt        kLow_Precision,         // lowp
39249af15fb82833d2274850c589812b6e69df0033joshualitt        kMedium_Precision,      // mediump
40249af15fb82833d2274850c589812b6e69df0033joshualitt        kHigh_Precision,        // highp
41249af15fb82833d2274850c589812b6e69df0033joshualitt        kDefault_Precision,     // Default for the current context. We make
42249af15fb82833d2274850c589812b6e69df0033joshualitt                                // fragment shaders default to mediump on ES2
43249af15fb82833d2274850c589812b6e69df0033joshualitt                                // because highp support is not guaranteed (and
44249af15fb82833d2274850c589812b6e69df0033joshualitt                                // we haven't been motivated to test for it).
45249af15fb82833d2274850c589812b6e69df0033joshualitt                                // Otherwise, highp.
46249af15fb82833d2274850c589812b6e69df0033joshualitt    };
47249af15fb82833d2274850c589812b6e69df0033joshualitt
48249af15fb82833d2274850c589812b6e69df0033joshualitt    /**
49249af15fb82833d2274850c589812b6e69df0033joshualitt     * Defaults to a float with no precision specifier
50249af15fb82833d2274850c589812b6e69df0033joshualitt     */
51249af15fb82833d2274850c589812b6e69df0033joshualitt    GrShaderVar()
52249af15fb82833d2274850c589812b6e69df0033joshualitt        : fType(kFloat_GrSLType)
53249af15fb82833d2274850c589812b6e69df0033joshualitt        , fTypeModifier(kNone_TypeModifier)
54249af15fb82833d2274850c589812b6e69df0033joshualitt        , fCount(kNonArray)
55249af15fb82833d2274850c589812b6e69df0033joshualitt        , fPrecision(kDefault_Precision) {
56249af15fb82833d2274850c589812b6e69df0033joshualitt    }
57249af15fb82833d2274850c589812b6e69df0033joshualitt
5823e280d1f227d94f6b3dfd0b47359cca1569e1b4joshualitt    GrShaderVar(const SkString& name, GrSLType type, int arrayCount = kNonArray,
5923e280d1f227d94f6b3dfd0b47359cca1569e1b4joshualitt                Precision precision = kDefault_Precision)
6023e280d1f227d94f6b3dfd0b47359cca1569e1b4joshualitt        : fType(type)
6123e280d1f227d94f6b3dfd0b47359cca1569e1b4joshualitt        , fTypeModifier(kNone_TypeModifier)
6223e280d1f227d94f6b3dfd0b47359cca1569e1b4joshualitt        , fName(name)
6323e280d1f227d94f6b3dfd0b47359cca1569e1b4joshualitt        , fCount(arrayCount)
6423e280d1f227d94f6b3dfd0b47359cca1569e1b4joshualitt        , fPrecision(precision) {
6523e280d1f227d94f6b3dfd0b47359cca1569e1b4joshualitt        SkASSERT(kVoid_GrSLType != type);
6623e280d1f227d94f6b3dfd0b47359cca1569e1b4joshualitt    }
6723e280d1f227d94f6b3dfd0b47359cca1569e1b4joshualitt
68249af15fb82833d2274850c589812b6e69df0033joshualitt    GrShaderVar(const char* name, GrSLType type, int arrayCount = kNonArray,
69249af15fb82833d2274850c589812b6e69df0033joshualitt                  Precision precision = kDefault_Precision)
70249af15fb82833d2274850c589812b6e69df0033joshualitt        : fType(type)
71249af15fb82833d2274850c589812b6e69df0033joshualitt        , fTypeModifier(kNone_TypeModifier)
72249af15fb82833d2274850c589812b6e69df0033joshualitt        , fName(name)
73249af15fb82833d2274850c589812b6e69df0033joshualitt        , fCount(arrayCount)
74249af15fb82833d2274850c589812b6e69df0033joshualitt        , fPrecision(precision) {
75249af15fb82833d2274850c589812b6e69df0033joshualitt        SkASSERT(kVoid_GrSLType != type);
76249af15fb82833d2274850c589812b6e69df0033joshualitt    }
77249af15fb82833d2274850c589812b6e69df0033joshualitt
78249af15fb82833d2274850c589812b6e69df0033joshualitt    GrShaderVar(const char* name, GrSLType type, TypeModifier typeModifier,
79249af15fb82833d2274850c589812b6e69df0033joshualitt                  int arrayCount = kNonArray, Precision precision = kDefault_Precision)
80249af15fb82833d2274850c589812b6e69df0033joshualitt        : fType(type)
81249af15fb82833d2274850c589812b6e69df0033joshualitt        , fTypeModifier(typeModifier)
82249af15fb82833d2274850c589812b6e69df0033joshualitt        , fName(name)
83249af15fb82833d2274850c589812b6e69df0033joshualitt        , fCount(arrayCount)
84249af15fb82833d2274850c589812b6e69df0033joshualitt        , fPrecision(precision) {
85249af15fb82833d2274850c589812b6e69df0033joshualitt        SkASSERT(kVoid_GrSLType != type);
86249af15fb82833d2274850c589812b6e69df0033joshualitt    }
87249af15fb82833d2274850c589812b6e69df0033joshualitt
88249af15fb82833d2274850c589812b6e69df0033joshualitt    /**
89249af15fb82833d2274850c589812b6e69df0033joshualitt     * Values for array count that have special meaning. We allow 1-sized arrays.
90249af15fb82833d2274850c589812b6e69df0033joshualitt     */
91249af15fb82833d2274850c589812b6e69df0033joshualitt    enum {
92249af15fb82833d2274850c589812b6e69df0033joshualitt        kNonArray     =  0, // not an array
93249af15fb82833d2274850c589812b6e69df0033joshualitt        kUnsizedArray = -1, // an unsized array (declared with [])
94249af15fb82833d2274850c589812b6e69df0033joshualitt    };
95249af15fb82833d2274850c589812b6e69df0033joshualitt
96249af15fb82833d2274850c589812b6e69df0033joshualitt    /**
97249af15fb82833d2274850c589812b6e69df0033joshualitt     * Sets as a non-array.
98249af15fb82833d2274850c589812b6e69df0033joshualitt     */
99249af15fb82833d2274850c589812b6e69df0033joshualitt    void set(GrSLType type,
100249af15fb82833d2274850c589812b6e69df0033joshualitt             TypeModifier typeModifier,
101249af15fb82833d2274850c589812b6e69df0033joshualitt             const SkString& name,
102249af15fb82833d2274850c589812b6e69df0033joshualitt             Precision precision = kDefault_Precision) {
103249af15fb82833d2274850c589812b6e69df0033joshualitt        SkASSERT(kVoid_GrSLType != type);
104249af15fb82833d2274850c589812b6e69df0033joshualitt        fType = type;
105249af15fb82833d2274850c589812b6e69df0033joshualitt        fTypeModifier = typeModifier;
106249af15fb82833d2274850c589812b6e69df0033joshualitt        fName = name;
107249af15fb82833d2274850c589812b6e69df0033joshualitt        fCount = kNonArray;
108249af15fb82833d2274850c589812b6e69df0033joshualitt        fPrecision = precision;
109249af15fb82833d2274850c589812b6e69df0033joshualitt    }
110249af15fb82833d2274850c589812b6e69df0033joshualitt
111249af15fb82833d2274850c589812b6e69df0033joshualitt    /**
112249af15fb82833d2274850c589812b6e69df0033joshualitt     * Sets as a non-array.
113249af15fb82833d2274850c589812b6e69df0033joshualitt     */
114249af15fb82833d2274850c589812b6e69df0033joshualitt    void set(GrSLType type,
115249af15fb82833d2274850c589812b6e69df0033joshualitt             TypeModifier typeModifier,
116249af15fb82833d2274850c589812b6e69df0033joshualitt             const char* name,
117249af15fb82833d2274850c589812b6e69df0033joshualitt             Precision precision = kDefault_Precision) {
118249af15fb82833d2274850c589812b6e69df0033joshualitt        SkASSERT(kVoid_GrSLType != type);
119249af15fb82833d2274850c589812b6e69df0033joshualitt        fType = type;
120249af15fb82833d2274850c589812b6e69df0033joshualitt        fTypeModifier = typeModifier;
121249af15fb82833d2274850c589812b6e69df0033joshualitt        fName = name;
122249af15fb82833d2274850c589812b6e69df0033joshualitt        fCount = kNonArray;
123249af15fb82833d2274850c589812b6e69df0033joshualitt        fPrecision = precision;
124249af15fb82833d2274850c589812b6e69df0033joshualitt    }
125249af15fb82833d2274850c589812b6e69df0033joshualitt
126249af15fb82833d2274850c589812b6e69df0033joshualitt    /**
127249af15fb82833d2274850c589812b6e69df0033joshualitt     * Set all var options
128249af15fb82833d2274850c589812b6e69df0033joshualitt     */
129249af15fb82833d2274850c589812b6e69df0033joshualitt    void set(GrSLType type,
130249af15fb82833d2274850c589812b6e69df0033joshualitt             TypeModifier typeModifier,
131249af15fb82833d2274850c589812b6e69df0033joshualitt             const SkString& name,
132249af15fb82833d2274850c589812b6e69df0033joshualitt             int count,
133249af15fb82833d2274850c589812b6e69df0033joshualitt             Precision precision = kDefault_Precision) {
134249af15fb82833d2274850c589812b6e69df0033joshualitt        SkASSERT(kVoid_GrSLType != type);
135249af15fb82833d2274850c589812b6e69df0033joshualitt        fType = type;
136249af15fb82833d2274850c589812b6e69df0033joshualitt        fTypeModifier = typeModifier;
137249af15fb82833d2274850c589812b6e69df0033joshualitt        fName = name;
138249af15fb82833d2274850c589812b6e69df0033joshualitt        fCount = count;
139249af15fb82833d2274850c589812b6e69df0033joshualitt        fPrecision = precision;
140249af15fb82833d2274850c589812b6e69df0033joshualitt    }
141249af15fb82833d2274850c589812b6e69df0033joshualitt
142249af15fb82833d2274850c589812b6e69df0033joshualitt    /**
143249af15fb82833d2274850c589812b6e69df0033joshualitt     * Set all var options
144249af15fb82833d2274850c589812b6e69df0033joshualitt     */
145249af15fb82833d2274850c589812b6e69df0033joshualitt    void set(GrSLType type,
146249af15fb82833d2274850c589812b6e69df0033joshualitt             TypeModifier typeModifier,
147249af15fb82833d2274850c589812b6e69df0033joshualitt             const char* name,
148249af15fb82833d2274850c589812b6e69df0033joshualitt             int count,
149249af15fb82833d2274850c589812b6e69df0033joshualitt             Precision precision = kDefault_Precision) {
150249af15fb82833d2274850c589812b6e69df0033joshualitt        SkASSERT(kVoid_GrSLType != type);
151249af15fb82833d2274850c589812b6e69df0033joshualitt        fType = type;
152249af15fb82833d2274850c589812b6e69df0033joshualitt        fTypeModifier = typeModifier;
153249af15fb82833d2274850c589812b6e69df0033joshualitt        fName = name;
154249af15fb82833d2274850c589812b6e69df0033joshualitt        fCount = count;
155249af15fb82833d2274850c589812b6e69df0033joshualitt        fPrecision = precision;
156249af15fb82833d2274850c589812b6e69df0033joshualitt    }
157249af15fb82833d2274850c589812b6e69df0033joshualitt
158249af15fb82833d2274850c589812b6e69df0033joshualitt    /**
159249af15fb82833d2274850c589812b6e69df0033joshualitt     * Is the var an array.
160249af15fb82833d2274850c589812b6e69df0033joshualitt     */
161249af15fb82833d2274850c589812b6e69df0033joshualitt    bool isArray() const { return kNonArray != fCount; }
162249af15fb82833d2274850c589812b6e69df0033joshualitt    /**
163249af15fb82833d2274850c589812b6e69df0033joshualitt     * Is this an unsized array, (i.e. declared with []).
164249af15fb82833d2274850c589812b6e69df0033joshualitt     */
165249af15fb82833d2274850c589812b6e69df0033joshualitt    bool isUnsizedArray() const { return kUnsizedArray == fCount; }
166249af15fb82833d2274850c589812b6e69df0033joshualitt    /**
167249af15fb82833d2274850c589812b6e69df0033joshualitt     * Get the array length of the var.
168249af15fb82833d2274850c589812b6e69df0033joshualitt     */
169249af15fb82833d2274850c589812b6e69df0033joshualitt    int getArrayCount() const { return fCount; }
170249af15fb82833d2274850c589812b6e69df0033joshualitt    /**
171249af15fb82833d2274850c589812b6e69df0033joshualitt     * Set the array length of the var
172249af15fb82833d2274850c589812b6e69df0033joshualitt     */
173249af15fb82833d2274850c589812b6e69df0033joshualitt    void setArrayCount(int count) { fCount = count; }
174249af15fb82833d2274850c589812b6e69df0033joshualitt    /**
175249af15fb82833d2274850c589812b6e69df0033joshualitt     * Set to be a non-array.
176249af15fb82833d2274850c589812b6e69df0033joshualitt     */
177249af15fb82833d2274850c589812b6e69df0033joshualitt    void setNonArray() { fCount = kNonArray; }
178249af15fb82833d2274850c589812b6e69df0033joshualitt    /**
179249af15fb82833d2274850c589812b6e69df0033joshualitt     * Set to be an unsized array.
180249af15fb82833d2274850c589812b6e69df0033joshualitt     */
181249af15fb82833d2274850c589812b6e69df0033joshualitt    void setUnsizedArray() { fCount = kUnsizedArray; }
182249af15fb82833d2274850c589812b6e69df0033joshualitt
183249af15fb82833d2274850c589812b6e69df0033joshualitt    /**
184249af15fb82833d2274850c589812b6e69df0033joshualitt     * Access the var name as a writable string
185249af15fb82833d2274850c589812b6e69df0033joshualitt     */
186249af15fb82833d2274850c589812b6e69df0033joshualitt    SkString* accessName() { return &fName; }
187249af15fb82833d2274850c589812b6e69df0033joshualitt    /**
188249af15fb82833d2274850c589812b6e69df0033joshualitt     * Set the var name
189249af15fb82833d2274850c589812b6e69df0033joshualitt     */
190249af15fb82833d2274850c589812b6e69df0033joshualitt    void setName(const SkString& n) { fName = n; }
191249af15fb82833d2274850c589812b6e69df0033joshualitt    void setName(const char* n) { fName = n; }
192249af15fb82833d2274850c589812b6e69df0033joshualitt
193249af15fb82833d2274850c589812b6e69df0033joshualitt    /**
194249af15fb82833d2274850c589812b6e69df0033joshualitt     * Get the var name.
195249af15fb82833d2274850c589812b6e69df0033joshualitt     */
196249af15fb82833d2274850c589812b6e69df0033joshualitt    const SkString& getName() const { return fName; }
197249af15fb82833d2274850c589812b6e69df0033joshualitt
198249af15fb82833d2274850c589812b6e69df0033joshualitt    /**
199249af15fb82833d2274850c589812b6e69df0033joshualitt     * Shortcut for this->getName().c_str();
200249af15fb82833d2274850c589812b6e69df0033joshualitt     */
201249af15fb82833d2274850c589812b6e69df0033joshualitt    const char* c_str() const { return this->getName().c_str(); }
202249af15fb82833d2274850c589812b6e69df0033joshualitt
203249af15fb82833d2274850c589812b6e69df0033joshualitt    /**
204249af15fb82833d2274850c589812b6e69df0033joshualitt     * Get the type of the var
205249af15fb82833d2274850c589812b6e69df0033joshualitt     */
206249af15fb82833d2274850c589812b6e69df0033joshualitt    GrSLType getType() const { return fType; }
207249af15fb82833d2274850c589812b6e69df0033joshualitt    /**
208249af15fb82833d2274850c589812b6e69df0033joshualitt     * Set the type of the var
209249af15fb82833d2274850c589812b6e69df0033joshualitt     */
210249af15fb82833d2274850c589812b6e69df0033joshualitt    void setType(GrSLType type) { fType = type; }
211249af15fb82833d2274850c589812b6e69df0033joshualitt
212249af15fb82833d2274850c589812b6e69df0033joshualitt    TypeModifier getTypeModifier() const { return fTypeModifier; }
213249af15fb82833d2274850c589812b6e69df0033joshualitt    void setTypeModifier(TypeModifier type) { fTypeModifier = type; }
214249af15fb82833d2274850c589812b6e69df0033joshualitt
215249af15fb82833d2274850c589812b6e69df0033joshualitt    /**
216249af15fb82833d2274850c589812b6e69df0033joshualitt     * Get the precision of the var
217249af15fb82833d2274850c589812b6e69df0033joshualitt     */
218249af15fb82833d2274850c589812b6e69df0033joshualitt    Precision getPrecision() const { return fPrecision; }
219249af15fb82833d2274850c589812b6e69df0033joshualitt
220249af15fb82833d2274850c589812b6e69df0033joshualitt    /**
221249af15fb82833d2274850c589812b6e69df0033joshualitt     * Set the precision of the var
222249af15fb82833d2274850c589812b6e69df0033joshualitt     */
223249af15fb82833d2274850c589812b6e69df0033joshualitt    void setPrecision(Precision p) { fPrecision = p; }
224249af15fb82833d2274850c589812b6e69df0033joshualitt
225249af15fb82833d2274850c589812b6e69df0033joshualittprotected:
226249af15fb82833d2274850c589812b6e69df0033joshualitt    GrSLType        fType;
227249af15fb82833d2274850c589812b6e69df0033joshualitt    TypeModifier    fTypeModifier;
228249af15fb82833d2274850c589812b6e69df0033joshualitt    SkString        fName;
229249af15fb82833d2274850c589812b6e69df0033joshualitt    int             fCount;
230249af15fb82833d2274850c589812b6e69df0033joshualitt    Precision       fPrecision;
231249af15fb82833d2274850c589812b6e69df0033joshualitt};
232249af15fb82833d2274850c589812b6e69df0033joshualitt
233249af15fb82833d2274850c589812b6e69df0033joshualitt#endif
234