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)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 
GrGLSLTypeString(const GrShaderCaps * shaderCaps,GrSLType t)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 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)115 void 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