• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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