| Index: include/gpu/GrShaderVar.h
|
| diff --git a/include/gpu/GrShaderVar.h b/include/gpu/GrShaderVar.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..a13cb8cf7daf26f4c0216201c54eb04f493d0eb7
|
| --- /dev/null
|
| +++ b/include/gpu/GrShaderVar.h
|
| @@ -0,0 +1,223 @@
|
| +/*
|
| + * Copyright 2014 Google Inc.
|
| + *
|
| + * Use of this source code is governed by a BSD-style license that can be
|
| + * found in the LICENSE file.
|
| + */
|
| +
|
| +#ifndef GrShaderVar_DEFINED
|
| +#define GrShaderVar_DEFINED
|
| +
|
| +#include "GrTypesPriv.h"
|
| +#include "SkString.h"
|
| +
|
| +class GrShaderVar {
|
| +public:
|
| + /**
|
| + * Early versions of GLSL have Varying and Attribute; those are later
|
| + * deprecated, but we still need to know whether a Varying variable
|
| + * should be treated as In or Out.
|
| + *
|
| + * TODO This really shouldn't live here, but until we have c++11, there is really no good way
|
| + * to write extensible enums. In reality, only none, out, in, inout, and uniform really
|
| + * make sense on this base class
|
| + */
|
| + enum TypeModifier {
|
| + kNone_TypeModifier,
|
| + kOut_TypeModifier,
|
| + kIn_TypeModifier,
|
| + kInOut_TypeModifier,
|
| + kUniform_TypeModifier,
|
| + // GL Specific types below
|
| + kAttribute_TypeModifier,
|
| + kVaryingIn_TypeModifier,
|
| + kVaryingOut_TypeModifier
|
| + };
|
| +
|
| + enum Precision {
|
| + kLow_Precision, // lowp
|
| + kMedium_Precision, // mediump
|
| + kHigh_Precision, // highp
|
| + kDefault_Precision, // Default for the current context. We make
|
| + // fragment shaders default to mediump on ES2
|
| + // because highp support is not guaranteed (and
|
| + // we haven't been motivated to test for it).
|
| + // Otherwise, highp.
|
| + };
|
| +
|
| + /**
|
| + * Defaults to a float with no precision specifier
|
| + */
|
| + GrShaderVar()
|
| + : fType(kFloat_GrSLType)
|
| + , fTypeModifier(kNone_TypeModifier)
|
| + , fCount(kNonArray)
|
| + , fPrecision(kDefault_Precision) {
|
| + }
|
| +
|
| + GrShaderVar(const char* name, GrSLType type, int arrayCount = kNonArray,
|
| + Precision precision = kDefault_Precision)
|
| + : fType(type)
|
| + , fTypeModifier(kNone_TypeModifier)
|
| + , fName(name)
|
| + , fCount(arrayCount)
|
| + , fPrecision(precision) {
|
| + SkASSERT(kVoid_GrSLType != type);
|
| + }
|
| +
|
| + GrShaderVar(const char* name, GrSLType type, TypeModifier typeModifier,
|
| + int arrayCount = kNonArray, Precision precision = kDefault_Precision)
|
| + : fType(type)
|
| + , fTypeModifier(typeModifier)
|
| + , fName(name)
|
| + , fCount(arrayCount)
|
| + , fPrecision(precision) {
|
| + SkASSERT(kVoid_GrSLType != type);
|
| + }
|
| +
|
| + /**
|
| + * Values for array count that have special meaning. We allow 1-sized arrays.
|
| + */
|
| + enum {
|
| + kNonArray = 0, // not an array
|
| + kUnsizedArray = -1, // an unsized array (declared with [])
|
| + };
|
| +
|
| + /**
|
| + * Sets as a non-array.
|
| + */
|
| + void set(GrSLType type,
|
| + TypeModifier typeModifier,
|
| + const SkString& name,
|
| + Precision precision = kDefault_Precision) {
|
| + SkASSERT(kVoid_GrSLType != type);
|
| + fType = type;
|
| + fTypeModifier = typeModifier;
|
| + fName = name;
|
| + fCount = kNonArray;
|
| + fPrecision = precision;
|
| + }
|
| +
|
| + /**
|
| + * Sets as a non-array.
|
| + */
|
| + void set(GrSLType type,
|
| + TypeModifier typeModifier,
|
| + const char* name,
|
| + Precision precision = kDefault_Precision) {
|
| + SkASSERT(kVoid_GrSLType != type);
|
| + fType = type;
|
| + fTypeModifier = typeModifier;
|
| + fName = name;
|
| + fCount = kNonArray;
|
| + fPrecision = precision;
|
| + }
|
| +
|
| + /**
|
| + * Set all var options
|
| + */
|
| + void set(GrSLType type,
|
| + TypeModifier typeModifier,
|
| + const SkString& name,
|
| + int count,
|
| + Precision precision = kDefault_Precision) {
|
| + SkASSERT(kVoid_GrSLType != type);
|
| + fType = type;
|
| + fTypeModifier = typeModifier;
|
| + fName = name;
|
| + fCount = count;
|
| + fPrecision = precision;
|
| + }
|
| +
|
| + /**
|
| + * Set all var options
|
| + */
|
| + void set(GrSLType type,
|
| + TypeModifier typeModifier,
|
| + const char* name,
|
| + int count,
|
| + Precision precision = kDefault_Precision) {
|
| + SkASSERT(kVoid_GrSLType != type);
|
| + fType = type;
|
| + fTypeModifier = typeModifier;
|
| + fName = name;
|
| + fCount = count;
|
| + fPrecision = precision;
|
| + }
|
| +
|
| + /**
|
| + * Is the var an array.
|
| + */
|
| + bool isArray() const { return kNonArray != fCount; }
|
| + /**
|
| + * Is this an unsized array, (i.e. declared with []).
|
| + */
|
| + bool isUnsizedArray() const { return kUnsizedArray == fCount; }
|
| + /**
|
| + * Get the array length of the var.
|
| + */
|
| + int getArrayCount() const { return fCount; }
|
| + /**
|
| + * Set the array length of the var
|
| + */
|
| + void setArrayCount(int count) { fCount = count; }
|
| + /**
|
| + * Set to be a non-array.
|
| + */
|
| + void setNonArray() { fCount = kNonArray; }
|
| + /**
|
| + * Set to be an unsized array.
|
| + */
|
| + void setUnsizedArray() { fCount = kUnsizedArray; }
|
| +
|
| + /**
|
| + * Access the var name as a writable string
|
| + */
|
| + SkString* accessName() { return &fName; }
|
| + /**
|
| + * Set the var name
|
| + */
|
| + void setName(const SkString& n) { fName = n; }
|
| + void setName(const char* n) { fName = n; }
|
| +
|
| + /**
|
| + * Get the var name.
|
| + */
|
| + const SkString& getName() const { return fName; }
|
| +
|
| + /**
|
| + * Shortcut for this->getName().c_str();
|
| + */
|
| + const char* c_str() const { return this->getName().c_str(); }
|
| +
|
| + /**
|
| + * Get the type of the var
|
| + */
|
| + GrSLType getType() const { return fType; }
|
| + /**
|
| + * Set the type of the var
|
| + */
|
| + void setType(GrSLType type) { fType = type; }
|
| +
|
| + TypeModifier getTypeModifier() const { return fTypeModifier; }
|
| + void setTypeModifier(TypeModifier type) { fTypeModifier = type; }
|
| +
|
| + /**
|
| + * Get the precision of the var
|
| + */
|
| + Precision getPrecision() const { return fPrecision; }
|
| +
|
| + /**
|
| + * Set the precision of the var
|
| + */
|
| + void setPrecision(Precision p) { fPrecision = p; }
|
| +
|
| +protected:
|
| + GrSLType fType;
|
| + TypeModifier fTypeModifier;
|
| + SkString fName;
|
| + int fCount;
|
| + Precision fPrecision;
|
| +};
|
| +
|
| +#endif
|
|
|