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 { 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 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 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