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 GrGLSLSupportsNamedFragmentShaderOutputs(GrGLSLGeneration gen)12bool 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 GrGLSLTypeString(const GrShaderCaps * shaderCaps,GrSLType t)29const 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 kTextureExternalSampler_GrSLType: 72 return "samplerExternalOES"; 73 case kTexture2DRectSampler_GrSLType: 74 return "sampler2DRect"; 75 case kBufferSampler_GrSLType: 76 return "samplerBuffer"; 77 case kBool_GrSLType: 78 return "bool"; 79 case kInt_GrSLType: 80 return "int"; 81 case kUint_GrSLType: 82 return "uint"; 83 case kShort_GrSLType: 84 return "short"; 85 case kShort2_GrSLType: 86 return "short2"; 87 case kShort3_GrSLType: 88 return "short3"; 89 case kShort4_GrSLType: 90 return "short4"; 91 case kUShort_GrSLType: 92 return "ushort"; 93 case kUShort2_GrSLType: 94 if (shaderCaps->integerSupport()) { 95 return "ushort2"; 96 } else { 97 // uint2 (aka uvec2) isn't supported in GLSL ES 1.00/GLSL 1.20 98 // FIXME: this should be handled by the client code rather than relying on 99 // unconventional ushort2 behavior. 100 return "float2"; 101 } 102 case kUShort3_GrSLType: 103 return "ushort3"; 104 case kUShort4_GrSLType: 105 return "ushort4"; 106 case kTexture2D_GrSLType: 107 return "texture2D"; 108 case kSampler_GrSLType: 109 return "sampler"; 110 } 111 SK_ABORT("Unknown shader var type."); 112 return ""; // suppress warning 113 } 114 GrGLSLAppendDefaultFloatPrecisionDeclaration(GrSLPrecision p,const GrShaderCaps & shaderCaps,SkString * out)115void GrGLSLAppendDefaultFloatPrecisionDeclaration(GrSLPrecision p, 116 const GrShaderCaps& shaderCaps, 117 SkString* out) { 118 if (shaderCaps.usesPrecisionModifiers()) { 119 switch (p) { 120 case kHigh_GrSLPrecision: 121 out->append("precision highp float;\n"); 122 break; 123 case kMedium_GrSLPrecision: 124 out->append("precision mediump float;\n"); 125 break; 126 case kLow_GrSLPrecision: 127 out->append("precision lowp float;\n"); 128 break; 129 default: 130 SK_ABORT("Unknown precision value."); 131 } 132 } 133 } 134