Home | History | Annotate | Download | only in glsl
      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 #include "GrShaderCaps.h"
      9 #include "SkString.h"
     10 #include "../private/GrGLSL.h"
     11 
     12 bool GrGLSLSupportsNamedFragmentShaderOutputs(GrGLSLGeneration gen) {
     13     switch (gen) {
     14         case k110_GrGLSLGeneration:
     15             return false;
     16         case k130_GrGLSLGeneration:
     17         case k140_GrGLSLGeneration:
     18         case k150_GrGLSLGeneration:
     19         case k330_GrGLSLGeneration:
     20         case k400_GrGLSLGeneration:
     21         case k420_GrGLSLGeneration:
     22         case k310es_GrGLSLGeneration:
     23         case k320es_GrGLSLGeneration:
     24             return true;
     25     }
     26     return false;
     27 }
     28 
     29 const char* GrGLSLTypeString(const GrShaderCaps* shaderCaps, GrSLType t) {
     30     switch (t) {
     31         case kVoid_GrSLType:
     32             return "void";
     33         case kHalf_GrSLType:
     34             return "half";
     35         case kHalf2_GrSLType:
     36             return "half2";
     37         case kHalf3_GrSLType:
     38             return "half3";
     39         case kHalf4_GrSLType:
     40             return "half4";
     41         case kFloat_GrSLType:
     42             return "float";
     43         case kFloat2_GrSLType:
     44             return "float2";
     45         case kFloat3_GrSLType:
     46             return "float3";
     47         case kFloat4_GrSLType:
     48             return "float4";
     49         case kUint2_GrSLType:
     50             return "uint2";
     51         case kInt2_GrSLType:
     52             return "int2";
     53         case kInt3_GrSLType:
     54             return "int3";
     55         case kInt4_GrSLType:
     56             return "int4";
     57         case kFloat2x2_GrSLType:
     58             return "float2x2";
     59         case kFloat3x3_GrSLType:
     60             return "float3x3";
     61         case kFloat4x4_GrSLType:
     62             return "float4x4";
     63         case kHalf2x2_GrSLType:
     64             return "half2x2";
     65         case kHalf3x3_GrSLType:
     66             return "half3x3";
     67         case kHalf4x4_GrSLType:
     68             return "half4x4";
     69         case kTexture2DSampler_GrSLType:
     70             return "sampler2D";
     71         case kITexture2DSampler_GrSLType:
     72             return "isampler2D";
     73         case kTextureExternalSampler_GrSLType:
     74             return "samplerExternalOES";
     75         case kTexture2DRectSampler_GrSLType:
     76             return "sampler2DRect";
     77         case kBufferSampler_GrSLType:
     78             return "samplerBuffer";
     79         case kBool_GrSLType:
     80             return "bool";
     81         case kInt_GrSLType:
     82             return "int";
     83         case kUint_GrSLType:
     84             return "uint";
     85         case kShort_GrSLType:
     86             return "short";
     87         case kShort2_GrSLType:
     88             return "short2";
     89         case kShort3_GrSLType:
     90             return "short3";
     91         case kShort4_GrSLType:
     92             return "short4";
     93         case kUShort_GrSLType:
     94             return "ushort";
     95         case kUShort2_GrSLType:
     96             if (shaderCaps->integerSupport()) {
     97                 return "ushort2";
     98             } else {
     99                 // uint2 (aka uvec2) isn't supported in GLSL ES 1.00/GLSL 1.20
    100                 // FIXME: this should be handled by the client code rather than relying on
    101                 // unconventional ushort2 behavior.
    102                 return "float2";
    103             }
    104         case kUShort3_GrSLType:
    105             return "ushort3";
    106         case kUShort4_GrSLType:
    107             return "ushort4";
    108         case kTexture2D_GrSLType:
    109             return "texture2D";
    110         case kSampler_GrSLType:
    111             return "sampler";
    112     }
    113     SK_ABORT("Unknown shader var type.");
    114     return ""; // suppress warning
    115 }
    116 
    117 void GrGLSLAppendDefaultFloatPrecisionDeclaration(GrSLPrecision p,
    118                                                   const GrShaderCaps& shaderCaps,
    119                                                   SkString* out) {
    120     if (shaderCaps.usesPrecisionModifiers()) {
    121         switch (p) {
    122             case kHigh_GrSLPrecision:
    123                 out->append("precision highp float;\n");
    124                 break;
    125             case kMedium_GrSLPrecision:
    126                 out->append("precision mediump float;\n");
    127                 break;
    128             case kLow_GrSLPrecision:
    129                 out->append("precision lowp float;\n");
    130                 break;
    131             default:
    132                 SK_ABORT("Unknown precision value.");
    133         }
    134     }
    135 }
    136