| 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 "GrBezierEffect.h" | 8 #include "GrBezierEffect.h" |
| 9 | 9 |
| 10 #include "gl/GrGLFragmentProcessor.h" | 10 #include "gl/GrGLFragmentProcessor.h" |
| 11 #include "gl/GrGLGeometryProcessor.h" | 11 #include "gl/GrGLGeometryProcessor.h" |
| 12 #include "gl/GrGLUtil.h" | 12 #include "gl/GrGLUtil.h" |
| 13 #include "gl/builders/GrGLProgramBuilder.h" | 13 #include "glsl/GrGLSLProgramBuilder.h" |
| 14 #include "glsl/GrGLSLProgramDataManager.h" | 14 #include "glsl/GrGLSLProgramDataManager.h" |
| 15 | 15 |
| 16 class GrGLConicEffect : public GrGLGeometryProcessor { | 16 class GrGLConicEffect : public GrGLGeometryProcessor { |
| 17 public: | 17 public: |
| 18 GrGLConicEffect(const GrGeometryProcessor&); | 18 GrGLConicEffect(const GrGeometryProcessor&); |
| 19 | 19 |
| 20 void onEmitCode(EmitArgs&, GrGPArgs*) override; | 20 void onEmitCode(EmitArgs&, GrGPArgs*) override; |
| 21 | 21 |
| 22 static inline void GenKey(const GrGeometryProcessor&, | 22 static inline void GenKey(const GrGeometryProcessor&, |
| 23 const GrGLSLCaps&, | 23 const GrGLSLCaps&, |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 67 }; | 67 }; |
| 68 | 68 |
| 69 GrGLConicEffect::GrGLConicEffect(const GrGeometryProcessor& processor) | 69 GrGLConicEffect::GrGLConicEffect(const GrGeometryProcessor& processor) |
| 70 : fViewMatrix(SkMatrix::InvalidMatrix()), fColor(GrColor_ILLEGAL), fCoverage
Scale(0xff) { | 70 : fViewMatrix(SkMatrix::InvalidMatrix()), fColor(GrColor_ILLEGAL), fCoverage
Scale(0xff) { |
| 71 const GrConicEffect& ce = processor.cast<GrConicEffect>(); | 71 const GrConicEffect& ce = processor.cast<GrConicEffect>(); |
| 72 fEdgeType = ce.getEdgeType(); | 72 fEdgeType = ce.getEdgeType(); |
| 73 } | 73 } |
| 74 | 74 |
| 75 void GrGLConicEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) { | 75 void GrGLConicEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) { |
| 76 GrGLSLGPBuilder* pb = args.fPB; | 76 GrGLSLGPBuilder* pb = args.fPB; |
| 77 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); | 77 GrGLSLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); |
| 78 const GrConicEffect& gp = args.fGP.cast<GrConicEffect>(); | 78 const GrConicEffect& gp = args.fGP.cast<GrConicEffect>(); |
| 79 | 79 |
| 80 // emit attributes | 80 // emit attributes |
| 81 vsBuilder->emitAttributes(gp); | 81 vsBuilder->emitAttributes(gp); |
| 82 | 82 |
| 83 GrGLSLVertToFrag v(kVec4f_GrSLType); | 83 GrGLSLVertToFrag v(kVec4f_GrSLType); |
| 84 args.fPB->addVarying("ConicCoeffs", &v); | 84 args.fPB->addVarying("ConicCoeffs", &v); |
| 85 vsBuilder->codeAppendf("%s = %s;", v.vsOut(), gp.inConicCoeffs()->fName); | 85 vsBuilder->codeAppendf("%s = %s;", v.vsOut(), gp.inConicCoeffs()->fName); |
| 86 | 86 |
| 87 // Setup pass through color | 87 // Setup pass through color |
| 88 if (!gp.colorIgnored()) { | 88 if (!gp.colorIgnored()) { |
| 89 this->setupUniformColor(args.fPB, args.fOutputColor, &fColorUniform); | 89 this->setupUniformColor(args.fPB, args.fOutputColor, &fColorUniform); |
| 90 } | 90 } |
| 91 | 91 |
| 92 // Setup position | 92 // Setup position |
| 93 this->setupPosition(pb, gpArgs, gp.inPosition()->fName, gp.viewMatrix(), &fV
iewMatrixUniform); | 93 this->setupPosition(pb, gpArgs, gp.inPosition()->fName, gp.viewMatrix(), &fV
iewMatrixUniform); |
| 94 | 94 |
| 95 // emit transforms with position | 95 // emit transforms with position |
| 96 this->emitTransforms(pb, gpArgs->fPositionVar, gp.inPosition()->fName, gp.lo
calMatrix(), | 96 this->emitTransforms(pb, gpArgs->fPositionVar, gp.inPosition()->fName, gp.lo
calMatrix(), |
| 97 args.fTransformsIn, args.fTransformsOut); | 97 args.fTransformsIn, args.fTransformsOut); |
| 98 | 98 |
| 99 GrGLFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); | 99 GrGLSLFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); |
| 100 fsBuilder->codeAppend("float edgeAlpha;"); | 100 fsBuilder->codeAppend("float edgeAlpha;"); |
| 101 | 101 |
| 102 switch (fEdgeType) { | 102 switch (fEdgeType) { |
| 103 case kHairlineAA_GrProcessorEdgeType: { | 103 case kHairlineAA_GrProcessorEdgeType: { |
| 104 SkAssertResult(fsBuilder->enableFeature( | 104 SkAssertResult(fsBuilder->enableFeature( |
| 105 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature)
); | 105 GrGLSLFragmentShaderBuilder::kStandardDerivatives_GLSLFeatur
e)); |
| 106 fsBuilder->codeAppendf("vec3 dklmdx = dFdx(%s.xyz);", v.fsIn()); | 106 fsBuilder->codeAppendf("vec3 dklmdx = dFdx(%s.xyz);", v.fsIn()); |
| 107 fsBuilder->codeAppendf("vec3 dklmdy = dFdy(%s.xyz);", v.fsIn()); | 107 fsBuilder->codeAppendf("vec3 dklmdy = dFdy(%s.xyz);", v.fsIn()); |
| 108 fsBuilder->codeAppendf("float dfdx =" | 108 fsBuilder->codeAppendf("float dfdx =" |
| 109 "2.0 * %s.x * dklmdx.x - %s.y * dklmdx.z - %s
.z * dklmdx.y;", | 109 "2.0 * %s.x * dklmdx.x - %s.y * dklmdx.z - %s
.z * dklmdx.y;", |
| 110 v.fsIn(), v.fsIn(), v.fsIn()); | 110 v.fsIn(), v.fsIn(), v.fsIn()); |
| 111 fsBuilder->codeAppendf("float dfdy =" | 111 fsBuilder->codeAppendf("float dfdy =" |
| 112 "2.0 * %s.x * dklmdy.x - %s.y * dklmdy.z - %s
.z * dklmdy.y;", | 112 "2.0 * %s.x * dklmdy.x - %s.y * dklmdy.z - %s
.z * dklmdy.y;", |
| 113 v.fsIn(), v.fsIn(), v.fsIn()); | 113 v.fsIn(), v.fsIn(), v.fsIn()); |
| 114 fsBuilder->codeAppend("vec2 gF = vec2(dfdx, dfdy);"); | 114 fsBuilder->codeAppend("vec2 gF = vec2(dfdx, dfdy);"); |
| 115 fsBuilder->codeAppend("float gFM = sqrt(dot(gF, gF));"); | 115 fsBuilder->codeAppend("float gFM = sqrt(dot(gF, gF));"); |
| 116 fsBuilder->codeAppendf("float func = %s.x*%s.x - %s.y*%s.z;", v.fsIn
(), v.fsIn(), | 116 fsBuilder->codeAppendf("float func = %s.x*%s.x - %s.y*%s.z;", v.fsIn
(), v.fsIn(), |
| 117 v.fsIn(), v.fsIn()); | 117 v.fsIn(), v.fsIn()); |
| 118 fsBuilder->codeAppend("func = abs(func);"); | 118 fsBuilder->codeAppend("func = abs(func);"); |
| 119 fsBuilder->codeAppend("edgeAlpha = func / gFM;"); | 119 fsBuilder->codeAppend("edgeAlpha = func / gFM;"); |
| 120 fsBuilder->codeAppend("edgeAlpha = max(1.0 - edgeAlpha, 0.0);"); | 120 fsBuilder->codeAppend("edgeAlpha = max(1.0 - edgeAlpha, 0.0);"); |
| 121 // Add line below for smooth cubic ramp | 121 // Add line below for smooth cubic ramp |
| 122 // fsBuilder->codeAppend("edgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*e
dgeAlpha);"); | 122 // fsBuilder->codeAppend("edgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*e
dgeAlpha);"); |
| 123 break; | 123 break; |
| 124 } | 124 } |
| 125 case kFillAA_GrProcessorEdgeType: { | 125 case kFillAA_GrProcessorEdgeType: { |
| 126 SkAssertResult(fsBuilder->enableFeature( | 126 SkAssertResult(fsBuilder->enableFeature( |
| 127 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature)
); | 127 GrGLSLFragmentShaderBuilder::kStandardDerivatives_GLSLFeatur
e)); |
| 128 fsBuilder->codeAppendf("vec3 dklmdx = dFdx(%s.xyz);", v.fsIn()); | 128 fsBuilder->codeAppendf("vec3 dklmdx = dFdx(%s.xyz);", v.fsIn()); |
| 129 fsBuilder->codeAppendf("vec3 dklmdy = dFdy(%s.xyz);", v.fsIn()); | 129 fsBuilder->codeAppendf("vec3 dklmdy = dFdy(%s.xyz);", v.fsIn()); |
| 130 fsBuilder->codeAppendf("float dfdx =" | 130 fsBuilder->codeAppendf("float dfdx =" |
| 131 "2.0 * %s.x * dklmdx.x - %s.y * dklmdx.z - %s
.z * dklmdx.y;", | 131 "2.0 * %s.x * dklmdx.x - %s.y * dklmdx.z - %s
.z * dklmdx.y;", |
| 132 v.fsIn(), v.fsIn(), v.fsIn()); | 132 v.fsIn(), v.fsIn(), v.fsIn()); |
| 133 fsBuilder->codeAppendf("float dfdy =" | 133 fsBuilder->codeAppendf("float dfdy =" |
| 134 "2.0 * %s.x * dklmdy.x - %s.y * dklmdy.z - %s
.z * dklmdy.y;", | 134 "2.0 * %s.x * dklmdy.x - %s.y * dklmdy.z - %s
.z * dklmdy.y;", |
| 135 v.fsIn(), v.fsIn(), v.fsIn()); | 135 v.fsIn(), v.fsIn(), v.fsIn()); |
| 136 fsBuilder->codeAppend("vec2 gF = vec2(dfdx, dfdy);"); | 136 fsBuilder->codeAppend("vec2 gF = vec2(dfdx, dfdy);"); |
| 137 fsBuilder->codeAppend("float gFM = sqrt(dot(gF, gF));"); | 137 fsBuilder->codeAppend("float gFM = sqrt(dot(gF, gF));"); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 149 fsBuilder->codeAppend("edgeAlpha = float(edgeAlpha < 0.0);"); | 149 fsBuilder->codeAppend("edgeAlpha = float(edgeAlpha < 0.0);"); |
| 150 break; | 150 break; |
| 151 } | 151 } |
| 152 default: | 152 default: |
| 153 SkFAIL("Shouldn't get here"); | 153 SkFAIL("Shouldn't get here"); |
| 154 } | 154 } |
| 155 | 155 |
| 156 // TODO should we really be doing this? | 156 // TODO should we really be doing this? |
| 157 if (gp.coverageScale() != 0xff) { | 157 if (gp.coverageScale() != 0xff) { |
| 158 const char* coverageScale; | 158 const char* coverageScale; |
| 159 fCoverageScaleUniform = pb->addUniform(GrGLProgramBuilder::kFragment_Vis
ibility, | 159 fCoverageScaleUniform = pb->addUniform(GrGLSLProgramBuilder::kFragment_V
isibility, |
| 160 kFloat_GrSLType, | 160 kFloat_GrSLType, |
| 161 kDefault_GrSLPrecision, | 161 kDefault_GrSLPrecision, |
| 162 "Coverage", | 162 "Coverage", |
| 163 &coverageScale); | 163 &coverageScale); |
| 164 fsBuilder->codeAppendf("%s = vec4(%s * edgeAlpha);", args.fOutputCoverag
e, coverageScale); | 164 fsBuilder->codeAppendf("%s = vec4(%s * edgeAlpha);", args.fOutputCoverag
e, coverageScale); |
| 165 } else { | 165 } else { |
| 166 fsBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCoverage); | 166 fsBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCoverage); |
| 167 } | 167 } |
| 168 } | 168 } |
| 169 | 169 |
| (...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 283 }; | 283 }; |
| 284 | 284 |
| 285 GrGLQuadEffect::GrGLQuadEffect(const GrGeometryProcessor& processor) | 285 GrGLQuadEffect::GrGLQuadEffect(const GrGeometryProcessor& processor) |
| 286 : fViewMatrix(SkMatrix::InvalidMatrix()), fColor(GrColor_ILLEGAL), fCoverage
Scale(0xff) { | 286 : fViewMatrix(SkMatrix::InvalidMatrix()), fColor(GrColor_ILLEGAL), fCoverage
Scale(0xff) { |
| 287 const GrQuadEffect& ce = processor.cast<GrQuadEffect>(); | 287 const GrQuadEffect& ce = processor.cast<GrQuadEffect>(); |
| 288 fEdgeType = ce.getEdgeType(); | 288 fEdgeType = ce.getEdgeType(); |
| 289 } | 289 } |
| 290 | 290 |
| 291 void GrGLQuadEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) { | 291 void GrGLQuadEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) { |
| 292 GrGLSLGPBuilder* pb = args.fPB; | 292 GrGLSLGPBuilder* pb = args.fPB; |
| 293 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); | 293 GrGLSLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); |
| 294 const GrQuadEffect& gp = args.fGP.cast<GrQuadEffect>(); | 294 const GrQuadEffect& gp = args.fGP.cast<GrQuadEffect>(); |
| 295 | 295 |
| 296 // emit attributes | 296 // emit attributes |
| 297 vsBuilder->emitAttributes(gp); | 297 vsBuilder->emitAttributes(gp); |
| 298 | 298 |
| 299 GrGLSLVertToFrag v(kVec4f_GrSLType); | 299 GrGLSLVertToFrag v(kVec4f_GrSLType); |
| 300 args.fPB->addVarying("HairQuadEdge", &v); | 300 args.fPB->addVarying("HairQuadEdge", &v); |
| 301 vsBuilder->codeAppendf("%s = %s;", v.vsOut(), gp.inHairQuadEdge()->fName); | 301 vsBuilder->codeAppendf("%s = %s;", v.vsOut(), gp.inHairQuadEdge()->fName); |
| 302 | 302 |
| 303 // Setup pass through color | 303 // Setup pass through color |
| 304 if (!gp.colorIgnored()) { | 304 if (!gp.colorIgnored()) { |
| 305 this->setupUniformColor(args.fPB, args.fOutputColor, &fColorUniform); | 305 this->setupUniformColor(args.fPB, args.fOutputColor, &fColorUniform); |
| 306 } | 306 } |
| 307 | 307 |
| 308 // Setup position | 308 // Setup position |
| 309 this->setupPosition(pb, gpArgs, gp.inPosition()->fName, gp.viewMatrix(), &fV
iewMatrixUniform); | 309 this->setupPosition(pb, gpArgs, gp.inPosition()->fName, gp.viewMatrix(), &fV
iewMatrixUniform); |
| 310 | 310 |
| 311 // emit transforms with position | 311 // emit transforms with position |
| 312 this->emitTransforms(pb, gpArgs->fPositionVar, gp.inPosition()->fName, gp.lo
calMatrix(), | 312 this->emitTransforms(pb, gpArgs->fPositionVar, gp.inPosition()->fName, gp.lo
calMatrix(), |
| 313 args.fTransformsIn, args.fTransformsOut); | 313 args.fTransformsIn, args.fTransformsOut); |
| 314 | 314 |
| 315 GrGLFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); | 315 GrGLSLFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); |
| 316 fsBuilder->codeAppendf("float edgeAlpha;"); | 316 fsBuilder->codeAppendf("float edgeAlpha;"); |
| 317 | 317 |
| 318 switch (fEdgeType) { | 318 switch (fEdgeType) { |
| 319 case kHairlineAA_GrProcessorEdgeType: { | 319 case kHairlineAA_GrProcessorEdgeType: { |
| 320 SkAssertResult(fsBuilder->enableFeature( | 320 SkAssertResult(fsBuilder->enableFeature( |
| 321 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature)
); | 321 GrGLSLFragmentShaderBuilder::kStandardDerivatives_GLSLFeatur
e)); |
| 322 fsBuilder->codeAppendf("vec2 duvdx = dFdx(%s.xy);", v.fsIn()); | 322 fsBuilder->codeAppendf("vec2 duvdx = dFdx(%s.xy);", v.fsIn()); |
| 323 fsBuilder->codeAppendf("vec2 duvdy = dFdy(%s.xy);", v.fsIn()); | 323 fsBuilder->codeAppendf("vec2 duvdy = dFdy(%s.xy);", v.fsIn()); |
| 324 fsBuilder->codeAppendf("vec2 gF = vec2(2.0 * %s.x * duvdx.x - duvdx.
y," | 324 fsBuilder->codeAppendf("vec2 gF = vec2(2.0 * %s.x * duvdx.x - duvdx.
y," |
| 325 " 2.0 * %s.x * duvdy.x - duvdy.
y);", | 325 " 2.0 * %s.x * duvdy.x - duvdy.
y);", |
| 326 v.fsIn(), v.fsIn()); | 326 v.fsIn(), v.fsIn()); |
| 327 fsBuilder->codeAppendf("edgeAlpha = (%s.x * %s.x - %s.y);", v.fsIn()
, v.fsIn(), v.fsIn()); | 327 fsBuilder->codeAppendf("edgeAlpha = (%s.x * %s.x - %s.y);", v.fsIn()
, v.fsIn(), v.fsIn()); |
| 328 fsBuilder->codeAppend("edgeAlpha = sqrt(edgeAlpha * edgeAlpha / dot(
gF, gF));"); | 328 fsBuilder->codeAppend("edgeAlpha = sqrt(edgeAlpha * edgeAlpha / dot(
gF, gF));"); |
| 329 fsBuilder->codeAppend("edgeAlpha = max(1.0 - edgeAlpha, 0.0);"); | 329 fsBuilder->codeAppend("edgeAlpha = max(1.0 - edgeAlpha, 0.0);"); |
| 330 // Add line below for smooth cubic ramp | 330 // Add line below for smooth cubic ramp |
| 331 // fsBuilder->codeAppend("edgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*e
dgeAlpha);"); | 331 // fsBuilder->codeAppend("edgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*e
dgeAlpha);"); |
| 332 break; | 332 break; |
| 333 } | 333 } |
| 334 case kFillAA_GrProcessorEdgeType: { | 334 case kFillAA_GrProcessorEdgeType: { |
| 335 SkAssertResult(fsBuilder->enableFeature( | 335 SkAssertResult(fsBuilder->enableFeature( |
| 336 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature)
); | 336 GrGLSLFragmentShaderBuilder::kStandardDerivatives_GLSLFeatur
e)); |
| 337 fsBuilder->codeAppendf("vec2 duvdx = dFdx(%s.xy);", v.fsIn()); | 337 fsBuilder->codeAppendf("vec2 duvdx = dFdx(%s.xy);", v.fsIn()); |
| 338 fsBuilder->codeAppendf("vec2 duvdy = dFdy(%s.xy);", v.fsIn()); | 338 fsBuilder->codeAppendf("vec2 duvdy = dFdy(%s.xy);", v.fsIn()); |
| 339 fsBuilder->codeAppendf("vec2 gF = vec2(2.0 * %s.x * duvdx.x - duvdx.
y," | 339 fsBuilder->codeAppendf("vec2 gF = vec2(2.0 * %s.x * duvdx.x - duvdx.
y," |
| 340 " 2.0 * %s.x * duvdy.x - duvdy.
y);", | 340 " 2.0 * %s.x * duvdy.x - duvdy.
y);", |
| 341 v.fsIn(), v.fsIn()); | 341 v.fsIn(), v.fsIn()); |
| 342 fsBuilder->codeAppendf("edgeAlpha = (%s.x * %s.x - %s.y);", v.fsIn()
, v.fsIn(), v.fsIn()); | 342 fsBuilder->codeAppendf("edgeAlpha = (%s.x * %s.x - %s.y);", v.fsIn()
, v.fsIn(), v.fsIn()); |
| 343 fsBuilder->codeAppend("edgeAlpha = edgeAlpha / sqrt(dot(gF, gF));"); | 343 fsBuilder->codeAppend("edgeAlpha = edgeAlpha / sqrt(dot(gF, gF));"); |
| 344 fsBuilder->codeAppend("edgeAlpha = clamp(1.0 - edgeAlpha, 0.0, 1.0);
"); | 344 fsBuilder->codeAppend("edgeAlpha = clamp(1.0 - edgeAlpha, 0.0, 1.0);
"); |
| 345 // Add line below for smooth cubic ramp | 345 // Add line below for smooth cubic ramp |
| 346 // fsBuilder->codeAppend("edgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*e
dgeAlpha);"); | 346 // fsBuilder->codeAppend("edgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*e
dgeAlpha);"); |
| 347 break; | 347 break; |
| 348 } | 348 } |
| 349 case kFillBW_GrProcessorEdgeType: { | 349 case kFillBW_GrProcessorEdgeType: { |
| 350 fsBuilder->codeAppendf("edgeAlpha = (%s.x * %s.x - %s.y);", v.fsIn()
, v.fsIn(), v.fsIn()); | 350 fsBuilder->codeAppendf("edgeAlpha = (%s.x * %s.x - %s.y);", v.fsIn()
, v.fsIn(), v.fsIn()); |
| 351 fsBuilder->codeAppend("edgeAlpha = float(edgeAlpha < 0.0);"); | 351 fsBuilder->codeAppend("edgeAlpha = float(edgeAlpha < 0.0);"); |
| 352 break; | 352 break; |
| 353 } | 353 } |
| 354 default: | 354 default: |
| 355 SkFAIL("Shouldn't get here"); | 355 SkFAIL("Shouldn't get here"); |
| 356 } | 356 } |
| 357 | 357 |
| 358 if (0xff != gp.coverageScale()) { | 358 if (0xff != gp.coverageScale()) { |
| 359 const char* coverageScale; | 359 const char* coverageScale; |
| 360 fCoverageScaleUniform = pb->addUniform(GrGLProgramBuilder::kFragment_Vis
ibility, | 360 fCoverageScaleUniform = pb->addUniform(GrGLSLProgramBuilder::kFragment_V
isibility, |
| 361 kFloat_GrSLType, | 361 kFloat_GrSLType, |
| 362 kDefault_GrSLPrecision, | 362 kDefault_GrSLPrecision, |
| 363 "Coverage", | 363 "Coverage", |
| 364 &coverageScale); | 364 &coverageScale); |
| 365 fsBuilder->codeAppendf("%s = vec4(%s * edgeAlpha);", args.fOutputCoverag
e, coverageScale); | 365 fsBuilder->codeAppendf("%s = vec4(%s * edgeAlpha);", args.fOutputCoverag
e, coverageScale); |
| 366 } else { | 366 } else { |
| 367 fsBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCoverage); | 367 fsBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCoverage); |
| 368 } | 368 } |
| 369 } | 369 } |
| 370 | 370 |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 470 typedef GrGLGeometryProcessor INHERITED; | 470 typedef GrGLGeometryProcessor INHERITED; |
| 471 }; | 471 }; |
| 472 | 472 |
| 473 GrGLCubicEffect::GrGLCubicEffect(const GrGeometryProcessor& processor) | 473 GrGLCubicEffect::GrGLCubicEffect(const GrGeometryProcessor& processor) |
| 474 : fViewMatrix(SkMatrix::InvalidMatrix()), fColor(GrColor_ILLEGAL) { | 474 : fViewMatrix(SkMatrix::InvalidMatrix()), fColor(GrColor_ILLEGAL) { |
| 475 const GrCubicEffect& ce = processor.cast<GrCubicEffect>(); | 475 const GrCubicEffect& ce = processor.cast<GrCubicEffect>(); |
| 476 fEdgeType = ce.getEdgeType(); | 476 fEdgeType = ce.getEdgeType(); |
| 477 } | 477 } |
| 478 | 478 |
| 479 void GrGLCubicEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) { | 479 void GrGLCubicEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) { |
| 480 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); | 480 GrGLSLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); |
| 481 const GrCubicEffect& gp = args.fGP.cast<GrCubicEffect>(); | 481 const GrCubicEffect& gp = args.fGP.cast<GrCubicEffect>(); |
| 482 | 482 |
| 483 // emit attributes | 483 // emit attributes |
| 484 vsBuilder->emitAttributes(gp); | 484 vsBuilder->emitAttributes(gp); |
| 485 | 485 |
| 486 GrGLSLVertToFrag v(kVec4f_GrSLType); | 486 GrGLSLVertToFrag v(kVec4f_GrSLType); |
| 487 args.fPB->addVarying("CubicCoeffs", &v, kHigh_GrSLPrecision); | 487 args.fPB->addVarying("CubicCoeffs", &v, kHigh_GrSLPrecision); |
| 488 vsBuilder->codeAppendf("%s = %s;", v.vsOut(), gp.inCubicCoeffs()->fName); | 488 vsBuilder->codeAppendf("%s = %s;", v.vsOut(), gp.inCubicCoeffs()->fName); |
| 489 | 489 |
| 490 // Setup pass through color | 490 // Setup pass through color |
| 491 if (!gp.colorIgnored()) { | 491 if (!gp.colorIgnored()) { |
| 492 this->setupUniformColor(args.fPB, args.fOutputColor, &fColorUniform); | 492 this->setupUniformColor(args.fPB, args.fOutputColor, &fColorUniform); |
| 493 } | 493 } |
| 494 | 494 |
| 495 // Setup position | 495 // Setup position |
| 496 this->setupPosition(args.fPB, gpArgs, gp.inPosition()->fName, gp.viewMatrix(
), | 496 this->setupPosition(args.fPB, gpArgs, gp.inPosition()->fName, gp.viewMatrix(
), |
| 497 &fViewMatrixUniform); | 497 &fViewMatrixUniform); |
| 498 | 498 |
| 499 // emit transforms with position | 499 // emit transforms with position |
| 500 this->emitTransforms(args.fPB, gpArgs->fPositionVar, gp.inPosition()->fName,
args.fTransformsIn, | 500 this->emitTransforms(args.fPB, gpArgs->fPositionVar, gp.inPosition()->fName,
args.fTransformsIn, |
| 501 args.fTransformsOut); | 501 args.fTransformsOut); |
| 502 | 502 |
| 503 GrGLFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); | 503 GrGLSLFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); |
| 504 | 504 |
| 505 GrGLSLShaderVar edgeAlpha("edgeAlpha", kFloat_GrSLType, 0, kHigh_GrSLPrecisi
on); | 505 GrGLSLShaderVar edgeAlpha("edgeAlpha", kFloat_GrSLType, 0, kHigh_GrSLPrecisi
on); |
| 506 GrGLSLShaderVar dklmdx("dklmdx", kVec3f_GrSLType, 0, kHigh_GrSLPrecision); | 506 GrGLSLShaderVar dklmdx("dklmdx", kVec3f_GrSLType, 0, kHigh_GrSLPrecision); |
| 507 GrGLSLShaderVar dklmdy("dklmdy", kVec3f_GrSLType, 0, kHigh_GrSLPrecision); | 507 GrGLSLShaderVar dklmdy("dklmdy", kVec3f_GrSLType, 0, kHigh_GrSLPrecision); |
| 508 GrGLSLShaderVar dfdx("dfdx", kFloat_GrSLType, 0, kHigh_GrSLPrecision); | 508 GrGLSLShaderVar dfdx("dfdx", kFloat_GrSLType, 0, kHigh_GrSLPrecision); |
| 509 GrGLSLShaderVar dfdy("dfdy", kFloat_GrSLType, 0, kHigh_GrSLPrecision); | 509 GrGLSLShaderVar dfdy("dfdy", kFloat_GrSLType, 0, kHigh_GrSLPrecision); |
| 510 GrGLSLShaderVar gF("gF", kVec2f_GrSLType, 0, kHigh_GrSLPrecision); | 510 GrGLSLShaderVar gF("gF", kVec2f_GrSLType, 0, kHigh_GrSLPrecision); |
| 511 GrGLSLShaderVar gFM("gFM", kFloat_GrSLType, 0, kHigh_GrSLPrecision); | 511 GrGLSLShaderVar gFM("gFM", kFloat_GrSLType, 0, kHigh_GrSLPrecision); |
| 512 GrGLSLShaderVar func("func", kFloat_GrSLType, 0, kHigh_GrSLPrecision); | 512 GrGLSLShaderVar func("func", kFloat_GrSLType, 0, kHigh_GrSLPrecision); |
| 513 | 513 |
| 514 fsBuilder->declAppend(edgeAlpha); | 514 fsBuilder->declAppend(edgeAlpha); |
| 515 fsBuilder->declAppend(dklmdx); | 515 fsBuilder->declAppend(dklmdx); |
| 516 fsBuilder->declAppend(dklmdy); | 516 fsBuilder->declAppend(dklmdy); |
| 517 fsBuilder->declAppend(dfdx); | 517 fsBuilder->declAppend(dfdx); |
| 518 fsBuilder->declAppend(dfdy); | 518 fsBuilder->declAppend(dfdy); |
| 519 fsBuilder->declAppend(gF); | 519 fsBuilder->declAppend(gF); |
| 520 fsBuilder->declAppend(gFM); | 520 fsBuilder->declAppend(gFM); |
| 521 fsBuilder->declAppend(func); | 521 fsBuilder->declAppend(func); |
| 522 | 522 |
| 523 switch (fEdgeType) { | 523 switch (fEdgeType) { |
| 524 case kHairlineAA_GrProcessorEdgeType: { | 524 case kHairlineAA_GrProcessorEdgeType: { |
| 525 SkAssertResult(fsBuilder->enableFeature( | 525 SkAssertResult(fsBuilder->enableFeature( |
| 526 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature)
); | 526 GrGLSLFragmentShaderBuilder::kStandardDerivatives_GLSLFeatur
e)); |
| 527 fsBuilder->codeAppendf("%s = dFdx(%s.xyz);", dklmdx.c_str(), v.fsIn(
)); | 527 fsBuilder->codeAppendf("%s = dFdx(%s.xyz);", dklmdx.c_str(), v.fsIn(
)); |
| 528 fsBuilder->codeAppendf("%s = dFdy(%s.xyz);", dklmdy.c_str(), v.fsIn(
)); | 528 fsBuilder->codeAppendf("%s = dFdy(%s.xyz);", dklmdy.c_str(), v.fsIn(
)); |
| 529 fsBuilder->codeAppendf("%s = 3.0 * %s.x * %s.x * %s.x - %s.y * %s.z
- %s.z * %s.y;", | 529 fsBuilder->codeAppendf("%s = 3.0 * %s.x * %s.x * %s.x - %s.y * %s.z
- %s.z * %s.y;", |
| 530 dfdx.c_str(), v.fsIn(), v.fsIn(), dklmdx.c_st
r(), v.fsIn(), | 530 dfdx.c_str(), v.fsIn(), v.fsIn(), dklmdx.c_st
r(), v.fsIn(), |
| 531 dklmdx.c_str(), v.fsIn(), dklmdx.c_str()); | 531 dklmdx.c_str(), v.fsIn(), dklmdx.c_str()); |
| 532 fsBuilder->codeAppendf("%s = 3.0 * %s.x * %s.x * %s.x - %s.y * %s.z
- %s.z * %s.y;", | 532 fsBuilder->codeAppendf("%s = 3.0 * %s.x * %s.x * %s.x - %s.y * %s.z
- %s.z * %s.y;", |
| 533 dfdy.c_str(), v.fsIn(), v.fsIn(), dklmdy.c_st
r(), v.fsIn(), | 533 dfdy.c_str(), v.fsIn(), v.fsIn(), dklmdy.c_st
r(), v.fsIn(), |
| 534 dklmdy.c_str(), v.fsIn(), dklmdy.c_str()); | 534 dklmdy.c_str(), v.fsIn(), dklmdy.c_str()); |
| 535 fsBuilder->codeAppendf("%s = vec2(%s, %s);", gF.c_str(), dfdx.c_str(
), dfdy.c_str()); | 535 fsBuilder->codeAppendf("%s = vec2(%s, %s);", gF.c_str(), dfdx.c_str(
), dfdy.c_str()); |
| 536 fsBuilder->codeAppendf("%s = sqrt(dot(%s, %s));", gFM.c_str(), gF.c_
str(), gF.c_str()); | 536 fsBuilder->codeAppendf("%s = sqrt(dot(%s, %s));", gFM.c_str(), gF.c_
str(), gF.c_str()); |
| 537 fsBuilder->codeAppendf("%s = %s.x * %s.x * %s.x - %s.y * %s.z;", | 537 fsBuilder->codeAppendf("%s = %s.x * %s.x * %s.x - %s.y * %s.z;", |
| 538 func.c_str(), v.fsIn(), v.fsIn(), v.fsIn(), v
.fsIn(), v.fsIn()); | 538 func.c_str(), v.fsIn(), v.fsIn(), v.fsIn(), v
.fsIn(), v.fsIn()); |
| 539 fsBuilder->codeAppendf("%s = abs(%s);", func.c_str(), func.c_str()); | 539 fsBuilder->codeAppendf("%s = abs(%s);", func.c_str(), func.c_str()); |
| 540 fsBuilder->codeAppendf("%s = %s / %s;", | 540 fsBuilder->codeAppendf("%s = %s / %s;", |
| 541 edgeAlpha.c_str(), func.c_str(), gFM.c_str())
; | 541 edgeAlpha.c_str(), func.c_str(), gFM.c_str())
; |
| 542 fsBuilder->codeAppendf("%s = max(1.0 - %s, 0.0);", | 542 fsBuilder->codeAppendf("%s = max(1.0 - %s, 0.0);", |
| 543 edgeAlpha.c_str(), edgeAlpha.c_str()); | 543 edgeAlpha.c_str(), edgeAlpha.c_str()); |
| 544 // Add line below for smooth cubic ramp | 544 // Add line below for smooth cubic ramp |
| 545 // fsBuilder->codeAppendf("%s = %s * %s * (3.0 - 2.0 * %s);", | 545 // fsBuilder->codeAppendf("%s = %s * %s * (3.0 - 2.0 * %s);", |
| 546 // edgeAlpha.c_str(), edgeAlpha.c_str(), edge
Alpha.c_str(), | 546 // edgeAlpha.c_str(), edgeAlpha.c_str(), edge
Alpha.c_str(), |
| 547 // edgeAlpha.c_str()); | 547 // edgeAlpha.c_str()); |
| 548 break; | 548 break; |
| 549 } | 549 } |
| 550 case kFillAA_GrProcessorEdgeType: { | 550 case kFillAA_GrProcessorEdgeType: { |
| 551 SkAssertResult(fsBuilder->enableFeature( | 551 SkAssertResult(fsBuilder->enableFeature( |
| 552 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature)
); | 552 GrGLSLFragmentShaderBuilder::kStandardDerivatives_GLSLFeatur
e)); |
| 553 fsBuilder->codeAppendf("%s = dFdx(%s.xyz);", dklmdx.c_str(), v.fsIn(
)); | 553 fsBuilder->codeAppendf("%s = dFdx(%s.xyz);", dklmdx.c_str(), v.fsIn(
)); |
| 554 fsBuilder->codeAppendf("%s = dFdy(%s.xyz);", dklmdy.c_str(), v.fsIn(
)); | 554 fsBuilder->codeAppendf("%s = dFdy(%s.xyz);", dklmdy.c_str(), v.fsIn(
)); |
| 555 fsBuilder->codeAppendf("%s =" | 555 fsBuilder->codeAppendf("%s =" |
| 556 "3.0 * %s.x * %s.x * %s.x - %s.y * %s.z - %s.
z * %s.y;", | 556 "3.0 * %s.x * %s.x * %s.x - %s.y * %s.z - %s.
z * %s.y;", |
| 557 dfdx.c_str(), v.fsIn(), v.fsIn(), dklmdx.c_st
r(), v.fsIn(), | 557 dfdx.c_str(), v.fsIn(), v.fsIn(), dklmdx.c_st
r(), v.fsIn(), |
| 558 dklmdx.c_str(), v.fsIn(), dklmdx.c_str()); | 558 dklmdx.c_str(), v.fsIn(), dklmdx.c_str()); |
| 559 fsBuilder->codeAppendf("%s = 3.0 * %s.x * %s.x * %s.x - %s.y * %s.z
- %s.z * %s.y;", | 559 fsBuilder->codeAppendf("%s = 3.0 * %s.x * %s.x * %s.x - %s.y * %s.z
- %s.z * %s.y;", |
| 560 dfdy.c_str(), v.fsIn(), v.fsIn(), dklmdy.c_st
r(), v.fsIn(), | 560 dfdy.c_str(), v.fsIn(), v.fsIn(), dklmdy.c_st
r(), v.fsIn(), |
| 561 dklmdy.c_str(), v.fsIn(), dklmdy.c_str()); | 561 dklmdy.c_str(), v.fsIn(), dklmdy.c_str()); |
| 562 fsBuilder->codeAppendf("%s = vec2(%s, %s);", gF.c_str(), dfdx.c_str(
), dfdy.c_str()); | 562 fsBuilder->codeAppendf("%s = vec2(%s, %s);", gF.c_str(), dfdx.c_str(
), dfdy.c_str()); |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 630 do { | 630 do { |
| 631 GrPrimitiveEdgeType edgeType = | 631 GrPrimitiveEdgeType edgeType = |
| 632 static_cast<GrPrimitiveEdgeType>( | 632 static_cast<GrPrimitiveEdgeType>( |
| 633 d->fRandom->nextULessThan(kGrProcessorEdgeTypeCnt)); | 633 d->fRandom->nextULessThan(kGrProcessorEdgeTypeCnt)); |
| 634 gp = GrCubicEffect::Create(GrRandomColor(d->fRandom), | 634 gp = GrCubicEffect::Create(GrRandomColor(d->fRandom), |
| 635 GrTest::TestMatrix(d->fRandom), edgeType, *d-
>fCaps); | 635 GrTest::TestMatrix(d->fRandom), edgeType, *d-
>fCaps); |
| 636 } while (nullptr == gp); | 636 } while (nullptr == gp); |
| 637 return gp; | 637 return gp; |
| 638 } | 638 } |
| 639 | 639 |
| OLD | NEW |