Home | History | Annotate | Download | only in gpu
      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     enum Precision {
     38         kLow_Precision,         // lowp
     39         kMedium_Precision,      // mediump
     40         kHigh_Precision,        // highp
     41         kDefault_Precision,     // Default for the current context. We make
     42                                 // fragment shaders default to mediump on ES2
     43                                 // because highp support is not guaranteed (and
     44                                 // we haven't been motivated to test for it).
     45                                 // Otherwise, highp.
     46     };
     47 
     48     /**
     49      * Defaults to a float with no precision specifier
     50      */
     51     GrShaderVar()
     52         : fType(kFloat_GrSLType)
     53         , fTypeModifier(kNone_TypeModifier)
     54         , fCount(kNonArray)
     55         , fPrecision(kDefault_Precision) {
     56     }
     57 
     58     GrShaderVar(const SkString& name, GrSLType type, int arrayCount = kNonArray,
     59                 Precision precision = kDefault_Precision)
     60         : fType(type)
     61         , fTypeModifier(kNone_TypeModifier)
     62         , fName(name)
     63         , fCount(arrayCount)
     64         , fPrecision(precision) {
     65         SkASSERT(kVoid_GrSLType != type);
     66     }
     67 
     68     GrShaderVar(const char* name, GrSLType type, int arrayCount = kNonArray,
     69                   Precision precision = kDefault_Precision)
     70         : fType(type)
     71         , fTypeModifier(kNone_TypeModifier)
     72         , fName(name)
     73         , fCount(arrayCount)
     74         , fPrecision(precision) {
     75         SkASSERT(kVoid_GrSLType != type);
     76     }
     77 
     78     GrShaderVar(const char* name, GrSLType type, TypeModifier typeModifier,
     79                   int arrayCount = kNonArray, Precision precision = kDefault_Precision)
     80         : fType(type)
     81         , fTypeModifier(typeModifier)
     82         , fName(name)
     83         , fCount(arrayCount)
     84         , fPrecision(precision) {
     85         SkASSERT(kVoid_GrSLType != type);
     86     }
     87 
     88     /**
     89      * Values for array count that have special meaning. We allow 1-sized arrays.
     90      */
     91     enum {
     92         kNonArray     =  0, // not an array
     93         kUnsizedArray = -1, // an unsized array (declared with [])
     94     };
     95 
     96     /**
     97      * Sets as a non-array.
     98      */
     99     void set(GrSLType type,
    100              TypeModifier typeModifier,
    101              const SkString& name,
    102              Precision precision = kDefault_Precision) {
    103         SkASSERT(kVoid_GrSLType != type);
    104         fType = type;
    105         fTypeModifier = typeModifier;
    106         fName = name;
    107         fCount = kNonArray;
    108         fPrecision = precision;
    109     }
    110 
    111     /**
    112      * Sets as a non-array.
    113      */
    114     void set(GrSLType type,
    115              TypeModifier typeModifier,
    116              const char* name,
    117              Precision precision = kDefault_Precision) {
    118         SkASSERT(kVoid_GrSLType != type);
    119         fType = type;
    120         fTypeModifier = typeModifier;
    121         fName = name;
    122         fCount = kNonArray;
    123         fPrecision = precision;
    124     }
    125 
    126     /**
    127      * Set all var options
    128      */
    129     void set(GrSLType type,
    130              TypeModifier typeModifier,
    131              const SkString& name,
    132              int count,
    133              Precision precision = kDefault_Precision) {
    134         SkASSERT(kVoid_GrSLType != type);
    135         fType = type;
    136         fTypeModifier = typeModifier;
    137         fName = name;
    138         fCount = count;
    139         fPrecision = precision;
    140     }
    141 
    142     /**
    143      * Set all var options
    144      */
    145     void set(GrSLType type,
    146              TypeModifier typeModifier,
    147              const char* name,
    148              int count,
    149              Precision precision = kDefault_Precision) {
    150         SkASSERT(kVoid_GrSLType != type);
    151         fType = type;
    152         fTypeModifier = typeModifier;
    153         fName = name;
    154         fCount = count;
    155         fPrecision = precision;
    156     }
    157 
    158     /**
    159      * Is the var an array.
    160      */
    161     bool isArray() const { return kNonArray != fCount; }
    162     /**
    163      * Is this an unsized array, (i.e. declared with []).
    164      */
    165     bool isUnsizedArray() const { return kUnsizedArray == fCount; }
    166     /**
    167      * Get the array length of the var.
    168      */
    169     int getArrayCount() const { return fCount; }
    170     /**
    171      * Set the array length of the var
    172      */
    173     void setArrayCount(int count) { fCount = count; }
    174     /**
    175      * Set to be a non-array.
    176      */
    177     void setNonArray() { fCount = kNonArray; }
    178     /**
    179      * Set to be an unsized array.
    180      */
    181     void setUnsizedArray() { fCount = kUnsizedArray; }
    182 
    183     /**
    184      * Access the var name as a writable string
    185      */
    186     SkString* accessName() { return &fName; }
    187     /**
    188      * Set the var name
    189      */
    190     void setName(const SkString& n) { fName = n; }
    191     void setName(const char* n) { fName = n; }
    192 
    193     /**
    194      * Get the var name.
    195      */
    196     const SkString& getName() const { return fName; }
    197 
    198     /**
    199      * Shortcut for this->getName().c_str();
    200      */
    201     const char* c_str() const { return this->getName().c_str(); }
    202 
    203     /**
    204      * Get the type of the var
    205      */
    206     GrSLType getType() const { return fType; }
    207     /**
    208      * Set the type of the var
    209      */
    210     void setType(GrSLType type) { fType = type; }
    211 
    212     TypeModifier getTypeModifier() const { return fTypeModifier; }
    213     void setTypeModifier(TypeModifier type) { fTypeModifier = type; }
    214 
    215     /**
    216      * Get the precision of the var
    217      */
    218     Precision getPrecision() const { return fPrecision; }
    219 
    220     /**
    221      * Set the precision of the var
    222      */
    223     void setPrecision(Precision p) { fPrecision = p; }
    224 
    225 protected:
    226     GrSLType        fType;
    227     TypeModifier    fTypeModifier;
    228     SkString        fName;
    229     int             fCount;
    230     Precision       fPrecision;
    231 };
    232 
    233 #endif
    234