| Index: src/gpu/GrAAHairLinePathRenderer.cpp
|
| ===================================================================
|
| --- src/gpu/GrAAHairLinePathRenderer.cpp (revision 8387)
|
| +++ src/gpu/GrAAHairLinePathRenderer.cpp (working copy)
|
| @@ -18,6 +18,8 @@
|
| #include "SkStroke.h"
|
| #include "SkTemplates.h"
|
|
|
| +#include "effects/GrEdgeEffect.h"
|
| +
|
| namespace {
|
| // quadratics are rendered as 5-sided polys in order to bound the
|
| // AA stroke around the center-curve. See comments in push_quad_index_buffer and
|
| @@ -508,7 +510,6 @@
|
| {kVec2f_GrVertexAttribType, 0},
|
| {kVec4f_GrVertexAttribType, sizeof(GrPoint)}
|
| };
|
| - static const GrAttribBindings kBindings = GrDrawState::kEdge_AttribBindingsBit;
|
| SkMatrix viewM = drawState->getViewMatrix();
|
|
|
| PREALLOC_PTARRAY(128) lines;
|
| @@ -522,8 +523,7 @@
|
|
|
| target->drawState()->setVertexAttribs(kAttribs, SK_ARRAY_COUNT(kAttribs));
|
| target->drawState()->setAttribIndex(GrDrawState::kPosition_AttribIndex, 0);
|
| - target->drawState()->setAttribIndex(GrDrawState::kEdge_AttribIndex, 1);
|
| - target->drawState()->setAttribBindings(kBindings);
|
| + target->drawState()->setAttribBindings(GrDrawState::kDefault_AttribBindings);
|
| GrAssert(sizeof(Vertex) == target->getDrawState().getVertexSize());
|
|
|
| if (!arg->set(target, vertCnt, 0)) {
|
| @@ -589,8 +589,10 @@
|
| return false;
|
| }
|
|
|
| + GrDrawTarget::AutoStateRestore asr(target, GrDrawTarget::kPreserve_ASRInit);
|
| + GrDrawState* drawState = target->drawState();
|
| +
|
| GrDrawState::AutoDeviceCoordDraw adcd;
|
| - GrDrawState* drawState = target->drawState();
|
| // createGeom transforms the geometry to device space when the matrix does not have
|
| // perspective.
|
| if (!drawState->getViewMatrix().hasPerspective()) {
|
| @@ -603,12 +605,21 @@
|
| // TODO: See whether rendering lines as degenerate quads improves perf
|
| // when we have a mix
|
|
|
| - GrDrawState::VertexEdgeType oldEdgeType = drawState->getVertexEdgeType();
|
| + enum {
|
| + // the edge effects share this stage with glyph rendering
|
| + // (kGlyphMaskStage in GrTextContext) && SW path rendering
|
| + // (kPathMaskStage in GrSWMaskHelper)
|
| + kEdgeEffectStage = GrPaint::kTotalStages,
|
| + };
|
| + static const int kEdgeAttrIndex = 1;
|
|
|
| + GrEffectRef* hairLineEffect = GrEdgeEffect::Create(GrEdgeEffect::kHairLine_EdgeType);
|
| + GrEffectRef* hairQuadEffect = GrEdgeEffect::Create(GrEdgeEffect::kHairQuad_EdgeType);
|
| +
|
| target->setIndexSourceToBuffer(fLinesIndexBuffer);
|
| int lines = 0;
|
| int nBufLines = fLinesIndexBuffer->maxQuads();
|
| - drawState->setVertexEdgeType(GrDrawState::kHairLine_EdgeType);
|
| + drawState->setEffect(kEdgeEffectStage, hairLineEffect, kEdgeAttrIndex)->unref();
|
| while (lines < lineCnt) {
|
| int n = GrMin(lineCnt - lines, nBufLines);
|
| target->drawIndexed(kTriangles_GrPrimitiveType,
|
| @@ -621,7 +632,7 @@
|
|
|
| target->setIndexSourceToBuffer(fQuadsIndexBuffer);
|
| int quads = 0;
|
| - drawState->setVertexEdgeType(GrDrawState::kHairQuad_EdgeType);
|
| + drawState->setEffect(kEdgeEffectStage, hairQuadEffect, kEdgeAttrIndex)->unref();
|
| while (quads < quadCnt) {
|
| int n = GrMin(quadCnt - quads, kNumQuadsInIdxBuffer);
|
| target->drawIndexed(kTriangles_GrPrimitiveType,
|
| @@ -631,6 +642,6 @@
|
| kIdxsPerQuad*n); // iCount
|
| quads += n;
|
| }
|
| - drawState->setVertexEdgeType(oldEdgeType);
|
| +
|
| return true;
|
| }
|
|
|