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 #ifndef GrGLSL_DEFINED
9 #define GrGLSL_DEFINED
10
11 #include "gl/GrGLInterface.h"
12
13 class GrGLShaderVar;
14 class SkString;
15
16 // Limited set of GLSL versions we build shaders for. Caller should round
17 // down the GLSL version to one of these enums.
18 enum GrGLSLGeneration {
19 /**
20 * Desktop GLSL 1.10 and ES2 shading language (based on desktop GLSL 1.20)
21 */
22 k110_GrGLSLGeneration,
23 /**
24 * Desktop GLSL 1.30
25 */
26 k130_GrGLSLGeneration,
27 /**
28 * Desktop GLSL 1.40
29 */
30 k140_GrGLSLGeneration,
31 /**
32 * Desktop GLSL 1.50
33 */
34 k150_GrGLSLGeneration,
35 };
36
37 /**
38 * Types of shader-language-specific boxed variables we can create.
39 * (Currently only GrGLShaderVars, but should be applicable to other shader
40 * languages.)
41 */
42 enum GrSLType {
43 kVoid_GrSLType,
44 kFloat_GrSLType,
45 kVec2f_GrSLType,
46 kVec3f_GrSLType,
47 kVec4f_GrSLType,
48 kMat33f_GrSLType,
49 kMat44f_GrSLType,
50 kSampler2D_GrSLType
51 };
52
53 enum GrSLConstantVec {
54 kZeros_GrSLConstantVec,
55 kOnes_GrSLConstantVec,
56 kNone_GrSLConstantVec,
57 };
58
59 namespace {
GrSLTypeToVecLength(GrSLType type)60 static inline int GrSLTypeToVecLength(GrSLType type) {
61 static const int kVecLengths[] = {
62 0, // kVoid_GrSLType
63 1, // kFloat_GrSLType
64 2, // kVec2f_GrSLType
65 3, // kVec3f_GrSLType
66 4, // kVec4f_GrSLType
67 1, // kMat33f_GrSLType
68 1, // kMat44f_GrSLType
69 1, // kSampler2D_GrSLType
70 };
71 GrAssert((size_t) type < GR_ARRAY_COUNT(kVecLengths));
72 return kVecLengths[type];
73 }
74
GrGLSLOnesVecf(int count)75 static inline const char* GrGLSLOnesVecf(int count) {
76 static const char* kONESVEC[] = {"ERROR", "1.0", "vec2(1,1)",
77 "vec3(1,1,1)", "vec4(1,1,1,1)"};
78 GrAssert(count >= 1 && count < (int)GR_ARRAY_COUNT(kONESVEC));
79 return kONESVEC[count];
80 }
81
GrGLSLZerosVecf(int count)82 static inline const char* GrGLSLZerosVecf(int count) {
83 static const char* kZEROSVEC[] = {"ERROR", "0.0", "vec2(0,0)",
84 "vec3(0,0,0)", "vec4(0,0,0,0)"};
85 GrAssert(count >= 1 && count < (int)GR_ARRAY_COUNT(kZEROSVEC));
86 return kZEROSVEC[count];
87 }
88 }
89
90 /**
91 * Gets the most recent GLSL Generation compatible with the OpenGL context.
92 */
93 GrGLSLGeneration GrGetGLSLGeneration(GrGLBinding binding,
94 const GrGLInterface* gl);
95
96 /**
97 * Returns a string to include at the beginning of a shader to declare the GLSL
98 * version.
99 */
100 const char* GrGetGLSLVersionDecl(GrGLBinding binding,
101 GrGLSLGeneration v);
102
103 /**
104 * Depending on the GLSL version being emitted there may be an assumed output
105 * variable from the fragment shader for the color. Otherwise, the shader must
106 * declare an output variable for the color. If this function returns true:
107 * * Parameter var's name will be set to nameIfDeclared
108 * * The variable must be declared in the fragment shader
109 * * The variable has to be bound as the color output
110 * (using glBindFragDataLocation)
111 * If the function returns false:
112 * * Parameter var's name will be set to the GLSL built-in color output name.
113 * * Do not declare the variable in the shader.
114 * * Do not use glBindFragDataLocation to bind the variable
115 * In either case var is initialized to represent the color output in the
116 * shader.
117 */
118 bool GrGLSLSetupFSColorOuput(GrGLSLGeneration gen,
119 const char* nameIfDeclared,
120 GrGLShaderVar* var);
121
122 /** Convert a count of 1..n floats into the corresponding type enum,
123 e.g. 1 -> kFloat_GrSLType, 2 -> kVec2_GrSLType, ... */
124 GrSLType GrSLFloatVectorType(int count);
125
126 /** Return the GLSL swizzle operator for a homogenous component of a vector
127 with the given number of coordinates, e.g. 2 -> ".y", 3 -> ".z" */
128 const char* GrGLSLVectorHomogCoord(int count);
129 const char* GrGLSLVectorHomogCoord(GrSLType type);
130
131 /** Return the GLSL swizzle operator for a nonhomogenous components of a vector
132 with the given number of coordinates, e.g. 2 -> ".x", 3 -> ".xy" */
133 const char* GrGLSLVectorNonhomogCoords(int count);
134 const char* GrGLSLVectorNonhomogCoords(GrSLType type);
135
136 /**
137 * Produces a string that is the result of modulating two inputs. The inputs must be vec4 or
138 * float. The result is always a vec4. The inputs may be expressions, not just identifier names.
139 * Either can be NULL or "" in which case the default params control whether vec4(1,1,1,1) or
140 * vec4(0,0,0,0) is assumed. It is an error to pass kNone for default<i> if in<i> is NULL or "".
141 * Note that when if function determines that the result is a zeros or ones vec then any expression
142 * represented by in0 or in1 will not be emitted. The return value indicates whether a zeros, ones
143 * or neither was appended.
144 */
145 GrSLConstantVec GrGLSLModulate4f(SkString* outAppend,
146 const char* in0,
147 const char* in1,
148 GrSLConstantVec default0 = kOnes_GrSLConstantVec,
149 GrSLConstantVec default1 = kOnes_GrSLConstantVec);
150
151 /**
152 * Does an inplace mul, *=, of vec4VarName by mulFactor. If mulFactorDefault is not kNone then
153 * mulFactor may be either "" or NULL. In this case either nothing will be appended (kOnes) or an
154 * assignment of vec(0,0,0,0) will be appended (kZeros). The assignment is prepended by tabCnt tabs.
155 * A semicolon and newline are added after the assignment. (TODO: Remove tabCnt when we auto-insert
156 * tabs to GrGLEffect-generated lines.) If a zeros vec is assigned then the return value is
157 * kZeros, otherwise kNone.
158 */
159 GrSLConstantVec GrGLSLMulVarBy4f(SkString* outAppend,
160 int tabCnt,
161 const char* vec4VarName,
162 const char* mulFactor,
163 GrSLConstantVec mulFactorDefault = kOnes_GrSLConstantVec);
164
165 /**
166 * Produces a string that is the result of adding two inputs. The inputs must be vec4 or float.
167 * The result is always a vec4. The inputs may be expressions, not just identifier names. Either
168 * can be NULL or "" in which case if the default is kZeros then vec4(0,0,0,0) is assumed. It is an
169 * error to pass kOnes for either default or to pass kNone for default<i> if in<i> is NULL or "".
170 * Note that if the function determines that the result is a zeros vec any expression represented
171 * by in0 or in1 will not be emitted. The return value indicates whether a zeros vec was appended
172 * or not.
173 */
174 GrSLConstantVec GrGLSLAdd4f(SkString* outAppend,
175 const char* in0,
176 const char* in1,
177 GrSLConstantVec default0 = kZeros_GrSLConstantVec,
178 GrSLConstantVec default1 = kZeros_GrSLConstantVec);
179
180 #endif
181