1 /* 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 GrShaderVar_DEFINED 9 #define GrShaderVar_DEFINED 10 11 #include "GrTypesPriv.h" 12 #include "SkString.h" 13 14 class GrShaderVar { 15 public: 16 /** 17 * Early versions of GLSL have Varying and Attribute; those are later 18 * deprecated, but we still need to know whether a Varying variable 19 * should be treated as In or Out. 20 * 21 * TODO This really shouldn't live here, but until we have c++11, there is really no good way 22 * to write extensible enums. In reality, only none, out, in, inout, and uniform really 23 * make sense on this base class 24 */ 25 enum TypeModifier { 26 kNone_TypeModifier, 27 kOut_TypeModifier, 28 kIn_TypeModifier, 29 kInOut_TypeModifier, 30 kUniform_TypeModifier, 31 // GL Specific types below 32 kAttribute_TypeModifier, 33 kVaryingIn_TypeModifier, 34 kVaryingOut_TypeModifier 35 }; 36 37 /** 38 * Defaults to a float with no precision specifier 39 */ GrShaderVar()40 GrShaderVar() 41 : fType(kFloat_GrSLType) 42 , fTypeModifier(kNone_TypeModifier) 43 , fCount(kNonArray) 44 , fPrecision(kDefault_GrSLPrecision) { 45 } 46 47 GrShaderVar(const SkString& name, GrSLType type, int arrayCount = kNonArray, 48 GrSLPrecision precision = kDefault_GrSLPrecision) fType(type)49 : fType(type) 50 , fTypeModifier(kNone_TypeModifier) 51 , fName(name) 52 , fCount(arrayCount) 53 , fPrecision(precision) { 54 SkASSERT(kDefault_GrSLPrecision == precision || GrSLTypeIsNumeric(type)); 55 SkASSERT(kVoid_GrSLType != type); 56 } 57 58 GrShaderVar(const char* name, GrSLType type, int arrayCount = kNonArray, 59 GrSLPrecision precision = kDefault_GrSLPrecision) fType(type)60 : fType(type) 61 , fTypeModifier(kNone_TypeModifier) 62 , fName(name) 63 , fCount(arrayCount) 64 , fPrecision(precision) { 65 SkASSERT(kDefault_GrSLPrecision == precision || GrSLTypeIsNumeric(type)); 66 SkASSERT(kVoid_GrSLType != type); 67 } 68 69 GrShaderVar(const char* name, GrSLType type, TypeModifier typeModifier, 70 int arrayCount = kNonArray, GrSLPrecision precision = kDefault_GrSLPrecision) fType(type)71 : fType(type) 72 , fTypeModifier(typeModifier) 73 , fName(name) 74 , fCount(arrayCount) 75 , fPrecision(precision) { 76 SkASSERT(kDefault_GrSLPrecision == precision || GrSLTypeIsNumeric(type)); 77 SkASSERT(kVoid_GrSLType != type); 78 } 79 80 /** 81 * Values for array count that have special meaning. We allow 1-sized arrays. 82 */ 83 enum { 84 kNonArray = 0, // not an array 85 kUnsizedArray = -1, // an unsized array (declared with []) 86 }; 87 88 void set(GrSLType type, 89 const SkString& name, 90 TypeModifier typeModifier = kNone_TypeModifier, 91 GrSLPrecision precision = kDefault_GrSLPrecision, 92 int count = kNonArray) { 93 SkASSERT(kVoid_GrSLType != type); 94 SkASSERT(kDefault_GrSLPrecision == precision || GrSLTypeIsNumeric(type)); 95 fType = type; 96 fTypeModifier = typeModifier; 97 fName = name; 98 fCount = count; 99 fPrecision = precision; 100 } 101 102 void set(GrSLType type, 103 const char* name, 104 TypeModifier typeModifier = kNone_TypeModifier, 105 GrSLPrecision precision = kDefault_GrSLPrecision, 106 int count = kNonArray) { 107 SkASSERT(kVoid_GrSLType != type); 108 SkASSERT(kDefault_GrSLPrecision == precision || GrSLTypeIsNumeric(type)); 109 fType = type; 110 fTypeModifier = typeModifier; 111 fName = name; 112 fCount = count; 113 fPrecision = precision; 114 } 115 116 /** 117 * Is the var an array. 118 */ isArray()119 bool isArray() const { return kNonArray != fCount; } 120 /** 121 * Is this an unsized array, (i.e. declared with []). 122 */ isUnsizedArray()123 bool isUnsizedArray() const { return kUnsizedArray == fCount; } 124 /** 125 * Get the array length of the var. 126 */ getArrayCount()127 int getArrayCount() const { return fCount; } 128 /** 129 * Set the array length of the var 130 */ setArrayCount(int count)131 void setArrayCount(int count) { fCount = count; } 132 /** 133 * Set to be a non-array. 134 */ setNonArray()135 void setNonArray() { fCount = kNonArray; } 136 /** 137 * Set to be an unsized array. 138 */ setUnsizedArray()139 void setUnsizedArray() { fCount = kUnsizedArray; } 140 141 /** 142 * Access the var name as a writable string 143 */ accessName()144 SkString* accessName() { return &fName; } 145 /** 146 * Set the var name 147 */ setName(const SkString & n)148 void setName(const SkString& n) { fName = n; } setName(const char * n)149 void setName(const char* n) { fName = n; } 150 151 /** 152 * Get the var name. 153 */ getName()154 const SkString& getName() const { return fName; } 155 156 /** 157 * Shortcut for this->getName().c_str(); 158 */ c_str()159 const char* c_str() const { return this->getName().c_str(); } 160 161 /** 162 * Get the type of the var 163 */ getType()164 GrSLType getType() const { return fType; } 165 /** 166 * Set the type of the var 167 */ setType(GrSLType type)168 void setType(GrSLType type) { fType = type; } 169 getTypeModifier()170 TypeModifier getTypeModifier() const { return fTypeModifier; } setTypeModifier(TypeModifier type)171 void setTypeModifier(TypeModifier type) { fTypeModifier = type; } 172 173 /** 174 * Get the precision of the var 175 */ getPrecision()176 GrSLPrecision getPrecision() const { return fPrecision; } 177 178 /** 179 * Set the precision of the var 180 */ setPrecision(GrSLPrecision p)181 void setPrecision(GrSLPrecision p) { fPrecision = p; } 182 183 protected: 184 GrSLType fType; 185 TypeModifier fTypeModifier; 186 SkString fName; 187 int fCount; 188 GrSLPrecision fPrecision; 189 }; 190 191 #endif 192