From c369e7c9992a86151a3ea0516ce5308c211b196b Mon Sep 17 00:00:00 2001 From: joshualitt Date: Wed, 22 Oct 2014 10:56:26 -0700 Subject: [PATCH] GP Emit Code takes a struct BUG=skia: Review URL: https://codereview.chromium.org/666693012 --- src/gpu/GrAAConvexPathRenderer.cpp | 20 ++-- src/gpu/GrAARectRenderer.cpp | 42 +++---- src/gpu/GrOvalRenderer.cpp | 65 ++++------- src/gpu/effects/GrBezierEffect.cpp | 87 +++++--------- .../effects/GrCustomCoordsTextureEffect.cpp | 22 ++-- src/gpu/effects/GrDashingEffect.cpp | 74 +++++------- .../effects/GrDistanceFieldTextureEffect.cpp | 106 ++++++++---------- src/gpu/gl/GrGLGeometryProcessor.h | 23 ++-- src/gpu/gl/builders/GrGLProgramBuilder.cpp | 7 +- 9 files changed, 165 insertions(+), 281 deletions(-) diff --git a/src/gpu/GrAAConvexPathRenderer.cpp b/src/gpu/GrAAConvexPathRenderer.cpp index d5bc307363..ef4a17107e 100644 --- a/src/gpu/GrAAConvexPathRenderer.cpp +++ b/src/gpu/GrAAConvexPathRenderer.cpp @@ -528,17 +528,11 @@ public: GLProcessor(const GrBackendProcessorFactory& factory, const GrProcessor&) : INHERITED (factory) {} - virtual void emitCode(GrGLGPBuilder* builder, - const GrGeometryProcessor& geometryProcessor, - const GrProcessorKey& key, - const char* outputColor, - const char* inputColor, - const TransformedCoordsArray&, - const TextureSamplerArray& samplers) SK_OVERRIDE { + virtual void emitCode(const EmitArgs& args) SK_OVERRIDE { const char *vsName, *fsName; - builder->addVarying(kVec4f_GrSLType, "QuadEdge", &vsName, &fsName); + args.fPB->addVarying(kVec4f_GrSLType, "QuadEdge", &vsName, &fsName); - GrGLGPFragmentBuilder* fsBuilder = builder->getFragmentShaderBuilder(); + GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); SkAssertResult(fsBuilder->enableFeature( GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature)); @@ -561,11 +555,11 @@ public: "clamp(0.5 - edgeAlpha / length(gF), 0.0, 1.0);\n\t\t}\n"); - fsBuilder->codeAppendf("\t%s = %s;\n", outputColor, - (GrGLSLExpr4(inputColor) * GrGLSLExpr1("edgeAlpha")).c_str()); + fsBuilder->codeAppendf("\t%s = %s;\n", args.fOutput, + (GrGLSLExpr4(args.fInput) * GrGLSLExpr1("edgeAlpha")).c_str()); - const GrShaderVar& inQuadEdge = geometryProcessor.cast().inQuadEdge(); - GrGLVertexBuilder* vsBuilder = builder->getVertexShaderBuilder(); + const GrShaderVar& inQuadEdge = args.fGP.cast().inQuadEdge(); + GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); vsBuilder->codeAppendf("\t%s = %s;\n", vsName, inQuadEdge.c_str()); } diff --git a/src/gpu/GrAARectRenderer.cpp b/src/gpu/GrAARectRenderer.cpp index edc8f71dd9..3b4fd63788 100644 --- a/src/gpu/GrAARectRenderer.cpp +++ b/src/gpu/GrAARectRenderer.cpp @@ -41,24 +41,18 @@ public: GLProcessor(const GrBackendProcessorFactory& factory, const GrProcessor&) : INHERITED (factory) {} - virtual void emitCode(GrGLGPBuilder* builder, - const GrGeometryProcessor& geometryProcessor, - const GrProcessorKey& key, - const char* outputColor, - const char* inputColor, - const TransformedCoordsArray&, - const TextureSamplerArray& samplers) SK_OVERRIDE { + virtual void emitCode(const EmitArgs& args) SK_OVERRIDE { // setup the varying for the Axis aligned rect effect // xy -> interpolated offset // zw -> w/2+0.5, h/2+0.5 const char *vsRectName, *fsRectName; - builder->addVarying(kVec4f_GrSLType, "Rect", &vsRectName, &fsRectName); + args.fPB->addVarying(kVec4f_GrSLType, "Rect", &vsRectName, &fsRectName); - const GrShaderVar& inRect = geometryProcessor.cast().inRect(); - GrGLVertexBuilder* vsBuilder = builder->getVertexShaderBuilder(); + const GrShaderVar& inRect = args.fGP.cast().inRect(); + GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); vsBuilder->codeAppendf("\t%s = %s;\n", vsRectName, inRect.c_str()); - GrGLGPFragmentBuilder* fsBuilder = builder->getFragmentShaderBuilder(); + GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); // TODO: compute all these offsets, spans, and scales in the VS fsBuilder->codeAppendf("\tfloat insetW = min(1.0, %s.z) - 0.5;\n", fsRectName); fsBuilder->codeAppendf("\tfloat insetH = min(1.0, %s.w) - 0.5;\n", fsRectName); @@ -83,8 +77,8 @@ public: fsRectName, fsRectName); - fsBuilder->codeAppendf("\t%s = %s;\n", outputColor, - (GrGLSLExpr4(inputColor) * GrGLSLExpr1("coverage")).c_str()); + fsBuilder->codeAppendf("\t%s = %s;\n", args.fOutput, + (GrGLSLExpr4(args.fInput) * GrGLSLExpr1("coverage")).c_str()); } static void GenKey(const GrProcessor&, const GrGLCaps&, GrProcessorKeyBuilder*) {} @@ -166,32 +160,26 @@ public: GLProcessor(const GrBackendProcessorFactory& factory, const GrProcessor&) : INHERITED (factory) {} - virtual void emitCode(GrGLGPBuilder* builder, - const GrGeometryProcessor& geometryProcessor, - const GrProcessorKey& key, - const char* outputColor, - const char* inputColor, - const TransformedCoordsArray&, - const TextureSamplerArray& samplers) SK_OVERRIDE { + virtual void emitCode(const EmitArgs& args) SK_OVERRIDE { // setup the varying for the center point and the unit vector // that points down the height of the rect const char *vsRectEdgeName, *fsRectEdgeName; - builder->addVarying(kVec4f_GrSLType, "RectEdge", + args.fPB->addVarying(kVec4f_GrSLType, "RectEdge", &vsRectEdgeName, &fsRectEdgeName); - const GrRectEffect& rectEffect = geometryProcessor.cast(); - GrGLVertexBuilder* vsBuilder = builder->getVertexShaderBuilder(); + const GrRectEffect& rectEffect = args.fGP.cast(); + GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); vsBuilder->codeAppendf("%s = %s;", vsRectEdgeName, rectEffect.inRectEdge().c_str()); // setup the varying for width/2+.5 and height/2+.5 const char *vsWidthHeightName, *fsWidthHeightName; - builder->addVarying(kVec2f_GrSLType, "WidthHeight", + args.fPB->addVarying(kVec2f_GrSLType, "WidthHeight", &vsWidthHeightName, &fsWidthHeightName); vsBuilder->codeAppendf("%s = %s;", vsWidthHeightName, rectEffect.inWidthHeight().c_str()); - GrGLGPFragmentBuilder* fsBuilder = builder->getFragmentShaderBuilder(); + GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); // TODO: compute all these offsets, spans, and scales in the VS fsBuilder->codeAppendf("\tfloat insetW = min(1.0, %s.x) - 0.5;\n", fsWidthHeightName); fsBuilder->codeAppendf("\tfloat insetH = min(1.0, %s.y) - 0.5;\n", fsWidthHeightName); @@ -223,8 +211,8 @@ public: fsWidthHeightName); - fsBuilder->codeAppendf("\t%s = %s;\n", outputColor, - (GrGLSLExpr4(inputColor) * GrGLSLExpr1("coverage")).c_str()); + fsBuilder->codeAppendf("\t%s = %s;\n", args.fOutput, + (GrGLSLExpr4(args.fInput) * GrGLSLExpr1("coverage")).c_str()); } static void GenKey(const GrProcessor&, const GrGLCaps&, GrProcessorKeyBuilder*) {} diff --git a/src/gpu/GrOvalRenderer.cpp b/src/gpu/GrOvalRenderer.cpp index 586365109a..85a538973b 100644 --- a/src/gpu/GrOvalRenderer.cpp +++ b/src/gpu/GrOvalRenderer.cpp @@ -92,21 +92,15 @@ public: GLProcessor(const GrBackendProcessorFactory& factory, const GrProcessor&) : INHERITED (factory) {} - virtual void emitCode(GrGLGPBuilder* builder, - const GrGeometryProcessor& geometryProcessor, - const GrProcessorKey& key, - const char* outputColor, - const char* inputColor, - const TransformedCoordsArray&, - const TextureSamplerArray& samplers) SK_OVERRIDE { - const CircleEdgeEffect& circleEffect = geometryProcessor.cast(); + virtual void emitCode(const EmitArgs& args) SK_OVERRIDE { + const CircleEdgeEffect& circleEffect = args.fGP.cast(); const char *vsName, *fsName; - builder->addVarying(kVec4f_GrSLType, "CircleEdge", &vsName, &fsName); + args.fPB->addVarying(kVec4f_GrSLType, "CircleEdge", &vsName, &fsName); - GrGLVertexBuilder* vsBuilder = builder->getVertexShaderBuilder();; + GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder();; vsBuilder->codeAppendf("\t%s = %s;\n", vsName, circleEffect.inCircleEdge().c_str()); - GrGLGPFragmentBuilder* fsBuilder = builder->getFragmentShaderBuilder(); + GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); fsBuilder->codeAppendf("\tfloat d = length(%s.xy);\n", fsName); fsBuilder->codeAppendf("\tfloat edgeAlpha = clamp(%s.z - d, 0.0, 1.0);\n", fsName); if (circleEffect.isStroked()) { @@ -114,8 +108,8 @@ public: fsBuilder->codeAppend("\tedgeAlpha *= innerAlpha;\n"); } - fsBuilder->codeAppendf("\t%s = %s;\n", outputColor, - (GrGLSLExpr4(inputColor) * GrGLSLExpr1("edgeAlpha")).c_str()); + fsBuilder->codeAppendf("\t%s = %s;\n", args.fOutput, + (GrGLSLExpr4(args.fInput) * GrGLSLExpr1("edgeAlpha")).c_str()); } static void GenKey(const GrProcessor& processor, const GrGLCaps&, @@ -209,29 +203,23 @@ public: GLProcessor(const GrBackendProcessorFactory& factory, const GrProcessor&) : INHERITED (factory) {} - virtual void emitCode(GrGLGPBuilder* builder, - const GrGeometryProcessor& geometryProcessor, - const GrProcessorKey& key, - const char* outputColor, - const char* inputColor, - const TransformedCoordsArray&, - const TextureSamplerArray& samplers) SK_OVERRIDE { - const EllipseEdgeEffect& ellipseEffect = geometryProcessor.cast(); + virtual void emitCode(const EmitArgs& args) SK_OVERRIDE { + const EllipseEdgeEffect& ellipseEffect = args.fGP.cast(); const char *vsOffsetName, *fsOffsetName; const char *vsRadiiName, *fsRadiiName; - builder->addVarying(kVec2f_GrSLType, "EllipseOffsets", &vsOffsetName, &fsOffsetName); + args.fPB->addVarying(kVec2f_GrSLType, "EllipseOffsets", &vsOffsetName, &fsOffsetName); - GrGLVertexBuilder* vsBuilder = builder->getVertexShaderBuilder(); + GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); vsBuilder->codeAppendf("%s = %s;", vsOffsetName, ellipseEffect.inEllipseOffset().c_str()); - builder->addVarying(kVec4f_GrSLType, "EllipseRadii", &vsRadiiName, &fsRadiiName); + args.fPB->addVarying(kVec4f_GrSLType, "EllipseRadii", &vsRadiiName, &fsRadiiName); vsBuilder->codeAppendf("%s = %s;", vsRadiiName, ellipseEffect.inEllipseRadii().c_str()); // for outer curve - GrGLGPFragmentBuilder* fsBuilder = builder->getFragmentShaderBuilder(); + GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); fsBuilder->codeAppendf("\tvec2 scaledOffset = %s*%s.xy;\n", fsOffsetName, fsRadiiName); fsBuilder->codeAppend("\tfloat test = dot(scaledOffset, scaledOffset) - 1.0;\n"); fsBuilder->codeAppendf("\tvec2 grad = 2.0*scaledOffset*%s.xy;\n", fsRadiiName); @@ -250,8 +238,8 @@ public: fsBuilder->codeAppend("\tedgeAlpha *= clamp(0.5+test*invlen, 0.0, 1.0);\n"); } - fsBuilder->codeAppendf("\t%s = %s;\n", outputColor, - (GrGLSLExpr4(inputColor) * GrGLSLExpr1("edgeAlpha")).c_str()); + fsBuilder->codeAppendf("\t%s = %s;\n", args.fOutput, + (GrGLSLExpr4(args.fInput) * GrGLSLExpr1("edgeAlpha")).c_str()); } static void GenKey(const GrProcessor& processor, const GrGLCaps&, @@ -357,30 +345,23 @@ public: GLProcessor(const GrBackendProcessorFactory& factory, const GrProcessor&) : INHERITED (factory) {} - virtual void emitCode(GrGLGPBuilder* builder, - const GrGeometryProcessor& geometryProcessor, - const GrProcessorKey& key, - const char* outputColor, - const char* inputColor, - const TransformedCoordsArray&, - const TextureSamplerArray& samplers) SK_OVERRIDE { - const DIEllipseEdgeEffect& ellipseEffect = - geometryProcessor.cast(); + virtual void emitCode(const EmitArgs& args) SK_OVERRIDE { + const DIEllipseEdgeEffect& ellipseEffect = args.fGP.cast(); const char *vsOffsetName0, *fsOffsetName0; - builder->addVarying(kVec2f_GrSLType, "EllipseOffsets0", + args.fPB->addVarying(kVec2f_GrSLType, "EllipseOffsets0", &vsOffsetName0, &fsOffsetName0); - GrGLVertexBuilder* vsBuilder = builder->getVertexShaderBuilder(); + GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); vsBuilder->codeAppendf("%s = %s;", vsOffsetName0, ellipseEffect.inEllipseOffsets0().c_str()); const char *vsOffsetName1, *fsOffsetName1; - builder->addVarying(kVec2f_GrSLType, "EllipseOffsets1", + args.fPB->addVarying(kVec2f_GrSLType, "EllipseOffsets1", &vsOffsetName1, &fsOffsetName1); vsBuilder->codeAppendf("\t%s = %s;\n", vsOffsetName1, ellipseEffect.inEllipseOffsets1().c_str()); - GrGLGPFragmentBuilder* fsBuilder = builder->getFragmentShaderBuilder(); + GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); SkAssertResult(fsBuilder->enableFeature( GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature)); // for outer curve @@ -417,8 +398,8 @@ public: fsBuilder->codeAppend("\tedgeAlpha *= clamp(0.5+test*invlen, 0.0, 1.0);\n"); } - fsBuilder->codeAppendf("\t%s = %s;\n", outputColor, - (GrGLSLExpr4(inputColor) * GrGLSLExpr1("edgeAlpha")).c_str()); + fsBuilder->codeAppendf("\t%s = %s;\n", args.fOutput, + (GrGLSLExpr4(args.fInput) * GrGLSLExpr1("edgeAlpha")).c_str()); } static void GenKey(const GrProcessor& processor, const GrGLCaps&, diff --git a/src/gpu/effects/GrBezierEffect.cpp b/src/gpu/effects/GrBezierEffect.cpp index 9a60b2f1db..661923d769 100644 --- a/src/gpu/effects/GrBezierEffect.cpp +++ b/src/gpu/effects/GrBezierEffect.cpp @@ -17,13 +17,7 @@ class GrGLConicEffect : public GrGLGeometryProcessor { public: GrGLConicEffect(const GrBackendProcessorFactory&, const GrProcessor&); - virtual void emitCode(GrGLGPBuilder* builder, - const GrGeometryProcessor& geometryProcessor, - const GrProcessorKey& key, - const char* outputColor, - const char* inputColor, - const TransformedCoordsArray&, - const TextureSamplerArray&) SK_OVERRIDE; + virtual void emitCode(const EmitArgs&) SK_OVERRIDE; static inline void GenKey(const GrProcessor&, const GrGLCaps&, GrProcessorKeyBuilder*); @@ -42,23 +36,16 @@ GrGLConicEffect::GrGLConicEffect(const GrBackendProcessorFactory& factory, fEdgeType = ce.getEdgeType(); } -void GrGLConicEffect::emitCode(GrGLGPBuilder* builder, - const GrGeometryProcessor& geometryProcessor, - const GrProcessorKey& key, - const char* outputColor, - const char* inputColor, - const TransformedCoordsArray&, - const TextureSamplerArray& samplers) { +void GrGLConicEffect::emitCode(const EmitArgs& args) { const char *vsName, *fsName; - builder->addVarying(kVec4f_GrSLType, "ConicCoeffs", - &vsName, &fsName); + args.fPB->addVarying(kVec4f_GrSLType, "ConicCoeffs", &vsName, &fsName); - const GrShaderVar& inConicCoeffs = geometryProcessor.cast().inConicCoeffs(); - GrGLVertexBuilder* vsBuilder = builder->getVertexShaderBuilder(); + const GrShaderVar& inConicCoeffs = args.fGP.cast().inConicCoeffs(); + GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); vsBuilder->codeAppendf("%s = %s;", vsName, inConicCoeffs.c_str()); - GrGLGPFragmentBuilder* fsBuilder = builder->getFragmentShaderBuilder(); + GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); fsBuilder->codeAppend("float edgeAlpha;"); switch (fEdgeType) { @@ -115,8 +102,8 @@ void GrGLConicEffect::emitCode(GrGLGPBuilder* builder, SkFAIL("Shouldn't get here"); } - fsBuilder->codeAppendf("%s = %s;", outputColor, - (GrGLSLExpr4(inputColor) * GrGLSLExpr1("edgeAlpha")).c_str()); + fsBuilder->codeAppendf("%s = %s;", args.fOutput, + (GrGLSLExpr4(args.fInput) * GrGLSLExpr1("edgeAlpha")).c_str()); } void GrGLConicEffect::GenKey(const GrProcessor& processor, const GrGLCaps&, @@ -171,13 +158,7 @@ class GrGLQuadEffect : public GrGLGeometryProcessor { public: GrGLQuadEffect(const GrBackendProcessorFactory&, const GrProcessor&); - virtual void emitCode(GrGLGPBuilder* builder, - const GrGeometryProcessor& geometryProcessor, - const GrProcessorKey& key, - const char* outputColor, - const char* inputColor, - const TransformedCoordsArray&, - const TextureSamplerArray&) SK_OVERRIDE; + virtual void emitCode(const EmitArgs&) SK_OVERRIDE; static inline void GenKey(const GrProcessor&, const GrGLCaps&, GrProcessorKeyBuilder*); @@ -196,21 +177,15 @@ GrGLQuadEffect::GrGLQuadEffect(const GrBackendProcessorFactory& factory, fEdgeType = ce.getEdgeType(); } -void GrGLQuadEffect::emitCode(GrGLGPBuilder* builder, - const GrGeometryProcessor& geometryProcessor, - const GrProcessorKey& key, - const char* outputColor, - const char* inputColor, - const TransformedCoordsArray&, - const TextureSamplerArray& samplers) { +void GrGLQuadEffect::emitCode(const EmitArgs& args) { const char *vsName, *fsName; - builder->addVarying(kVec4f_GrSLType, "HairQuadEdge", &vsName, &fsName); + args.fPB->addVarying(kVec4f_GrSLType, "HairQuadEdge", &vsName, &fsName); - GrGLVertexBuilder* vsBuilder = builder->getVertexShaderBuilder(); - const GrShaderVar& inHairQuadEdge = geometryProcessor.cast().inHairQuadEdge(); + GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); + const GrShaderVar& inHairQuadEdge = args.fGP.cast().inHairQuadEdge(); vsBuilder->codeAppendf("%s = %s;", vsName, inHairQuadEdge.c_str()); - GrGLGPFragmentBuilder* fsBuilder = builder->getFragmentShaderBuilder(); + GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); fsBuilder->codeAppendf("float edgeAlpha;"); switch (fEdgeType) { @@ -253,8 +228,8 @@ void GrGLQuadEffect::emitCode(GrGLGPBuilder* builder, SkFAIL("Shouldn't get here"); } - fsBuilder->codeAppendf("%s = %s;", outputColor, - (GrGLSLExpr4(inputColor) * GrGLSLExpr1("edgeAlpha")).c_str()); + fsBuilder->codeAppendf("%s = %s;", args.fOutput, + (GrGLSLExpr4(args.fInput) * GrGLSLExpr1("edgeAlpha")).c_str()); } void GrGLQuadEffect::GenKey(const GrProcessor& processor, const GrGLCaps&, @@ -309,13 +284,7 @@ class GrGLCubicEffect : public GrGLGeometryProcessor { public: GrGLCubicEffect(const GrBackendProcessorFactory&, const GrProcessor&); - virtual void emitCode(GrGLGPBuilder* builder, - const GrGeometryProcessor& geometryProcessor, - const GrProcessorKey& key, - const char* outputColor, - const char* inputColor, - const TransformedCoordsArray&, - const TextureSamplerArray&) SK_OVERRIDE; + virtual void emitCode(const EmitArgs&) SK_OVERRIDE; static inline void GenKey(const GrProcessor&, const GrGLCaps&, GrProcessorKeyBuilder*); @@ -334,23 +303,17 @@ GrGLCubicEffect::GrGLCubicEffect(const GrBackendProcessorFactory& factory, fEdgeType = ce.getEdgeType(); } -void GrGLCubicEffect::emitCode(GrGLGPBuilder* builder, - const GrGeometryProcessor& geometryProcessor, - const GrProcessorKey& key, - const char* outputColor, - const char* inputColor, - const TransformedCoordsArray&, - const TextureSamplerArray& samplers) { +void GrGLCubicEffect::emitCode(const EmitArgs& args) { const char *vsName, *fsName; - builder->addVarying(kVec4f_GrSLType, "CubicCoeffs", - &vsName, &fsName, GrGLShaderVar::kHigh_Precision); + args.fPB->addVarying(kVec4f_GrSLType, "CubicCoeffs", + &vsName, &fsName, GrGLShaderVar::kHigh_Precision); - GrGLVertexBuilder* vsBuilder = builder->getVertexShaderBuilder(); - const GrShaderVar& inCubicCoeffs = geometryProcessor.cast().inCubicCoeffs(); + GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); + const GrShaderVar& inCubicCoeffs = args.fGP.cast().inCubicCoeffs(); vsBuilder->codeAppendf("%s = %s;", vsName, inCubicCoeffs.c_str()); - GrGLGPFragmentBuilder* fsBuilder = builder->getFragmentShaderBuilder(); + GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); GrGLShaderVar edgeAlpha("edgeAlpha", kFloat_GrSLType, 0, GrGLShaderVar::kHigh_Precision); GrGLShaderVar dklmdx("dklmdx", kVec3f_GrSLType, 0, GrGLShaderVar::kHigh_Precision); @@ -433,8 +396,8 @@ void GrGLCubicEffect::emitCode(GrGLGPBuilder* builder, SkFAIL("Shouldn't get here"); } - fsBuilder->codeAppendf("%s = %s;", outputColor, - (GrGLSLExpr4(inputColor) * GrGLSLExpr1(edgeAlpha.c_str())).c_str()); + fsBuilder->codeAppendf("%s = %s;", args.fOutput, + (GrGLSLExpr4(args.fInput) * GrGLSLExpr1(edgeAlpha.c_str())).c_str()); } void GrGLCubicEffect::GenKey(const GrProcessor& processor, const GrGLCaps&, diff --git a/src/gpu/effects/GrCustomCoordsTextureEffect.cpp b/src/gpu/effects/GrCustomCoordsTextureEffect.cpp index 8c7555e8ff..84f6b43295 100644 --- a/src/gpu/effects/GrCustomCoordsTextureEffect.cpp +++ b/src/gpu/effects/GrCustomCoordsTextureEffect.cpp @@ -19,31 +19,25 @@ public: GrGLCustomCoordsTextureEffect(const GrBackendProcessorFactory& factory, const GrProcessor&) : INHERITED (factory) {} - virtual void emitCode(GrGLGPBuilder* builder, - const GrGeometryProcessor& geometryProcessor, - const GrProcessorKey& key, - const char* outputColor, - const char* inputColor, - const TransformedCoordsArray&, - const TextureSamplerArray& samplers) SK_OVERRIDE { + virtual void emitCode(const EmitArgs& args) SK_OVERRIDE { const GrCustomCoordsTextureEffect& customCoordsTextureEffect = - geometryProcessor.cast(); + args.fGP.cast(); SkASSERT(1 == customCoordsTextureEffect.getVertexAttribs().count()); SkString fsCoordName; const char* vsVaryingName; const char* fsVaryingNamePtr; - builder->addVarying(kVec2f_GrSLType, "textureCoords", &vsVaryingName, &fsVaryingNamePtr); + args.fPB->addVarying(kVec2f_GrSLType, "textureCoords", &vsVaryingName, &fsVaryingNamePtr); fsCoordName = fsVaryingNamePtr; - GrGLVertexBuilder* vsBuilder = builder->getVertexShaderBuilder(); + GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); const GrShaderVar& inTextureCoords = customCoordsTextureEffect.inTextureCoords(); vsBuilder->codeAppendf("\t%s = %s;\n", vsVaryingName, inTextureCoords.c_str()); - GrGLGPFragmentBuilder* fsBuilder = builder->getFragmentShaderBuilder(); - fsBuilder->codeAppendf("\t%s = ", outputColor); - fsBuilder->appendTextureLookupAndModulate(inputColor, - samplers[0], + GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); + fsBuilder->codeAppendf("\t%s = ", args.fOutput); + fsBuilder->appendTextureLookupAndModulate(args.fInput, + args.fSamplers[0], fsCoordName.c_str(), kVec2f_GrSLType); fsBuilder->codeAppend(";\n"); diff --git a/src/gpu/effects/GrDashingEffect.cpp b/src/gpu/effects/GrDashingEffect.cpp index 80735f0929..4f6eef1546 100644 --- a/src/gpu/effects/GrDashingEffect.cpp +++ b/src/gpu/effects/GrDashingEffect.cpp @@ -482,13 +482,7 @@ class GLDashingCircleEffect : public GrGLGeometryProcessor { public: GLDashingCircleEffect(const GrBackendProcessorFactory&, const GrProcessor&); - virtual void emitCode(GrGLGPBuilder* builder, - const GrGeometryProcessor& geometryProcessor, - const GrProcessorKey& key, - const char* outputColor, - const char* inputColor, - const TransformedCoordsArray&, - const TextureSamplerArray&) SK_OVERRIDE; + virtual void emitCode(const EmitArgs&) SK_OVERRIDE; static inline void GenKey(const GrProcessor&, const GrGLCaps&, GrProcessorKeyBuilder*); @@ -510,30 +504,24 @@ GLDashingCircleEffect::GLDashingCircleEffect(const GrBackendProcessorFactory& fa fPrevIntervalLength = SK_ScalarMax; } -void GLDashingCircleEffect::emitCode(GrGLGPBuilder* builder, - const GrGeometryProcessor& geometryProcessor, - const GrProcessorKey& key, - const char* outputColor, - const char* inputColor, - const TransformedCoordsArray&, - const TextureSamplerArray& samplers) { - const DashingCircleEffect& dce = geometryProcessor.cast(); +void GLDashingCircleEffect::emitCode(const EmitArgs& args) { + const DashingCircleEffect& dce = args.fGP.cast(); const char *paramName; // The param uniforms, xyz, refer to circle radius - 0.5, cicles center x coord, and // the total interval length of the dash. - fParamUniform = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility, - kVec3f_GrSLType, - "params", - ¶mName); + fParamUniform = args.fPB->addUniform(GrGLProgramBuilder::kFragment_Visibility, + kVec3f_GrSLType, + "params", + ¶mName); const char *vsCoordName, *fsCoordName; - builder->addVarying(kVec2f_GrSLType, "Coord", &vsCoordName, &fsCoordName); + args.fPB->addVarying(kVec2f_GrSLType, "Coord", &vsCoordName, &fsCoordName); - GrGLVertexBuilder* vsBuilder = builder->getVertexShaderBuilder(); + GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); vsBuilder->codeAppendf("\t%s = %s;\n", vsCoordName, dce.inCoord().c_str()); // transforms all points so that we can compare them to our test circle - GrGLGPFragmentBuilder* fsBuilder = builder->getFragmentShaderBuilder(); + GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); fsBuilder->codeAppendf("\t\tfloat xShifted = %s.x - floor(%s.x / %s.z) * %s.z;\n", fsCoordName, fsCoordName, paramName, paramName); fsBuilder->codeAppendf("\t\tvec2 fragPosShifted = vec2(xShifted, %s.y);\n", fsCoordName); @@ -547,8 +535,8 @@ void GLDashingCircleEffect::emitCode(GrGLGPBuilder* builder, fsBuilder->codeAppendf("\t\tfloat alpha = 1.0;\n"); fsBuilder->codeAppendf("\t\talpha *= dist < %s.x + 0.5 ? 1.0 : 0.0;\n", paramName); } - fsBuilder->codeAppendf("\t\t%s = %s;\n", outputColor, - (GrGLSLExpr4(inputColor) * GrGLSLExpr1("alpha")).c_str()); + fsBuilder->codeAppendf("\t\t%s = %s;\n", args.fOutput, + (GrGLSLExpr4(args.fInput) * GrGLSLExpr1("alpha")).c_str()); } void GLDashingCircleEffect::setData(const GrGLProgramDataManager& pdman @@ -693,13 +681,7 @@ class GLDashingLineEffect : public GrGLGeometryProcessor { public: GLDashingLineEffect(const GrBackendProcessorFactory&, const GrProcessor&); - virtual void emitCode(GrGLGPBuilder* builder, - const GrGeometryProcessor& geometryProcessor, - const GrProcessorKey& key, - const char* outputColor, - const char* inputColor, - const TransformedCoordsArray&, - const TextureSamplerArray&) SK_OVERRIDE; + virtual void emitCode(const EmitArgs&) SK_OVERRIDE; static inline void GenKey(const GrProcessor&, const GrGLCaps&, GrProcessorKeyBuilder*); @@ -720,35 +702,29 @@ GLDashingLineEffect::GLDashingLineEffect(const GrBackendProcessorFactory& factor fPrevIntervalLength = SK_ScalarMax; } -void GLDashingLineEffect::emitCode(GrGLGPBuilder* builder, - const GrGeometryProcessor& geometryProcessor, - const GrProcessorKey& key, - const char* outputColor, - const char* inputColor, - const TransformedCoordsArray&, - const TextureSamplerArray& samplers) { - const DashingLineEffect& de = geometryProcessor.cast(); +void GLDashingLineEffect::emitCode(const EmitArgs& args) { + const DashingLineEffect& de = args.fGP.cast(); const char *rectName; // The rect uniform's xyzw refer to (left + 0.5, top + 0.5, right - 0.5, bottom - 0.5), // respectively. - fRectUniform = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility, + fRectUniform = args.fPB->addUniform(GrGLProgramBuilder::kFragment_Visibility, kVec4f_GrSLType, "rect", &rectName); const char *intervalName; // The interval uniform's refers to the total length of the interval (on + off) - fIntervalUniform = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility, - kFloat_GrSLType, - "interval", - &intervalName); + fIntervalUniform = args.fPB->addUniform(GrGLProgramBuilder::kFragment_Visibility, + kFloat_GrSLType, + "interval", + &intervalName); const char *vsCoordName, *fsCoordName; - builder->addVarying(kVec2f_GrSLType, "Coord", &vsCoordName, &fsCoordName); - GrGLVertexBuilder* vsBuilder = builder->getVertexShaderBuilder(); + args.fPB->addVarying(kVec2f_GrSLType, "Coord", &vsCoordName, &fsCoordName); + GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); vsBuilder->codeAppendf("\t%s = %s;\n", vsCoordName, de.inCoord().c_str()); // transforms all points so that we can compare them to our test rect - GrGLGPFragmentBuilder* fsBuilder = builder->getFragmentShaderBuilder(); + GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); fsBuilder->codeAppendf("\t\tfloat xShifted = %s.x - floor(%s.x / %s) * %s;\n", fsCoordName, fsCoordName, intervalName, intervalName); fsBuilder->codeAppendf("\t\tvec2 fragPosShifted = vec2(xShifted, %s.y);\n", fsCoordName); @@ -769,8 +745,8 @@ void GLDashingLineEffect::emitCode(GrGLGPBuilder* builder, fsBuilder->codeAppendf("\t\talpha *= (fragPosShifted.x - %s.x) > -0.5 ? 1.0 : 0.0;\n", rectName); fsBuilder->codeAppendf("\t\talpha *= (%s.z - fragPosShifted.x) >= -0.5 ? 1.0 : 0.0;\n", rectName); } - fsBuilder->codeAppendf("\t\t%s = %s;\n", outputColor, - (GrGLSLExpr4(inputColor) * GrGLSLExpr1("alpha")).c_str()); + fsBuilder->codeAppendf("\t\t%s = %s;\n", args.fOutput, + (GrGLSLExpr4(args.fInput) * GrGLSLExpr1("alpha")).c_str()); } void GLDashingLineEffect::setData(const GrGLProgramDataManager& pdman, diff --git a/src/gpu/effects/GrDistanceFieldTextureEffect.cpp b/src/gpu/effects/GrDistanceFieldTextureEffect.cpp index da2e3da175..ca38e849eb 100755 --- a/src/gpu/effects/GrDistanceFieldTextureEffect.cpp +++ b/src/gpu/effects/GrDistanceFieldTextureEffect.cpp @@ -40,37 +40,31 @@ public: #endif {} - virtual void emitCode(GrGLGPBuilder* builder, - const GrGeometryProcessor& geometryProcessor, - const GrProcessorKey& key, - const char* outputColor, - const char* inputColor, - const TransformedCoordsArray&, - const TextureSamplerArray& samplers) SK_OVERRIDE { + virtual void emitCode(const EmitArgs& args) SK_OVERRIDE { const GrDistanceFieldTextureEffect& dfTexEffect = - geometryProcessor.cast(); + args.fGP.cast(); SkASSERT(1 == dfTexEffect.getVertexAttribs().count()); - GrGLGPFragmentBuilder* fsBuilder = builder->getFragmentShaderBuilder(); + GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); SkAssertResult(fsBuilder->enableFeature( GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature)); SkString fsCoordName; const char* vsCoordName; const char* fsCoordNamePtr; - builder->addVarying(kVec2f_GrSLType, "textureCoords", &vsCoordName, &fsCoordNamePtr); + args.fPB->addVarying(kVec2f_GrSLType, "textureCoords", &vsCoordName, &fsCoordNamePtr); fsCoordName = fsCoordNamePtr; - GrGLVertexBuilder* vsBuilder = builder->getVertexShaderBuilder(); + GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); vsBuilder->codeAppendf("\t%s = %s;\n", vsCoordName, dfTexEffect.inTextureCoords().c_str()); const char* textureSizeUniName = NULL; - fTextureSizeUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility, - kVec2f_GrSLType, "TextureSize", - &textureSizeUniName); + fTextureSizeUni = args.fPB->addUniform(GrGLProgramBuilder::kFragment_Visibility, + kVec2f_GrSLType, "TextureSize", + &textureSizeUniName); fsBuilder->codeAppend("\tvec4 texColor = "); - fsBuilder->appendTextureLookup(samplers[0], + fsBuilder->appendTextureLookup(args.fSamplers[0], fsCoordName.c_str(), kVec2f_GrSLType); fsBuilder->codeAppend(";\n"); @@ -92,7 +86,7 @@ public: fsBuilder->codeAppend("\tvec2 Jdy = dFdy(st);\n"); fsBuilder->codeAppend("\tvec2 uv_grad;\n"); - if (builder->ctxInfo().caps()->dropsTileOnZeroDivide()) { + if (args.fPB->ctxInfo().caps()->dropsTileOnZeroDivide()) { // this is to compensate for the Adreno, which likes to drop tiles on division by 0 fsBuilder->codeAppend("\tfloat uv_len2 = dot(uv, uv);\n"); fsBuilder->codeAppend("\tif (uv_len2 < 0.0001) {\n"); @@ -115,19 +109,19 @@ public: // adjust based on gamma const char* luminanceUniName = NULL; // width, height, 1/(3*width) - fLuminanceUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility, - kFloat_GrSLType, "Luminance", - &luminanceUniName); + fLuminanceUni = args.fPB->addUniform(GrGLProgramBuilder::kFragment_Visibility, + kFloat_GrSLType, "Luminance", + &luminanceUniName); fsBuilder->codeAppendf("\tuv = vec2(val, %s);\n", luminanceUniName); fsBuilder->codeAppend("\tvec4 gammaColor = "); - fsBuilder->appendTextureLookup(samplers[1], "uv", kVec2f_GrSLType); + fsBuilder->appendTextureLookup(args.fSamplers[1], "uv", kVec2f_GrSLType); fsBuilder->codeAppend(";\n"); fsBuilder->codeAppend("\tval = gammaColor.r;\n"); #endif - fsBuilder->codeAppendf("\t%s = %s;\n", outputColor, - (GrGLSLExpr4(inputColor) * GrGLSLExpr1("val")).c_str()); + fsBuilder->codeAppendf("\t%s = %s;\n", args.fOutput, + (GrGLSLExpr4(args.fInput) * GrGLSLExpr1("val")).c_str()); } virtual void setData(const GrGLProgramDataManager& pdman, @@ -261,37 +255,31 @@ public: : INHERITED(factory) , fTextureSize(SkISize::Make(-1, -1)) {} - virtual void emitCode(GrGLGPBuilder* builder, - const GrGeometryProcessor& effect, - const GrProcessorKey& key, - const char* outputColor, - const char* inputColor, - const TransformedCoordsArray&, - const TextureSamplerArray& samplers) SK_OVERRIDE { + virtual void emitCode(const EmitArgs& args) SK_OVERRIDE { const GrDistanceFieldNoGammaTextureEffect& dfTexEffect = - effect.cast(); + args.fGP.cast(); SkASSERT(1 == dfTexEffect.getVertexAttribs().count()); - GrGLGPFragmentBuilder* fsBuilder = builder->getFragmentShaderBuilder(); + GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); SkAssertResult(fsBuilder->enableFeature( GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature)); SkString fsCoordName; const char* vsCoordName; const char* fsCoordNamePtr; - builder->addVarying(kVec2f_GrSLType, "textureCoords", &vsCoordName, &fsCoordNamePtr); + args.fPB->addVarying(kVec2f_GrSLType, "textureCoords", &vsCoordName, &fsCoordNamePtr); fsCoordName = fsCoordNamePtr; - GrGLVertexBuilder* vsBuilder = builder->getVertexShaderBuilder(); + GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); vsBuilder->codeAppendf("%s = %s;", vsCoordName, dfTexEffect.inTextureCoords().c_str()); const char* textureSizeUniName = NULL; - fTextureSizeUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility, + fTextureSizeUni = args.fPB->addUniform(GrGLProgramBuilder::kFragment_Visibility, kVec2f_GrSLType, "TextureSize", &textureSizeUniName); fsBuilder->codeAppend("vec4 texColor = "); - fsBuilder->appendTextureLookup(samplers[0], + fsBuilder->appendTextureLookup(args.fSamplers[0], fsCoordName.c_str(), kVec2f_GrSLType); fsBuilder->codeAppend(";"); @@ -312,7 +300,7 @@ public: fsBuilder->codeAppend("vec2 Jdy = dFdy(st);"); fsBuilder->codeAppend("vec2 uv_grad;"); - if (builder->ctxInfo().caps()->dropsTileOnZeroDivide()) { + if (args.fPB->ctxInfo().caps()->dropsTileOnZeroDivide()) { // this is to compensate for the Adreno, which likes to drop tiles on division by 0 fsBuilder->codeAppend("float uv_len2 = dot(uv, uv);"); fsBuilder->codeAppend("if (uv_len2 < 0.0001) {"); @@ -331,8 +319,8 @@ public: } fsBuilder->codeAppend("float val = smoothstep(-afwidth, afwidth, distance);"); - fsBuilder->codeAppendf("%s = %s;", outputColor, - (GrGLSLExpr4(inputColor) * GrGLSLExpr1("val")).c_str()); + fsBuilder->codeAppendf("%s = %s;", args.fOutput, + (GrGLSLExpr4(args.fInput) * GrGLSLExpr1("val")).c_str()); } virtual void setData(const GrGLProgramDataManager& pdman, @@ -428,33 +416,27 @@ public: , fTextureSize(SkISize::Make(-1,-1)) , fTextColor(GrColor_ILLEGAL) {} - virtual void emitCode(GrGLGPBuilder* builder, - const GrGeometryProcessor& geometryProcessor, - const GrProcessorKey& key, - const char* outputColor, - const char* inputColor, - const TransformedCoordsArray&, - const TextureSamplerArray& samplers) SK_OVERRIDE { + virtual void emitCode(const EmitArgs& args) SK_OVERRIDE { const GrDistanceFieldLCDTextureEffect& dfTexEffect = - geometryProcessor.cast(); + args.fGP.cast(); SkASSERT(1 == dfTexEffect.getVertexAttribs().count()); SkString fsCoordName; const char* vsCoordName; const char* fsCoordNamePtr; - builder->addVarying(kVec2f_GrSLType, "textureCoords", &vsCoordName, &fsCoordNamePtr); + args.fPB->addVarying(kVec2f_GrSLType, "textureCoords", &vsCoordName, &fsCoordNamePtr); fsCoordName = fsCoordNamePtr; - GrGLVertexBuilder* vsBuilder = builder->getVertexShaderBuilder(); + GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); vsBuilder->codeAppendf("\t%s = %s;\n", vsCoordName, dfTexEffect.inTextureCoords().c_str()); const char* textureSizeUniName = NULL; // width, height, 1/(3*width) - fTextureSizeUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility, + fTextureSizeUni = args.fPB->addUniform(GrGLProgramBuilder::kFragment_Visibility, kVec3f_GrSLType, "TextureSize", &textureSizeUniName); - GrGLGPFragmentBuilder* fsBuilder = builder->getFragmentShaderBuilder(); + GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); SkAssertResult(fsBuilder->enableFeature( GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature)); @@ -474,20 +456,20 @@ public: // green is distance to uv center fsBuilder->codeAppend("\tvec4 texColor = "); - fsBuilder->appendTextureLookup(samplers[0], "uv", kVec2f_GrSLType); + fsBuilder->appendTextureLookup(args.fSamplers[0], "uv", kVec2f_GrSLType); fsBuilder->codeAppend(";\n"); fsBuilder->codeAppend("\tvec3 distance;\n"); fsBuilder->codeAppend("\tdistance.y = texColor.r;\n"); // red is distance to left offset fsBuilder->codeAppend("\tvec2 uv_adjusted = uv - offset;\n"); fsBuilder->codeAppend("\ttexColor = "); - fsBuilder->appendTextureLookup(samplers[0], "uv_adjusted", kVec2f_GrSLType); + fsBuilder->appendTextureLookup(args.fSamplers[0], "uv_adjusted", kVec2f_GrSLType); fsBuilder->codeAppend(";\n"); fsBuilder->codeAppend("\tdistance.x = texColor.r;\n"); // blue is distance to right offset fsBuilder->codeAppend("\tuv_adjusted = uv + offset;\n"); fsBuilder->codeAppend("\ttexColor = "); - fsBuilder->appendTextureLookup(samplers[0], "uv_adjusted", kVec2f_GrSLType); + fsBuilder->appendTextureLookup(args.fSamplers[0], "uv_adjusted", kVec2f_GrSLType); fsBuilder->codeAppend(";\n"); fsBuilder->codeAppend("\tdistance.z = texColor.r;\n"); @@ -509,7 +491,7 @@ public: fsBuilder->codeAppend("\tafwidth = abs(" SK_DistanceFieldAAFactor "*dx);\n"); } else { fsBuilder->codeAppend("\tvec2 uv_grad;\n"); - if (builder->ctxInfo().caps()->dropsTileOnZeroDivide()) { + if (args.fPB->ctxInfo().caps()->dropsTileOnZeroDivide()) { // this is to compensate for the Adreno, which likes to drop tiles on division by 0 fsBuilder->codeAppend("\tfloat uv_len2 = dot(uv, uv);\n"); fsBuilder->codeAppend("\tif (uv_len2 < 0.0001) {\n"); @@ -532,30 +514,30 @@ public: // adjust based on gamma const char* textColorUniName = NULL; // width, height, 1/(3*width) - fTextColorUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility, - kVec3f_GrSLType, "TextColor", - &textColorUniName); + fTextColorUni = args.fPB->addUniform(GrGLProgramBuilder::kFragment_Visibility, + kVec3f_GrSLType, "TextColor", + &textColorUniName); fsBuilder->codeAppendf("\tuv = vec2(val.x, %s.x);\n", textColorUniName); fsBuilder->codeAppend("\tvec4 gammaColor = "); - fsBuilder->appendTextureLookup(samplers[1], "uv", kVec2f_GrSLType); + fsBuilder->appendTextureLookup(args.fSamplers[1], "uv", kVec2f_GrSLType); fsBuilder->codeAppend(";\n"); fsBuilder->codeAppend("\tval.x = gammaColor.r;\n"); fsBuilder->codeAppendf("\tuv = vec2(val.y, %s.y);\n", textColorUniName); fsBuilder->codeAppend("\tgammaColor = "); - fsBuilder->appendTextureLookup(samplers[1], "uv", kVec2f_GrSLType); + fsBuilder->appendTextureLookup(args.fSamplers[1], "uv", kVec2f_GrSLType); fsBuilder->codeAppend(";\n"); fsBuilder->codeAppend("\tval.y = gammaColor.r;\n"); fsBuilder->codeAppendf("\tuv = vec2(val.z, %s.z);\n", textColorUniName); fsBuilder->codeAppend("\tgammaColor = "); - fsBuilder->appendTextureLookup(samplers[1], "uv", kVec2f_GrSLType); + fsBuilder->appendTextureLookup(args.fSamplers[1], "uv", kVec2f_GrSLType); fsBuilder->codeAppend(";\n"); fsBuilder->codeAppend("\tval.z = gammaColor.r;\n"); - fsBuilder->codeAppendf("\t%s = %s;\n", outputColor, - (GrGLSLExpr4(inputColor) * GrGLSLExpr4("val")).c_str()); + fsBuilder->codeAppendf("\t%s = %s;\n", args.fOutput, + (GrGLSLExpr4(args.fInput) * GrGLSLExpr4("val")).c_str()); } virtual void setData(const GrGLProgramDataManager& pdman, diff --git a/src/gpu/gl/GrGLGeometryProcessor.h b/src/gpu/gl/GrGLGeometryProcessor.h index e50f5987f2..b61535e098 100644 --- a/src/gpu/gl/GrGLGeometryProcessor.h +++ b/src/gpu/gl/GrGLGeometryProcessor.h @@ -22,17 +22,26 @@ public: GrGLGeometryProcessor(const GrBackendProcessorFactory& factory) : INHERITED(factory) {} + struct EmitArgs { + EmitArgs(GrGLGPBuilder* pb, + const GrGeometryProcessor& gp, + const GrProcessorKey& key, + const char* output, + const char* input, + const TextureSamplerArray& samplers) + : fPB(pb), fGP(gp), fKey(key), fOutput(output), fInput(input), fSamplers(samplers) {} + GrGLGPBuilder* fPB; + const GrGeometryProcessor& fGP; + const GrProcessorKey& fKey; + const char* fOutput; + const char* fInput; + const TextureSamplerArray& fSamplers; + }; /** * This is similar to emitCode() in the base class, except it takes a full shader builder. * This allows the effect subclass to emit vertex code. */ - virtual void emitCode(GrGLGPBuilder* builder, - const GrGeometryProcessor& geometryProcessor, - const GrProcessorKey& key, - const char* outputColor, - const char* inputColor, - const TransformedCoordsArray& coords, - const TextureSamplerArray& samplers) = 0; + virtual void emitCode(const EmitArgs&) = 0; private: typedef GrGLProcessor INHERITED; diff --git a/src/gpu/gl/builders/GrGLProgramBuilder.cpp b/src/gpu/gl/builders/GrGLProgramBuilder.cpp index 7af7e8c215..a628febb69 100644 --- a/src/gpu/gl/builders/GrGLProgramBuilder.cpp +++ b/src/gpu/gl/builders/GrGLProgramBuilder.cpp @@ -313,11 +313,8 @@ void GrGLProgramBuilder::emitAndInstallProc(const GrGeometryProcessor& gp, SkSTArray<4, GrGLProcessor::TextureSampler> samplers(gp.numTextures()); this->emitSamplers(gp, &samplers, fGeometryProcessor); - SkSTArray<2, GrGLProcessor::TransformedCoords> coords; - - // TODO remove coords from emit code signature, probably best to use a struct here so these - // updates are less painful - fGeometryProcessor->fGLProc->emitCode(this, gp, key, outColor, inColor, coords, samplers); + GrGLGeometryProcessor::EmitArgs args(this, gp, key, outColor, inColor, samplers); + fGeometryProcessor->fGLProc->emitCode(args); // We have to check that effects and the code they emit are consistent, ie if an effect // asks for dst color, then the emit code needs to follow suit -- 2.34.1