Index: src/gpu/effects/GrDashingEffect.cpp |
diff --git a/src/gpu/effects/GrDashingEffect.cpp b/src/gpu/effects/GrDashingEffect.cpp |
index a4efd020d476750004f3829225efb6b74685e2a9..94cfd80b0c3b259c88fe468bb709043e771f6440 100644 |
--- a/src/gpu/effects/GrDashingEffect.cpp |
+++ b/src/gpu/effects/GrDashingEffect.cpp |
@@ -852,50 +852,55 @@ GLDashingCircleEffect::GLDashingCircleEffect() { |
void GLDashingCircleEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) { |
const DashingCircleEffect& dce = args.fGP.cast<DashingCircleEffect>(); |
GrGLSLGPBuilder* pb = args.fPB; |
- GrGLSLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); |
+ GrGLSLVertexBuilder* vertBuilder = args.fVertBuilder; |
// emit attributes |
- vsBuilder->emitAttributes(dce); |
+ vertBuilder->emitAttributes(dce); |
// XY are dashPos, Z is dashInterval |
GrGLSLVertToFrag dashParams(kVec3f_GrSLType); |
args.fPB->addVarying("DashParam", &dashParams); |
- vsBuilder->codeAppendf("%s = %s;", dashParams.vsOut(), dce.inDashParams()->fName); |
+ vertBuilder->codeAppendf("%s = %s;", dashParams.vsOut(), dce.inDashParams()->fName); |
// x refers to circle radius - 0.5, y refers to cicle's center x coord |
GrGLSLVertToFrag circleParams(kVec2f_GrSLType); |
args.fPB->addVarying("CircleParams", &circleParams); |
- vsBuilder->codeAppendf("%s = %s;", circleParams.vsOut(), dce.inCircleParams()->fName); |
+ vertBuilder->codeAppendf("%s = %s;", circleParams.vsOut(), dce.inCircleParams()->fName); |
+ GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder; |
// Setup pass through color |
if (!dce.colorIgnored()) { |
- this->setupUniformColor(pb, args.fOutputColor, &fColorUniform); |
+ this->setupUniformColor(pb, fragBuilder, args.fOutputColor, &fColorUniform); |
} |
// Setup position |
- this->setupPosition(pb, gpArgs, dce.inPosition()->fName); |
+ this->setupPosition(pb, vertBuilder, gpArgs, dce.inPosition()->fName); |
// emit transforms |
- this->emitTransforms(args.fPB, gpArgs->fPositionVar, dce.inPosition()->fName, dce.localMatrix(), |
- args.fTransformsIn, args.fTransformsOut); |
+ this->emitTransforms(args.fPB, |
+ vertBuilder, |
+ gpArgs->fPositionVar, |
+ dce.inPosition()->fName, |
+ dce.localMatrix(), |
+ args.fTransformsIn, |
+ args.fTransformsOut); |
// transforms all points so that we can compare them to our test circle |
- GrGLSLFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); |
- fsBuilder->codeAppendf("float xShifted = %s.x - floor(%s.x / %s.z) * %s.z;", |
- dashParams.fsIn(), dashParams.fsIn(), dashParams.fsIn(), |
- dashParams.fsIn()); |
- fsBuilder->codeAppendf("vec2 fragPosShifted = vec2(xShifted, %s.y);", dashParams.fsIn()); |
- fsBuilder->codeAppendf("vec2 center = vec2(%s.y, 0.0);", circleParams.fsIn()); |
- fsBuilder->codeAppend("float dist = length(center - fragPosShifted);"); |
+ fragBuilder->codeAppendf("float xShifted = %s.x - floor(%s.x / %s.z) * %s.z;", |
+ dashParams.fsIn(), dashParams.fsIn(), dashParams.fsIn(), |
+ dashParams.fsIn()); |
+ fragBuilder->codeAppendf("vec2 fragPosShifted = vec2(xShifted, %s.y);", dashParams.fsIn()); |
+ fragBuilder->codeAppendf("vec2 center = vec2(%s.y, 0.0);", circleParams.fsIn()); |
+ fragBuilder->codeAppend("float dist = length(center - fragPosShifted);"); |
if (dce.aaMode() != kBW_DashAAMode) { |
- fsBuilder->codeAppendf("float diff = dist - %s.x;", circleParams.fsIn()); |
- fsBuilder->codeAppend("diff = 1.0 - diff;"); |
- fsBuilder->codeAppend("float alpha = clamp(diff, 0.0, 1.0);"); |
+ fragBuilder->codeAppendf("float diff = dist - %s.x;", circleParams.fsIn()); |
+ fragBuilder->codeAppend("diff = 1.0 - diff;"); |
+ fragBuilder->codeAppend("float alpha = clamp(diff, 0.0, 1.0);"); |
} else { |
- fsBuilder->codeAppendf("float alpha = 1.0;"); |
- fsBuilder->codeAppendf("alpha *= dist < %s.x + 0.5 ? 1.0 : 0.0;", circleParams.fsIn()); |
+ fragBuilder->codeAppendf("float alpha = 1.0;"); |
+ fragBuilder->codeAppendf("alpha *= dist < %s.x + 0.5 ? 1.0 : 0.0;", circleParams.fsIn()); |
} |
- fsBuilder->codeAppendf("%s = vec4(alpha);", args.fOutputCoverage); |
+ fragBuilder->codeAppendf("%s = vec4(alpha);", args.fOutputCoverage); |
} |
void GLDashingCircleEffect::setData(const GrGLSLProgramDataManager& pdman, |
@@ -1058,69 +1063,74 @@ void GLDashingLineEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) { |
const DashingLineEffect& de = args.fGP.cast<DashingLineEffect>(); |
GrGLSLGPBuilder* pb = args.fPB; |
- GrGLSLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); |
+ GrGLSLVertexBuilder* vertBuilder = args.fVertBuilder; |
// emit attributes |
- vsBuilder->emitAttributes(de); |
+ vertBuilder->emitAttributes(de); |
// XY refers to dashPos, Z is the dash interval length |
GrGLSLVertToFrag inDashParams(kVec3f_GrSLType); |
args.fPB->addVarying("DashParams", &inDashParams, GrSLPrecision::kHigh_GrSLPrecision); |
- vsBuilder->codeAppendf("%s = %s;", inDashParams.vsOut(), de.inDashParams()->fName); |
+ vertBuilder->codeAppendf("%s = %s;", inDashParams.vsOut(), de.inDashParams()->fName); |
// The rect uniform's xyzw refer to (left + 0.5, top + 0.5, right - 0.5, bottom - 0.5), |
// respectively. |
GrGLSLVertToFrag inRectParams(kVec4f_GrSLType); |
args.fPB->addVarying("RectParams", &inRectParams, GrSLPrecision::kHigh_GrSLPrecision); |
- vsBuilder->codeAppendf("%s = %s;", inRectParams.vsOut(), de.inRectParams()->fName); |
+ vertBuilder->codeAppendf("%s = %s;", inRectParams.vsOut(), de.inRectParams()->fName); |
+ GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder; |
// Setup pass through color |
if (!de.colorIgnored()) { |
- this->setupUniformColor(pb, args.fOutputColor, &fColorUniform); |
+ this->setupUniformColor(pb, fragBuilder, args.fOutputColor, &fColorUniform); |
} |
- |
// Setup position |
- this->setupPosition(pb, gpArgs, de.inPosition()->fName); |
+ this->setupPosition(pb, vertBuilder, gpArgs, de.inPosition()->fName); |
// emit transforms |
- this->emitTransforms(args.fPB, gpArgs->fPositionVar, de.inPosition()->fName, de.localMatrix(), |
- args.fTransformsIn, args.fTransformsOut); |
+ this->emitTransforms(args.fPB, |
+ vertBuilder, |
+ gpArgs->fPositionVar, |
+ de.inPosition()->fName, |
+ de.localMatrix(), |
+ args.fTransformsIn, |
+ args.fTransformsOut); |
// transforms all points so that we can compare them to our test rect |
- GrGLSLFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); |
- fsBuilder->codeAppendf("float xShifted = %s.x - floor(%s.x / %s.z) * %s.z;", |
- inDashParams.fsIn(), inDashParams.fsIn(), inDashParams.fsIn(), |
- inDashParams.fsIn()); |
- fsBuilder->codeAppendf("vec2 fragPosShifted = vec2(xShifted, %s.y);", inDashParams.fsIn()); |
+ fragBuilder->codeAppendf("float xShifted = %s.x - floor(%s.x / %s.z) * %s.z;", |
+ inDashParams.fsIn(), inDashParams.fsIn(), inDashParams.fsIn(), |
+ inDashParams.fsIn()); |
+ fragBuilder->codeAppendf("vec2 fragPosShifted = vec2(xShifted, %s.y);", inDashParams.fsIn()); |
if (de.aaMode() == kEdgeAA_DashAAMode) { |
// The amount of coverage removed in x and y by the edges is computed as a pair of negative |
// numbers, xSub and ySub. |
- fsBuilder->codeAppend("float xSub, ySub;"); |
- fsBuilder->codeAppendf("xSub = min(fragPosShifted.x - %s.x, 0.0);", inRectParams.fsIn()); |
- fsBuilder->codeAppendf("xSub += min(%s.z - fragPosShifted.x, 0.0);", inRectParams.fsIn()); |
- fsBuilder->codeAppendf("ySub = min(fragPosShifted.y - %s.y, 0.0);", inRectParams.fsIn()); |
- fsBuilder->codeAppendf("ySub += min(%s.w - fragPosShifted.y, 0.0);", inRectParams.fsIn()); |
+ fragBuilder->codeAppend("float xSub, ySub;"); |
+ fragBuilder->codeAppendf("xSub = min(fragPosShifted.x - %s.x, 0.0);", inRectParams.fsIn()); |
+ fragBuilder->codeAppendf("xSub += min(%s.z - fragPosShifted.x, 0.0);", inRectParams.fsIn()); |
+ fragBuilder->codeAppendf("ySub = min(fragPosShifted.y - %s.y, 0.0);", inRectParams.fsIn()); |
+ fragBuilder->codeAppendf("ySub += min(%s.w - fragPosShifted.y, 0.0);", inRectParams.fsIn()); |
// Now compute coverage in x and y and multiply them to get the fraction of the pixel |
// covered. |
- fsBuilder->codeAppendf("float alpha = (1.0 + max(xSub, -1.0)) * (1.0 + max(ySub, -1.0));"); |
+ fragBuilder->codeAppendf( |
+ "float alpha = (1.0 + max(xSub, -1.0)) * (1.0 + max(ySub, -1.0));"); |
} else if (de.aaMode() == kMSAA_DashAAMode) { |
// For MSAA, we don't modulate the alpha by the Y distance, since MSAA coverage will handle |
// AA on the the top and bottom edges. The shader is only responsible for intra-dash alpha. |
- fsBuilder->codeAppend("float xSub;"); |
- fsBuilder->codeAppendf("xSub = min(fragPosShifted.x - %s.x, 0.0);", inRectParams.fsIn()); |
- fsBuilder->codeAppendf("xSub += min(%s.z - fragPosShifted.x, 0.0);", inRectParams.fsIn()); |
+ fragBuilder->codeAppend("float xSub;"); |
+ fragBuilder->codeAppendf("xSub = min(fragPosShifted.x - %s.x, 0.0);", inRectParams.fsIn()); |
+ fragBuilder->codeAppendf("xSub += min(%s.z - fragPosShifted.x, 0.0);", inRectParams.fsIn()); |
// Now compute coverage in x to get the fraction of the pixel covered. |
- fsBuilder->codeAppendf("float alpha = (1.0 + max(xSub, -1.0));"); |
+ fragBuilder->codeAppendf("float alpha = (1.0 + max(xSub, -1.0));"); |
} else { |
// Assuming the bounding geometry is tight so no need to check y values |
- fsBuilder->codeAppendf("float alpha = 1.0;"); |
- fsBuilder->codeAppendf("alpha *= (fragPosShifted.x - %s.x) > -0.5 ? 1.0 : 0.0;", |
- inRectParams.fsIn()); |
- fsBuilder->codeAppendf("alpha *= (%s.z - fragPosShifted.x) >= -0.5 ? 1.0 : 0.0;", |
- inRectParams.fsIn()); |
+ fragBuilder->codeAppendf("float alpha = 1.0;"); |
+ fragBuilder->codeAppendf("alpha *= (fragPosShifted.x - %s.x) > -0.5 ? 1.0 : 0.0;", |
+ inRectParams.fsIn()); |
+ fragBuilder->codeAppendf("alpha *= (%s.z - fragPosShifted.x) >= -0.5 ? 1.0 : 0.0;", |
+ inRectParams.fsIn()); |
} |
- fsBuilder->codeAppendf("%s = vec4(alpha);", args.fOutputCoverage); |
+ fragBuilder->codeAppendf("%s = vec4(alpha);", args.fOutputCoverage); |
} |
void GLDashingLineEffect::setData(const GrGLSLProgramDataManager& pdman, |