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