Index: src/gpu/effects/GrBezierEffect.cpp |
diff --git a/src/gpu/effects/GrBezierEffect.cpp b/src/gpu/effects/GrBezierEffect.cpp |
index 6f4f28a109abb1edcc6e9da7fe40706e7a35f03c..be1fef76afd9fca6938e1f288a392edfc4883f6c 100644 |
--- a/src/gpu/effects/GrBezierEffect.cpp |
+++ b/src/gpu/effects/GrBezierEffect.cpp |
@@ -12,6 +12,12 @@ |
#include "gl/GrGLGeometryProcessor.h" |
#include "gl/builders/GrGLProgramBuilder.h" |
+struct ConicBatchTracker { |
+ GrGPInput fInputColorType; |
+ GrColor fColor; |
+ uint8_t fCoverageScale; |
+}; |
+ |
class GrGLConicEffect : public GrGLGeometryProcessor { |
public: |
GrGLConicEffect(const GrGeometryProcessor&, |
@@ -24,30 +30,53 @@ public: |
const GrGLCaps&, |
GrProcessorKeyBuilder*); |
- virtual void setData(const GrGLProgramDataManager&, |
- const GrGeometryProcessor&, |
- const GrBatchTracker&) SK_OVERRIDE {} |
+ virtual void setData(const GrGLProgramDataManager& pdman, |
+ const GrPrimitiveProcessor&, |
+ const GrBatchTracker& bt) SK_OVERRIDE { |
+ const ConicBatchTracker& local = bt.cast<ConicBatchTracker>(); |
+ if (kUniform_GrGPInput == local.fInputColorType && local.fColor != fColor) { |
+ GrGLfloat c[4]; |
+ GrColorToRGBAFloat(local.fColor, c); |
+ pdman.set4fv(fColorUniform, 1, c); |
+ fColor = local.fColor; |
+ } |
+ if (0xff != local.fCoverageScale && fCoverageScale != local.fCoverageScale) { |
+ pdman.set1f(fCoverageScaleUniform, GrNormalizeByteToFloat(local.fCoverageScale)); |
+ fCoverageScale = local.fCoverageScale; |
+ } |
+ } |
private: |
+ GrColor fColor; |
+ uint8_t fCoverageScale; |
GrPrimitiveEdgeType fEdgeType; |
+ UniformHandle fColorUniform; |
+ UniformHandle fCoverageScaleUniform; |
typedef GrGLGeometryProcessor INHERITED; |
}; |
GrGLConicEffect::GrGLConicEffect(const GrGeometryProcessor& processor, |
- const GrBatchTracker& bt) { |
+ const GrBatchTracker& bt) |
+ : fColor(GrColor_ILLEGAL), fCoverageScale(0xff) { |
const GrConicEffect& ce = processor.cast<GrConicEffect>(); |
fEdgeType = ce.getEdgeType(); |
} |
void GrGLConicEffect::emitCode(const EmitArgs& args) { |
+ GrGLGPBuilder* pb = args.fPB; |
GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); |
const GrConicEffect& gp = args.fGP.cast<GrConicEffect>(); |
+ const ConicBatchTracker& local = args.fBT.cast<ConicBatchTracker>(); |
GrGLVertToFrag v(kVec4f_GrSLType); |
args.fPB->addVarying("ConicCoeffs", &v); |
vsBuilder->codeAppendf("%s = %s;", v.vsOut(), gp.inConicCoeffs()->fName); |
+ // Setup pass through color |
+ this->setupColorPassThrough(args.fPB, local.fInputColorType, args.fOutputColor, NULL, |
+ &fColorUniform); |
+ |
// setup coord outputs |
vsBuilder->codeAppendf("%s = %s;", vsBuilder->positionCoords(), gp.inPosition()->fName); |
vsBuilder->codeAppendf("%s = %s;", vsBuilder->localCoords(), gp.inPosition()->fName); |
@@ -113,15 +142,28 @@ void GrGLConicEffect::emitCode(const EmitArgs& args) { |
SkFAIL("Shouldn't get here"); |
} |
- fsBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCoverage); |
+ if (0xff != local.fCoverageScale) { |
+ const char* coverageScale; |
+ fCoverageScaleUniform = pb->addUniform(GrGLProgramBuilder::kFragment_Visibility, |
+ kFloat_GrSLType, |
+ kDefault_GrSLPrecision, |
+ "Coverage", |
+ &coverageScale); |
+ fsBuilder->codeAppendf("%s = vec4(%s * edgeAlpha);", args.fOutputCoverage, coverageScale); |
+ } else { |
+ fsBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCoverage); |
+ } |
} |
void GrGLConicEffect::GenKey(const GrGeometryProcessor& processor, |
- const GrBatchTracker&, |
+ const GrBatchTracker& bt, |
const GrGLCaps&, |
GrProcessorKeyBuilder* b) { |
const GrConicEffect& ce = processor.cast<GrConicEffect>(); |
+ const ConicBatchTracker& local = bt.cast<ConicBatchTracker>(); |
uint32_t key = ce.isAntiAliased() ? (ce.isFilled() ? 0x0 : 0x1) : 0x2; |
+ key |= kUniform_GrGPInput == local.fInputColorType ? 0x4 : 0x0; |
+ key |= 0xff != local.fCoverageScale ? 0x8 : 0x0; |
b->add32(key); |
} |
@@ -140,7 +182,7 @@ GrGLGeometryProcessor* GrConicEffect::createGLInstance(const GrBatchTracker& bt) |
} |
GrConicEffect::GrConicEffect(GrColor color, uint8_t coverage, GrPrimitiveEdgeType edgeType) |
- : INHERITED(color, false, coverage), fEdgeType(edgeType) { |
+ : INHERITED(color, false), fCoverageScale(coverage), fEdgeType(edgeType) { |
this->initClassID<GrConicEffect>(); |
fInPosition = &this->addVertexAttrib(GrAttribute("inPosition", kVec2f_GrVertexAttribType)); |
fInConicCoeffs = &this->addVertexAttrib(GrAttribute("inConicCoeffs", |
@@ -152,6 +194,20 @@ bool GrConicEffect::onIsEqual(const GrGeometryProcessor& other) const { |
return (ce.fEdgeType == fEdgeType); |
} |
+void GrConicEffect::initBatchTracker(GrBatchTracker* bt, const InitBT& init) const { |
+ ConicBatchTracker* local = bt->cast<ConicBatchTracker>(); |
+ local->fInputColorType = GetColorInputType(&local->fColor, this->color(), init, false); |
+ local->fCoverageScale = fCoverageScale; |
+} |
+ |
+bool GrConicEffect::onCanMakeEqual(const GrBatchTracker& m, const GrBatchTracker& t) const { |
+ const ConicBatchTracker& mine = m.cast<ConicBatchTracker>(); |
+ const ConicBatchTracker& theirs = t.cast<ConicBatchTracker>(); |
+ return CanCombineOutput(mine.fInputColorType, mine.fColor, |
+ theirs.fInputColorType, theirs.fColor) && |
+ mine.fCoverageScale == theirs.fCoverageScale; |
+} |
+ |
////////////////////////////////////////////////////////////////////////////// |
GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrConicEffect); |
@@ -173,6 +229,12 @@ GrGeometryProcessor* GrConicEffect::TestCreate(SkRandom* random, |
// Quad |
////////////////////////////////////////////////////////////////////////////// |
+struct QuadBatchTracker { |
+ GrGPInput fInputColorType; |
+ GrColor fColor; |
+ uint8_t fCoverageScale; |
+}; |
+ |
class GrGLQuadEffect : public GrGLGeometryProcessor { |
public: |
GrGLQuadEffect(const GrGeometryProcessor&, |
@@ -185,30 +247,53 @@ public: |
const GrGLCaps&, |
GrProcessorKeyBuilder*); |
- virtual void setData(const GrGLProgramDataManager&, |
- const GrGeometryProcessor&, |
- const GrBatchTracker&) SK_OVERRIDE {} |
+ virtual void setData(const GrGLProgramDataManager& pdman, |
+ const GrPrimitiveProcessor&, |
+ const GrBatchTracker& bt) SK_OVERRIDE { |
+ const QuadBatchTracker& local = bt.cast<QuadBatchTracker>(); |
+ if (kUniform_GrGPInput == local.fInputColorType && local.fColor != fColor) { |
+ GrGLfloat c[4]; |
+ GrColorToRGBAFloat(local.fColor, c); |
+ pdman.set4fv(fColorUniform, 1, c); |
+ fColor = local.fColor; |
+ } |
+ if (0xff != local.fCoverageScale && local.fCoverageScale != fCoverageScale) { |
+ pdman.set1f(fCoverageScaleUniform, GrNormalizeByteToFloat(local.fCoverageScale)); |
+ fCoverageScale = local.fCoverageScale; |
+ } |
+ } |
private: |
+ GrColor fColor; |
+ uint8_t fCoverageScale; |
GrPrimitiveEdgeType fEdgeType; |
+ UniformHandle fColorUniform; |
+ UniformHandle fCoverageScaleUniform; |
typedef GrGLGeometryProcessor INHERITED; |
}; |
GrGLQuadEffect::GrGLQuadEffect(const GrGeometryProcessor& processor, |
- const GrBatchTracker& bt) { |
+ const GrBatchTracker& bt) |
+ : fColor(GrColor_ILLEGAL), fCoverageScale(0xff) { |
const GrQuadEffect& ce = processor.cast<GrQuadEffect>(); |
fEdgeType = ce.getEdgeType(); |
} |
void GrGLQuadEffect::emitCode(const EmitArgs& args) { |
+ GrGLGPBuilder* pb = args.fPB; |
GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); |
const GrQuadEffect& gp = args.fGP.cast<GrQuadEffect>(); |
+ const QuadBatchTracker& local = args.fBT.cast<QuadBatchTracker>(); |
GrGLVertToFrag v(kVec4f_GrSLType); |
args.fPB->addVarying("HairQuadEdge", &v); |
vsBuilder->codeAppendf("%s = %s;", v.vsOut(), gp.inHairQuadEdge()->fName); |
+ // Setup pass through color |
+ this->setupColorPassThrough(args.fPB, local.fInputColorType, args.fOutputColor, NULL, |
+ &fColorUniform); |
+ |
// setup coord outputs |
vsBuilder->codeAppendf("%s = %s;", vsBuilder->positionCoords(), gp.inPosition()->fName); |
vsBuilder->codeAppendf("%s = %s;", vsBuilder->localCoords(), gp.inPosition()->fName); |
@@ -260,15 +345,28 @@ void GrGLQuadEffect::emitCode(const EmitArgs& args) { |
SkFAIL("Shouldn't get here"); |
} |
- fsBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCoverage); |
+ if (0xff != local.fCoverageScale) { |
+ const char* coverageScale; |
+ fCoverageScaleUniform = pb->addUniform(GrGLProgramBuilder::kFragment_Visibility, |
+ kFloat_GrSLType, |
+ kDefault_GrSLPrecision, |
+ "Coverage", |
+ &coverageScale); |
+ fsBuilder->codeAppendf("%s = vec4(%s * edgeAlpha);", args.fOutputCoverage, coverageScale); |
+ } else { |
+ fsBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCoverage); |
+ } |
} |
void GrGLQuadEffect::GenKey(const GrGeometryProcessor& processor, |
- const GrBatchTracker&, |
+ const GrBatchTracker& bt, |
const GrGLCaps&, |
GrProcessorKeyBuilder* b) { |
const GrQuadEffect& ce = processor.cast<GrQuadEffect>(); |
+ const QuadBatchTracker& local = bt.cast<QuadBatchTracker>(); |
uint32_t key = ce.isAntiAliased() ? (ce.isFilled() ? 0x0 : 0x1) : 0x2; |
+ key |= kUniform_GrGPInput == local.fInputColorType ? 0x4 : 0x0; |
+ key |= 0xff != local.fCoverageScale ? 0x8 : 0x0; |
b->add32(key); |
} |
@@ -287,7 +385,7 @@ GrGLGeometryProcessor* GrQuadEffect::createGLInstance(const GrBatchTracker& bt) |
} |
GrQuadEffect::GrQuadEffect(GrColor color, uint8_t coverage, GrPrimitiveEdgeType edgeType) |
- : INHERITED(color, false, coverage), fEdgeType(edgeType) { |
+ : INHERITED(color, false), fCoverageScale(coverage), fEdgeType(edgeType) { |
this->initClassID<GrQuadEffect>(); |
fInPosition = &this->addVertexAttrib(GrAttribute("inPosition", kVec2f_GrVertexAttribType)); |
fInHairQuadEdge = &this->addVertexAttrib(GrAttribute("inHairQuadEdge", |
@@ -299,6 +397,20 @@ bool GrQuadEffect::onIsEqual(const GrGeometryProcessor& other) const { |
return (ce.fEdgeType == fEdgeType); |
} |
+void GrQuadEffect::initBatchTracker(GrBatchTracker* bt, const InitBT& init) const { |
+ QuadBatchTracker* local = bt->cast<QuadBatchTracker>(); |
+ local->fInputColorType = GetColorInputType(&local->fColor, this->color(), init, false); |
+ local->fCoverageScale = fCoverageScale; |
+} |
+ |
+bool GrQuadEffect::onCanMakeEqual(const GrBatchTracker& m, const GrBatchTracker& t) const { |
+ const QuadBatchTracker& mine = m.cast<QuadBatchTracker>(); |
+ const QuadBatchTracker& theirs = t.cast<QuadBatchTracker>(); |
+ return CanCombineOutput(mine.fInputColorType, mine.fColor, |
+ theirs.fInputColorType, theirs.fColor) && |
+ mine.fCoverageScale == theirs.fCoverageScale; |
+} |
+ |
////////////////////////////////////////////////////////////////////////////// |
GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrQuadEffect); |
@@ -320,6 +432,11 @@ GrGeometryProcessor* GrQuadEffect::TestCreate(SkRandom* random, |
// Cubic |
////////////////////////////////////////////////////////////////////////////// |
+struct CubicBatchTracker { |
+ GrGPInput fInputColorType; |
+ GrColor fColor; |
+}; |
+ |
class GrGLCubicEffect : public GrGLGeometryProcessor { |
public: |
GrGLCubicEffect(const GrGeometryProcessor&, |
@@ -332,18 +449,29 @@ public: |
const GrGLCaps&, |
GrProcessorKeyBuilder*); |
- virtual void setData(const GrGLProgramDataManager&, |
- const GrGeometryProcessor&, |
- const GrBatchTracker&) SK_OVERRIDE {} |
+ virtual void setData(const GrGLProgramDataManager& pdman, |
+ const GrPrimitiveProcessor&, |
+ const GrBatchTracker& bt) SK_OVERRIDE { |
+ const CubicBatchTracker& local = bt.cast<CubicBatchTracker>(); |
+ if (kUniform_GrGPInput == local.fInputColorType && local.fColor != fColor) { |
+ GrGLfloat c[4]; |
+ GrColorToRGBAFloat(local.fColor, c); |
+ pdman.set4fv(fColorUniform, 1, c); |
+ fColor = local.fColor; |
+ } |
+ } |
private: |
+ GrColor fColor; |
GrPrimitiveEdgeType fEdgeType; |
+ UniformHandle fColorUniform; |
typedef GrGLGeometryProcessor INHERITED; |
}; |
GrGLCubicEffect::GrGLCubicEffect(const GrGeometryProcessor& processor, |
- const GrBatchTracker&) { |
+ const GrBatchTracker&) |
+ : fColor(GrColor_ILLEGAL) { |
const GrCubicEffect& ce = processor.cast<GrCubicEffect>(); |
fEdgeType = ce.getEdgeType(); |
} |
@@ -351,11 +479,16 @@ GrGLCubicEffect::GrGLCubicEffect(const GrGeometryProcessor& processor, |
void GrGLCubicEffect::emitCode(const EmitArgs& args) { |
GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); |
const GrCubicEffect& gp = args.fGP.cast<GrCubicEffect>(); |
+ const CubicBatchTracker& local = args.fBT.cast<CubicBatchTracker>(); |
GrGLVertToFrag v(kVec4f_GrSLType); |
args.fPB->addVarying("CubicCoeffs", &v, kHigh_GrSLPrecision); |
vsBuilder->codeAppendf("%s = %s;", v.vsOut(), gp.inCubicCoeffs()->fName); |
+ // Setup pass through color |
+ this->setupColorPassThrough(args.fPB, local.fInputColorType, args.fOutputColor, NULL, |
+ &fColorUniform); |
+ |
// setup coord outputs |
vsBuilder->codeAppendf("%s = %s;", vsBuilder->positionCoords(), gp.inPosition()->fName); |
vsBuilder->codeAppendf("%s = %s;", vsBuilder->localCoords(), gp.inPosition()->fName); |
@@ -452,11 +585,13 @@ void GrGLCubicEffect::emitCode(const EmitArgs& args) { |
} |
void GrGLCubicEffect::GenKey(const GrGeometryProcessor& processor, |
- const GrBatchTracker&, |
+ const GrBatchTracker& bt, |
const GrGLCaps&, |
GrProcessorKeyBuilder* b) { |
const GrCubicEffect& ce = processor.cast<GrCubicEffect>(); |
+ const CubicBatchTracker& local = bt.cast<CubicBatchTracker>(); |
uint32_t key = ce.isAntiAliased() ? (ce.isFilled() ? 0x0 : 0x1) : 0x2; |
+ key |= kUniform_GrGPInput == local.fInputColorType ? 0x4 : 0x8; |
b->add32(key); |
} |
@@ -487,6 +622,18 @@ bool GrCubicEffect::onIsEqual(const GrGeometryProcessor& other) const { |
return (ce.fEdgeType == fEdgeType); |
} |
+void GrCubicEffect::initBatchTracker(GrBatchTracker* bt, const InitBT& init) const { |
+ CubicBatchTracker* local = bt->cast<CubicBatchTracker>(); |
+ local->fInputColorType = GetColorInputType(&local->fColor, this->color(), init, false); |
+} |
+ |
+bool GrCubicEffect::onCanMakeEqual(const GrBatchTracker& m, const GrBatchTracker& t) const { |
+ const CubicBatchTracker& mine = m.cast<CubicBatchTracker>(); |
+ const CubicBatchTracker& theirs = t.cast<CubicBatchTracker>(); |
+ return CanCombineOutput(mine.fInputColorType, mine.fColor, |
+ theirs.fInputColorType, theirs.fColor); |
+} |
+ |
////////////////////////////////////////////////////////////////////////////// |
GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrCubicEffect); |