Home | History | Annotate | Download | only in private
      1 /*
      2  * Copyright 2011 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 GrGLSL_DEFINED
      9 #define GrGLSL_DEFINED
     10 
     11 #include "GrTypesPriv.h"
     12 #include "SkString.h"
     13 
     14 class GrShaderCaps;
     15 
     16 // Limited set of GLSL versions we build shaders for. Caller should round
     17 // down the GLSL version to one of these enums.
     18 enum GrGLSLGeneration {
     19     /**
     20      * Desktop GLSL 1.10 and ES2 shading language (based on desktop GLSL 1.20)
     21      */
     22     k110_GrGLSLGeneration,
     23     /**
     24      * Desktop GLSL 1.30
     25      */
     26     k130_GrGLSLGeneration,
     27     /**
     28      * Desktop GLSL 1.40
     29      */
     30     k140_GrGLSLGeneration,
     31     /**
     32      * Desktop GLSL 1.50
     33      */
     34     k150_GrGLSLGeneration,
     35     /**
     36      * Desktop GLSL 3.30, and ES GLSL 3.00
     37      */
     38     k330_GrGLSLGeneration,
     39     /**
     40      * Desktop GLSL 4.00
     41      */
     42     k400_GrGLSLGeneration,
     43     /**
     44      * Desktop GLSL 4.20
     45      */
     46     k420_GrGLSLGeneration,
     47     /**
     48      * ES GLSL 3.10 only TODO Make GLSLCap objects to make this more granular
     49      */
     50     k310es_GrGLSLGeneration,
     51     /**
     52      * ES GLSL 3.20
     53      */
     54     k320es_GrGLSLGeneration,
     55 };
     56 
     57 bool GrGLSLSupportsNamedFragmentShaderOutputs(GrGLSLGeneration);
     58 
     59 /**
     60  * Adds a line of GLSL code to declare the default precision for float types.
     61  */
     62 void GrGLSLAppendDefaultFloatPrecisionDeclaration(GrSLPrecision,
     63                                                   const GrShaderCaps&,
     64                                                   SkString* out);
     65 
     66 /**
     67  * Converts a GrSLPrecision to its corresponding GLSL precision qualifier.
     68  */
     69 static inline const char* GrGLSLPrecisionString(GrSLPrecision p) {
     70     switch (p) {
     71         case kLow_GrSLPrecision:
     72             return "lowp";
     73         case kMedium_GrSLPrecision:
     74             return "mediump";
     75         case kHigh_GrSLPrecision:
     76             return "highp";
     77         case kDefault_GrSLPrecision:
     78             return "";
     79         default:
     80             SkFAIL("Unexpected precision type.");
     81             return "";
     82     }
     83 }
     84 
     85 /**
     86  * Converts a GrSLType to a string containing the name of the equivalent GLSL type.
     87  */
     88 static inline const char* GrGLSLTypeString(GrSLType t) {
     89     switch (t) {
     90         case kVoid_GrSLType:
     91             return "void";
     92         case kFloat_GrSLType:
     93             return "float";
     94         case kVec2f_GrSLType:
     95             return "vec2";
     96         case kVec3f_GrSLType:
     97             return "vec3";
     98         case kVec4f_GrSLType:
     99             return "vec4";
    100         case kVec2i_GrSLType:
    101             return "ivec2";
    102         case kVec3i_GrSLType:
    103             return "ivec3";
    104         case kVec4i_GrSLType:
    105             return "ivec4";
    106         case kMat22f_GrSLType:
    107             return "mat2";
    108         case kMat33f_GrSLType:
    109             return "mat3";
    110         case kMat44f_GrSLType:
    111             return "mat4";
    112         case kTexture2DSampler_GrSLType:
    113             return "sampler2D";
    114         case kITexture2DSampler_GrSLType:
    115             return "isampler2D";
    116         case kTextureExternalSampler_GrSLType:
    117             return "samplerExternalOES";
    118         case kTexture2DRectSampler_GrSLType:
    119             return "sampler2DRect";
    120         case kBufferSampler_GrSLType:
    121             return "samplerBuffer";
    122         case kBool_GrSLType:
    123             return "bool";
    124         case kInt_GrSLType:
    125             return "int";
    126         case kUint_GrSLType:
    127             return "uint";
    128         case kTexture2D_GrSLType:
    129             return "texture2D";
    130         case kSampler_GrSLType:
    131             return "sampler";
    132         case kImageStorage2D_GrSLType:
    133             return "image2D";
    134         case kIImageStorage2D_GrSLType:
    135             return "iimage2D";
    136     }
    137     SkFAIL("Unknown shader var type.");
    138     return ""; // suppress warning
    139 }
    140 
    141 #endif
    142