blob: db8b7d620617fa9fb1b91e28a38bee53c3df278f [file] [log] [blame]
jvanverthcba99b82015-06-24 06:59:57 -07001/*
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
Brian Salomon94efbf52016-11-29 13:43:05 -05008#include "GrShaderCaps.h"
jvanverthcba99b82015-06-24 06:59:57 -07009#include "SkString.h"
Brian Salomon94efbf52016-11-29 13:43:05 -050010#include "../private/GrGLSL.h"
jvanverthcba99b82015-06-24 06:59:57 -070011
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:
cdalton33ad7012016-02-22 07:55:44 -080020 case k400_GrGLSLGeneration:
Brian Salomond327e8c2016-11-15 13:26:08 -050021 case k420_GrGLSLGeneration:
jvanverthcba99b82015-06-24 06:59:57 -070022 case k310es_GrGLSLGeneration:
cdalton33ad7012016-02-22 07:55:44 -080023 case k320es_GrGLSLGeneration:
jvanverthcba99b82015-06-24 06:59:57 -070024 return true;
25 }
26 return false;
27}
Brian Salomon1d816b92017-08-17 11:07:59 -040028
Robert Phillips8296e752017-08-25 08:45:21 -040029const char* GrGLSLTypeString(const GrShaderCaps* shaderCaps, GrSLType t) {
30 switch (t) {
31 case kVoid_GrSLType:
32 return "void";
Ethan Nicholasf7b88202017-09-18 14:10:39 -040033 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 kHighFloat_GrSLType:
42 return "highfloat";
43 case kHighFloat2_GrSLType:
44 return "highfloat2";
45 case kHighFloat3_GrSLType:
46 return "highfloat3";
47 case kHighFloat4_GrSLType:
48 return "highfloat4";
49 case kUint2_GrSLType:
Robert Phillips8296e752017-08-25 08:45:21 -040050 if (shaderCaps->integerSupport()) {
51 return "uint2";
52 } else {
53 // uint2 (aka uvec2) isn't supported in GLSL ES 1.00/GLSL 1.20
Ethan Nicholasf7b88202017-09-18 14:10:39 -040054 return "highfloat2";
Robert Phillips8296e752017-08-25 08:45:21 -040055 }
Ethan Nicholasf7b88202017-09-18 14:10:39 -040056 case kInt2_GrSLType:
Robert Phillips8296e752017-08-25 08:45:21 -040057 return "int2";
Ethan Nicholasf7b88202017-09-18 14:10:39 -040058 case kInt3_GrSLType:
Robert Phillips8296e752017-08-25 08:45:21 -040059 return "int3";
Ethan Nicholasf7b88202017-09-18 14:10:39 -040060 case kInt4_GrSLType:
Robert Phillips8296e752017-08-25 08:45:21 -040061 return "int4";
Ethan Nicholasf7b88202017-09-18 14:10:39 -040062 case kHighFloat2x2_GrSLType:
63 return "highfloat2x2";
64 case kHighFloat3x3_GrSLType:
65 return "highfloat3x3";
66 case kHighFloat4x4_GrSLType:
67 return "highfloat4x4";
68 case kHalf2x2_GrSLType:
69 return "half2x2";
70 case kHalf3x3_GrSLType:
71 return "half3x3";
72 case kHalf4x4_GrSLType:
73 return "half4x4";
Robert Phillips8296e752017-08-25 08:45:21 -040074 case kTexture2DSampler_GrSLType:
75 return "sampler2D";
76 case kITexture2DSampler_GrSLType:
77 return "isampler2D";
78 case kTextureExternalSampler_GrSLType:
79 return "samplerExternalOES";
80 case kTexture2DRectSampler_GrSLType:
81 return "sampler2DRect";
82 case kBufferSampler_GrSLType:
83 return "samplerBuffer";
84 case kBool_GrSLType:
85 return "bool";
86 case kInt_GrSLType:
87 return "int";
88 case kUint_GrSLType:
89 return "uint";
Ethan Nicholasf7b88202017-09-18 14:10:39 -040090 case kShort_GrSLType:
91 return "short";
92 case kUShort_GrSLType:
93 return "ushort";
Robert Phillips8296e752017-08-25 08:45:21 -040094 case kTexture2D_GrSLType:
95 return "texture2D";
96 case kSampler_GrSLType:
97 return "sampler";
98 case kImageStorage2D_GrSLType:
99 return "image2D";
100 case kIImageStorage2D_GrSLType:
101 return "iimage2D";
102 }
103 SK_ABORT("Unknown shader var type.");
104 return ""; // suppress warning
105}
106
Brian Salomon1d816b92017-08-17 11:07:59 -0400107void GrGLSLAppendDefaultFloatPrecisionDeclaration(GrSLPrecision p,
108 const GrShaderCaps& shaderCaps,
109 SkString* out) {
110 if (shaderCaps.usesPrecisionModifiers()) {
111 switch (p) {
112 case kHigh_GrSLPrecision:
113 out->append("precision highp float;\n");
114 break;
115 case kMedium_GrSLPrecision:
116 out->append("precision mediump float;\n");
117 break;
118 case kLow_GrSLPrecision:
119 out->append("precision lowp float;\n");
120 break;
121 default:
122 SK_ABORT("Unknown precision value.");
123 }
124 }
125}