| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2011 Google Inc. | 2 * Copyright 2011 Google Inc. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #include "GrGLSL.h" | 8 #include "GrGLSL.h" |
| 9 #include "GrGLShaderVar.h" | 9 #include "GrGLShaderVar.h" |
| 10 #include "SkString.h" | 10 #include "SkString.h" |
| 11 | 11 |
| 12 GrGLSLGeneration GrGetGLSLGeneration(GrGLBinding binding, const GrGLInterface* g
l) { | 12 GrGLSLGeneration GrGetGLSLGeneration(GrGLBinding binding, const GrGLInterface* g
l) { |
| 13 GrGLSLVersion ver = GrGLGetGLSLVersion(gl); | 13 GrGLSLVersion ver = GrGLGetGLSLVersion(gl); |
| 14 switch (binding) { | 14 switch (binding) { |
| 15 case kDesktop_GrGLBinding: | 15 case kDesktop_GrGLBinding: |
| 16 GrAssert(ver >= GR_GLSL_VER(1,10)); | 16 SkASSERT(ver >= GR_GLSL_VER(1,10)); |
| 17 if (ver >= GR_GLSL_VER(1,50)) { | 17 if (ver >= GR_GLSL_VER(1,50)) { |
| 18 return k150_GrGLSLGeneration; | 18 return k150_GrGLSLGeneration; |
| 19 } else if (ver >= GR_GLSL_VER(1,40)) { | 19 } else if (ver >= GR_GLSL_VER(1,40)) { |
| 20 return k140_GrGLSLGeneration; | 20 return k140_GrGLSLGeneration; |
| 21 } else if (ver >= GR_GLSL_VER(1,30)) { | 21 } else if (ver >= GR_GLSL_VER(1,30)) { |
| 22 return k130_GrGLSLGeneration; | 22 return k130_GrGLSLGeneration; |
| 23 } else { | 23 } else { |
| 24 return k110_GrGLSLGeneration; | 24 return k110_GrGLSLGeneration; |
| 25 } | 25 } |
| 26 case kES_GrGLBinding: | 26 case kES_GrGLBinding: |
| 27 // version 1.00 of ES GLSL based on ver 1.20 of desktop GLSL | 27 // version 1.00 of ES GLSL based on ver 1.20 of desktop GLSL |
| 28 GrAssert(ver >= GR_GL_VER(1,00)); | 28 SkASSERT(ver >= GR_GL_VER(1,00)); |
| 29 return k110_GrGLSLGeneration; | 29 return k110_GrGLSLGeneration; |
| 30 default: | 30 default: |
| 31 GrCrash("Unknown GL Binding"); | 31 GrCrash("Unknown GL Binding"); |
| 32 return k110_GrGLSLGeneration; // suppress warning | 32 return k110_GrGLSLGeneration; // suppress warning |
| 33 } | 33 } |
| 34 } | 34 } |
| 35 | 35 |
| 36 const char* GrGetGLSLVersionDecl(GrGLBinding binding, GrGLSLGeneration gen) { | 36 const char* GrGetGLSLVersionDecl(GrGLBinding binding, GrGLSLGeneration gen) { |
| 37 switch (gen) { | 37 switch (gen) { |
| 38 case k110_GrGLSLGeneration: | 38 case k110_GrGLSLGeneration: |
| 39 if (kES_GrGLBinding == binding) { | 39 if (kES_GrGLBinding == binding) { |
| 40 // ES2s shader language is based on version 1.20 but is version | 40 // ES2s shader language is based on version 1.20 but is version |
| 41 // 1.00 of the ES language. | 41 // 1.00 of the ES language. |
| 42 return "#version 100\n"; | 42 return "#version 100\n"; |
| 43 } else { | 43 } else { |
| 44 GrAssert(kDesktop_GrGLBinding == binding); | 44 SkASSERT(kDesktop_GrGLBinding == binding); |
| 45 return "#version 110\n"; | 45 return "#version 110\n"; |
| 46 } | 46 } |
| 47 case k130_GrGLSLGeneration: | 47 case k130_GrGLSLGeneration: |
| 48 GrAssert(kDesktop_GrGLBinding == binding); | 48 SkASSERT(kDesktop_GrGLBinding == binding); |
| 49 return "#version 130\n"; | 49 return "#version 130\n"; |
| 50 case k140_GrGLSLGeneration: | 50 case k140_GrGLSLGeneration: |
| 51 GrAssert(kDesktop_GrGLBinding == binding); | 51 SkASSERT(kDesktop_GrGLBinding == binding); |
| 52 return "#version 140\n"; | 52 return "#version 140\n"; |
| 53 case k150_GrGLSLGeneration: | 53 case k150_GrGLSLGeneration: |
| 54 GrAssert(kDesktop_GrGLBinding == binding); | 54 SkASSERT(kDesktop_GrGLBinding == binding); |
| 55 return "#version 150\n"; | 55 return "#version 150\n"; |
| 56 default: | 56 default: |
| 57 GrCrash("Unknown GL version."); | 57 GrCrash("Unknown GL version."); |
| 58 return ""; // suppress warning | 58 return ""; // suppress warning |
| 59 } | 59 } |
| 60 } | 60 } |
| 61 | 61 |
| 62 bool GrGLSLSetupFSColorOuput(GrGLSLGeneration gen, const char* nameIfDeclared, G
rGLShaderVar* var) { | 62 bool GrGLSLSetupFSColorOuput(GrGLSLGeneration gen, const char* nameIfDeclared, G
rGLShaderVar* var) { |
| 63 bool declaredOutput = k110_GrGLSLGeneration != gen; | 63 bool declaredOutput = k110_GrGLSLGeneration != gen; |
| 64 var->set(kVec4f_GrSLType, | 64 var->set(kVec4f_GrSLType, |
| 65 GrGLShaderVar::kOut_TypeModifier, | 65 GrGLShaderVar::kOut_TypeModifier, |
| 66 declaredOutput ? nameIfDeclared : "gl_FragColor"); | 66 declaredOutput ? nameIfDeclared : "gl_FragColor"); |
| 67 return declaredOutput; | 67 return declaredOutput; |
| 68 } | 68 } |
| 69 | 69 |
| 70 const char* GrGLSLVectorHomogCoord(int count) { | 70 const char* GrGLSLVectorHomogCoord(int count) { |
| 71 static const char* HOMOGS[] = {"ERROR", "", ".y", ".z", ".w"}; | 71 static const char* HOMOGS[] = {"ERROR", "", ".y", ".z", ".w"}; |
| 72 GrAssert(count >= 1 && count < (int)GR_ARRAY_COUNT(HOMOGS)); | 72 SkASSERT(count >= 1 && count < (int)GR_ARRAY_COUNT(HOMOGS)); |
| 73 return HOMOGS[count]; | 73 return HOMOGS[count]; |
| 74 } | 74 } |
| 75 | 75 |
| 76 const char* GrGLSLVectorHomogCoord(GrSLType type) { | 76 const char* GrGLSLVectorHomogCoord(GrSLType type) { |
| 77 return GrGLSLVectorHomogCoord(GrSLTypeToVecLength(type)); | 77 return GrGLSLVectorHomogCoord(GrSLTypeToVecLength(type)); |
| 78 } | 78 } |
| 79 | 79 |
| 80 const char* GrGLSLVectorNonhomogCoords(int count) { | 80 const char* GrGLSLVectorNonhomogCoords(int count) { |
| 81 static const char* NONHOMOGS[] = {"ERROR", "", ".x", ".xy", ".xyz"}; | 81 static const char* NONHOMOGS[] = {"ERROR", "", ".x", ".xy", ".xyz"}; |
| 82 GrAssert(count >= 1 && count < (int)GR_ARRAY_COUNT(NONHOMOGS)); | 82 SkASSERT(count >= 1 && count < (int)GR_ARRAY_COUNT(NONHOMOGS)); |
| 83 return NONHOMOGS[count]; | 83 return NONHOMOGS[count]; |
| 84 } | 84 } |
| 85 | 85 |
| 86 const char* GrGLSLVectorNonhomogCoords(GrSLType type) { | 86 const char* GrGLSLVectorNonhomogCoords(GrSLType type) { |
| 87 return GrGLSLVectorNonhomogCoords(GrSLTypeToVecLength(type)); | 87 return GrGLSLVectorNonhomogCoords(GrSLTypeToVecLength(type)); |
| 88 } | 88 } |
| 89 | 89 |
| 90 namespace { | 90 namespace { |
| 91 void append_tabs(SkString* outAppend, int tabCnt) { | 91 void append_tabs(SkString* outAppend, int tabCnt) { |
| 92 static const char kTabs[] = "\t\t\t\t\t\t\t\t"; | 92 static const char kTabs[] = "\t\t\t\t\t\t\t\t"; |
| 93 while (tabCnt) { | 93 while (tabCnt) { |
| 94 int cnt = GrMin((int)GR_ARRAY_COUNT(kTabs), tabCnt); | 94 int cnt = GrMin((int)GR_ARRAY_COUNT(kTabs), tabCnt); |
| 95 outAppend->append(kTabs, cnt); | 95 outAppend->append(kTabs, cnt); |
| 96 tabCnt -= cnt; | 96 tabCnt -= cnt; |
| 97 } | 97 } |
| 98 } | 98 } |
| 99 } | 99 } |
| 100 | 100 |
| 101 GrSLConstantVec GrGLSLMulVarBy4f(SkString* outAppend, | 101 GrSLConstantVec GrGLSLMulVarBy4f(SkString* outAppend, |
| 102 int tabCnt, | 102 int tabCnt, |
| 103 const char* vec4VarName, | 103 const char* vec4VarName, |
| 104 const char* mulFactor, | 104 const char* mulFactor, |
| 105 GrSLConstantVec mulFactorDefault) { | 105 GrSLConstantVec mulFactorDefault) { |
| 106 bool haveFactor = NULL != mulFactor && '\0' != *mulFactor; | 106 bool haveFactor = NULL != mulFactor && '\0' != *mulFactor; |
| 107 | 107 |
| 108 GrAssert(NULL != outAppend); | 108 SkASSERT(NULL != outAppend); |
| 109 GrAssert(NULL != vec4VarName); | 109 SkASSERT(NULL != vec4VarName); |
| 110 GrAssert(kNone_GrSLConstantVec != mulFactorDefault || haveFactor); | 110 SkASSERT(kNone_GrSLConstantVec != mulFactorDefault || haveFactor); |
| 111 | 111 |
| 112 if (!haveFactor) { | 112 if (!haveFactor) { |
| 113 if (kOnes_GrSLConstantVec == mulFactorDefault) { | 113 if (kOnes_GrSLConstantVec == mulFactorDefault) { |
| 114 return kNone_GrSLConstantVec; | 114 return kNone_GrSLConstantVec; |
| 115 } else { | 115 } else { |
| 116 GrAssert(kZeros_GrSLConstantVec == mulFactorDefault); | 116 SkASSERT(kZeros_GrSLConstantVec == mulFactorDefault); |
| 117 append_tabs(outAppend, tabCnt); | 117 append_tabs(outAppend, tabCnt); |
| 118 outAppend->appendf("%s = vec4(0, 0, 0, 0);\n", vec4VarName); | 118 outAppend->appendf("%s = vec4(0, 0, 0, 0);\n", vec4VarName); |
| 119 return kZeros_GrSLConstantVec; | 119 return kZeros_GrSLConstantVec; |
| 120 } | 120 } |
| 121 } | 121 } |
| 122 append_tabs(outAppend, tabCnt); | 122 append_tabs(outAppend, tabCnt); |
| 123 outAppend->appendf("%s *= %s;\n", vec4VarName, mulFactor); | 123 outAppend->appendf("%s *= %s;\n", vec4VarName, mulFactor); |
| 124 return kNone_GrSLConstantVec; | 124 return kNone_GrSLConstantVec; |
| 125 } | 125 } |
| 126 | 126 |
| 127 GrSLConstantVec GrGLSLGetComponent4f(SkString* outAppend, | 127 GrSLConstantVec GrGLSLGetComponent4f(SkString* outAppend, |
| 128 const char* expr, | 128 const char* expr, |
| 129 GrColorComponentFlags component, | 129 GrColorComponentFlags component, |
| 130 GrSLConstantVec defaultExpr, | 130 GrSLConstantVec defaultExpr, |
| 131 bool omitIfConst) { | 131 bool omitIfConst) { |
| 132 if (NULL == expr || '\0' == *expr) { | 132 if (NULL == expr || '\0' == *expr) { |
| 133 GrAssert(defaultExpr != kNone_GrSLConstantVec); | 133 SkASSERT(defaultExpr != kNone_GrSLConstantVec); |
| 134 if (!omitIfConst) { | 134 if (!omitIfConst) { |
| 135 if (kOnes_GrSLConstantVec == defaultExpr) { | 135 if (kOnes_GrSLConstantVec == defaultExpr) { |
| 136 outAppend->append("1.0"); | 136 outAppend->append("1.0"); |
| 137 } else { | 137 } else { |
| 138 GrAssert(kZeros_GrSLConstantVec == defaultExpr); | 138 SkASSERT(kZeros_GrSLConstantVec == defaultExpr); |
| 139 outAppend->append("0.0"); | 139 outAppend->append("0.0"); |
| 140 } | 140 } |
| 141 } | 141 } |
| 142 return defaultExpr; | 142 return defaultExpr; |
| 143 } else { | 143 } else { |
| 144 outAppend->appendf("(%s).%c", expr, GrColorComponentFlagToChar(component
)); | 144 outAppend->appendf("(%s).%c", expr, GrColorComponentFlagToChar(component
)); |
| 145 return kNone_GrSLConstantVec; | 145 return kNone_GrSLConstantVec; |
| 146 } | 146 } |
| 147 } | 147 } |
| OLD | NEW |