| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2013 Google Inc. | 2 * Copyright 2013 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 "gl/builders/GrGLProgramBuilder.h" | 8 #include "gl/builders/GrGLProgramBuilder.h" |
| 9 #include "GrBezierEffect.h" | 9 #include "GrBezierEffect.h" |
| 10 | 10 |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 53 | 53 |
| 54 builder->addVarying(kVec4f_GrSLType, "ConicCoeffs", | 54 builder->addVarying(kVec4f_GrSLType, "ConicCoeffs", |
| 55 &vsName, &fsName); | 55 &vsName, &fsName); |
| 56 | 56 |
| 57 GrGLVertexShaderBuilder* vsBuilder = builder->getVertexShaderBuilder(); | 57 GrGLVertexShaderBuilder* vsBuilder = builder->getVertexShaderBuilder(); |
| 58 const SkString* attr0Name = | 58 const SkString* attr0Name = |
| 59 vsBuilder->getEffectAttributeName(drawEffect.getVertexAttribIndices()[0]
); | 59 vsBuilder->getEffectAttributeName(drawEffect.getVertexAttribIndices()[0]
); |
| 60 vsBuilder->codeAppendf("\t%s = %s;\n", vsName, attr0Name->c_str()); | 60 vsBuilder->codeAppendf("\t%s = %s;\n", vsName, attr0Name->c_str()); |
| 61 | 61 |
| 62 GrGLFragmentShaderBuilder* fsBuilder = builder->getFragmentShaderBuilder(); | 62 GrGLFragmentShaderBuilder* fsBuilder = builder->getFragmentShaderBuilder(); |
| 63 fsBuilder->codeAppend("\t\tfloat edgeAlpha;\n"); | 63 |
| 64 GrGLShaderVar edgeAlpha("edgeAlpha", kFloat_GrSLType, 0, GrGLShaderVar::kHig
h_Precision); |
| 65 GrGLShaderVar dklmdx("dklmdx", kVec3f_GrSLType, 0, GrGLShaderVar::kHigh_Prec
ision); |
| 66 GrGLShaderVar dklmdy("dklmdy", kVec3f_GrSLType, 0, GrGLShaderVar::kHigh_Prec
ision); |
| 67 GrGLShaderVar dfdx("dfdx", kFloat_GrSLType, 0, GrGLShaderVar::kHigh_Precisio
n); |
| 68 GrGLShaderVar dfdy("dfdy", kFloat_GrSLType, 0, GrGLShaderVar::kHigh_Precisio
n); |
| 69 GrGLShaderVar gF("gF", kVec2f_GrSLType, 0, GrGLShaderVar::kHigh_Precision); |
| 70 GrGLShaderVar gFM("gFM", kFloat_GrSLType, 0, GrGLShaderVar::kHigh_Precision)
; |
| 71 GrGLShaderVar func("func", kFloat_GrSLType, 0, GrGLShaderVar::kHigh_Precisio
n); |
| 72 |
| 73 fsBuilder->declAppend(edgeAlpha); |
| 74 fsBuilder->declAppend(dklmdx); |
| 75 fsBuilder->declAppend(dklmdy); |
| 76 fsBuilder->declAppend(dfdx); |
| 77 fsBuilder->declAppend(dfdy); |
| 78 fsBuilder->declAppend(gF); |
| 79 fsBuilder->declAppend(gFM); |
| 80 fsBuilder->declAppend(func); |
| 64 | 81 |
| 65 switch (fEdgeType) { | 82 switch (fEdgeType) { |
| 66 case kHairlineAA_GrEffectEdgeType: { | 83 case kHairlineAA_GrEffectEdgeType: { |
| 67 SkAssertResult(fsBuilder->enableFeature( | 84 SkAssertResult(fsBuilder->enableFeature( |
| 68 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature)
); | 85 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature)
); |
| 69 fsBuilder->codeAppendf("\t\tvec3 dklmdx = dFdx(%s.xyz);\n", fsName); | 86 fsBuilder->codeAppendf("\t\t%s = dFdx(%s.xyz);\n", dklmdx.c_str(), f
sName); |
| 70 fsBuilder->codeAppendf("\t\tvec3 dklmdy = dFdy(%s.xyz);\n", fsName); | 87 fsBuilder->codeAppendf("\t\t%s = dFdy(%s.xyz);\n", dklmdy.c_str(), f
sName); |
| 71 fsBuilder->codeAppendf("\t\tfloat dfdx =\n" | 88 fsBuilder->codeAppendf("\t\t%s =\n" |
| 72 "\t\t\t2.0*%s.x*dklmdx.x - %s.y*dklmdx.z - %s
.z*dklmdx.y;\n", | 89 "\t\t\t2.0 * %s.x * %s.x - %s.y * %s.z - %s.z
* %s.y;\n", |
| 73 fsName, fsName, fsName); | 90 dfdx.c_str(), fsName, dklmdx.c_str(), fsName,
dklmdx.c_str(), |
| 74 fsBuilder->codeAppendf("\t\tfloat dfdy =\n" | 91 fsName, dklmdx.c_str()); |
| 75 "\t\t\t2.0*%s.x*dklmdy.x - %s.y*dklmdy.z - %s
.z*dklmdy.y;\n", | 92 fsBuilder->codeAppendf("\t\t%s =\n" |
| 76 fsName, fsName, fsName); | 93 "\t\t\t2.0 * %s.x * %s.x - %s.y * %s.z - %s.z
* %s.y;\n", |
| 77 fsBuilder->codeAppend("\t\tvec2 gF = vec2(dfdx, dfdy);\n"); | 94 dfdy.c_str(), fsName, dklmdy.c_str(), fsName,
dklmdy.c_str(), |
| 78 fsBuilder->codeAppend("\t\tfloat gFM = sqrt(dot(gF, gF));\n"); | 95 fsName, dklmdy.c_str()); |
| 79 fsBuilder->codeAppendf("\t\tfloat func = %s.x*%s.x - %s.y*%s.z;\n",
fsName, fsName, | 96 fsBuilder->codeAppendf("\t\t%s = vec2(%s, %s);\n", |
| 80 fsName, fsName); | 97 gF.c_str(), dfdx.c_str(), dfdy.c_str()); |
| 81 fsBuilder->codeAppend("\t\tfunc = abs(func);\n"); | 98 fsBuilder->codeAppendf("\t\t%s = sqrt(dot(%s, %s));\n", |
| 82 fsBuilder->codeAppend("\t\tedgeAlpha = func / gFM;\n"); | 99 gFM.c_str(), gF.c_str(), gF.c_str()); |
| 83 fsBuilder->codeAppend("\t\tedgeAlpha = max(1.0 - edgeAlpha, 0.0);\n"
); | 100 fsBuilder->codeAppendf("\t\t%s = %s.x*%s.x - %s.y*%s.z;\n", |
| 101 func.c_str(), fsName, fsName, fsName, fsName)
; |
| 102 fsBuilder->codeAppendf("\t\t%s = abs(%s);\n", func.c_str(), func.c_s
tr()); |
| 103 fsBuilder->codeAppendf("\t\t%s = %s / %s;\n", |
| 104 edgeAlpha.c_str(), func.c_str(), gFM.c_str())
; |
| 105 fsBuilder->codeAppendf("\t\t%s = max(1.0 - %s, 0.0);\n", |
| 106 edgeAlpha.c_str(), edgeAlpha.c_str()); |
| 84 // Add line below for smooth cubic ramp | 107 // Add line below for smooth cubic ramp |
| 85 // fsBuilder->codeAppend("\t\tedgeAlpha = edgeAlpha*edgeAlpha*(3.0-2
.0*edgeAlpha);\n"); | 108 // fsBuilder->codeAppendf("\t\t%s = %s * %s * (3.0 - 2.0 * %s);\n", |
| 109 // edgeAlpha.c_str(), edgeAlpha.c_str(), edge
Alpha.c_str(), |
| 110 // edgeAlpha.c_str()); |
| 86 break; | 111 break; |
| 87 } | 112 } |
| 88 case kFillAA_GrEffectEdgeType: { | 113 case kFillAA_GrEffectEdgeType: { |
| 89 SkAssertResult(fsBuilder->enableFeature( | 114 SkAssertResult(fsBuilder->enableFeature( |
| 90 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature)
); | 115 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature)
); |
| 91 fsBuilder->codeAppendf("\t\tvec3 dklmdx = dFdx(%s.xyz);\n", fsName); | 116 fsBuilder->codeAppendf("\t\t%s = dFdx(%s.xyz);\n", dklmdx.c_str(), f
sName); |
| 92 fsBuilder->codeAppendf("\t\tvec3 dklmdy = dFdy(%s.xyz);\n", fsName); | 117 fsBuilder->codeAppendf("\t\t%s = dFdy(%s.xyz);\n", dklmdy.c_str(), f
sName); |
| 93 fsBuilder->codeAppendf("\t\tfloat dfdx =\n" | 118 fsBuilder->codeAppendf("\t\t%s =\n" |
| 94 "\t\t\t2.0*%s.x*dklmdx.x - %s.y*dklmdx.z - %s
.z*dklmdx.y;\n", | 119 "\t\t\t2.0 * %s.x * %s.x - %s.y * %s.z - %s.z
* %s.y;\n", |
| 95 fsName, fsName, fsName); | 120 dfdx.c_str(), fsName, dklmdx.c_str(), fsName,
dklmdx.c_str(), |
| 96 fsBuilder->codeAppendf("\t\tfloat dfdy =\n" | 121 fsName, dklmdx.c_str()); |
| 97 "\t\t\t2.0*%s.x*dklmdy.x - %s.y*dklmdy.z - %s
.z*dklmdy.y;\n", | 122 fsBuilder->codeAppendf("\t\t%s =\n" |
| 98 fsName, fsName, fsName); | 123 "\t\t\t2.0 * %s.x * %s.x - %s.y * %s.z - %s.z
* %s.y;\n", |
| 99 fsBuilder->codeAppend("\t\tvec2 gF = vec2(dfdx, dfdy);\n"); | 124 dfdy.c_str(), fsName, dklmdy.c_str(), fsName,
dklmdy.c_str(), |
| 100 fsBuilder->codeAppend("\t\tfloat gFM = sqrt(dot(gF, gF));\n"); | 125 fsName, dklmdy.c_str()); |
| 101 fsBuilder->codeAppendf("\t\tfloat func = %s.x*%s.x - %s.y*%s.z;\n",
fsName, fsName, | 126 fsBuilder->codeAppendf("\t\t%s = vec2(%s, %s);\n", |
| 102 fsName, fsName); | 127 gF.c_str(), dfdx.c_str(), dfdy.c_str()); |
| 103 fsBuilder->codeAppend("\t\tedgeAlpha = func / gFM;\n"); | 128 fsBuilder->codeAppendf("\t\t%s = sqrt(dot(%s, %s));\n", |
| 104 fsBuilder->codeAppend("\t\tedgeAlpha = clamp(1.0 - edgeAlpha, 0.0, 1
.0);\n"); | 129 gFM.c_str(), gF.c_str(), gF.c_str()); |
| 130 fsBuilder->codeAppendf("\t\t%s = %s.x*%s.x - %s.y*%s.z;\n", |
| 131 func.c_str(), fsName, fsName, fsName, fsName)
; |
| 132 fsBuilder->codeAppendf("\t\t%s = %s / %s;\n", |
| 133 edgeAlpha.c_str(), func.c_str(), gFM.c_str())
; |
| 134 fsBuilder->codeAppendf("\t\t%s = clamp(1.0 - %s, 0.0, 1.0);\n", |
| 135 edgeAlpha.c_str(), edgeAlpha.c_str()); |
| 105 // Add line below for smooth cubic ramp | 136 // Add line below for smooth cubic ramp |
| 106 // fsBuilder->codeAppend("\t\tedgeAlpha = edgeAlpha*edgeAlpha*(3.0-2
.0*edgeAlpha);\n"); | 137 // fsBuilder->codeAppendf("\t\t%s = %s * %s * (3.0 - 2.0 * %s);\n", |
| 138 // edgeAlpha.c_str(), edgeAlpha.c_str(), edge
Alpha.c_str(), |
| 139 // edgeAlpha.c_str()); |
| 107 break; | 140 break; |
| 108 } | 141 } |
| 109 case kFillBW_GrEffectEdgeType: { | 142 case kFillBW_GrEffectEdgeType: { |
| 110 fsBuilder->codeAppendf("\t\tedgeAlpha = %s.x*%s.x - %s.y*%s.z;\n", f
sName, fsName, | 143 fsBuilder->codeAppendf("\t\t%s = %s.x*%s.x - %s.y*%s.z;\n", |
| 111 fsName, fsName); | 144 edgeAlpha.c_str(), fsName, fsName, fsName, fs
Name); |
| 112 fsBuilder->codeAppend("\t\tedgeAlpha = float(edgeAlpha < 0.0);\n"); | 145 fsBuilder->codeAppendf("\t\t%s = float(%s < 0.0);\n", |
| 146 edgeAlpha.c_str(), edgeAlpha.c_str()); |
| 113 break; | 147 break; |
| 114 } | 148 } |
| 115 default: | 149 default: |
| 116 SkFAIL("Shouldn't get here"); | 150 SkFAIL("Shouldn't get here"); |
| 117 } | 151 } |
| 118 | 152 |
| 119 fsBuilder->codeAppendf("\t%s = %s;\n", outputColor, | 153 fsBuilder->codeAppendf("\t%s = %s;\n", outputColor, |
| 120 (GrGLSLExpr4(inputColor) * GrGLSLExpr1("edgeAlpha")).
c_str()); | 154 (GrGLSLExpr4(inputColor) * GrGLSLExpr1(edgeAlpha.c_st
r())).c_str()); |
| 121 } | 155 } |
| 122 | 156 |
| 123 void GrGLConicEffect::GenKey(const GrDrawEffect& drawEffect, const GrGLCaps&, | 157 void GrGLConicEffect::GenKey(const GrDrawEffect& drawEffect, const GrGLCaps&, |
| 124 GrEffectKeyBuilder* b) { | 158 GrEffectKeyBuilder* b) { |
| 125 const GrConicEffect& ce = drawEffect.castEffect<GrConicEffect>(); | 159 const GrConicEffect& ce = drawEffect.castEffect<GrConicEffect>(); |
| 126 uint32_t key = ce.isAntiAliased() ? (ce.isFilled() ? 0x0 : 0x1) : 0x2; | 160 uint32_t key = ce.isAntiAliased() ? (ce.isFilled() ? 0x0 : 0x1) : 0x2; |
| 127 b->add32(key); | 161 b->add32(key); |
| 128 } | 162 } |
| 129 | 163 |
| 130 ////////////////////////////////////////////////////////////////////////////// | 164 ////////////////////////////////////////////////////////////////////////////// |
| (...skipping 316 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 447 const GrDrawTargetCaps& caps, | 481 const GrDrawTargetCaps& caps, |
| 448 GrTexture*[]) { | 482 GrTexture*[]) { |
| 449 GrEffect* effect; | 483 GrEffect* effect; |
| 450 do { | 484 do { |
| 451 GrEffectEdgeType edgeType = static_cast<GrEffectEdgeType>( | 485 GrEffectEdgeType edgeType = static_cast<GrEffectEdgeType>( |
| 452 random->nextULessThan(kGrEff
ectEdgeTypeCnt)); | 486 random->nextULessThan(kGrEff
ectEdgeTypeCnt)); |
| 453 effect = GrCubicEffect::Create(edgeType, caps); | 487 effect = GrCubicEffect::Create(edgeType, caps); |
| 454 } while (NULL == effect); | 488 } while (NULL == effect); |
| 455 return effect; | 489 return effect; |
| 456 } | 490 } |
| OLD | NEW |