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