| Index: src/gpu/GrOvalRenderer.cpp
|
| diff --git a/src/gpu/GrOvalRenderer.cpp b/src/gpu/GrOvalRenderer.cpp
|
| index 0622994186672d1974bf9c45e65cc0016a124a78..85a538973b844891df17b53f1942694bad425179 100644
|
| --- a/src/gpu/GrOvalRenderer.cpp
|
| +++ b/src/gpu/GrOvalRenderer.cpp
|
| @@ -26,7 +26,7 @@
|
| #include "effects/GrRRectEffect.h"
|
|
|
| namespace {
|
| -// TODO(joshualitt) add per vertex colors
|
| +
|
| struct CircleVertex {
|
| SkPoint fPos;
|
| SkPoint fOffset;
|
| @@ -478,13 +478,13 @@
|
| // we can draw circles
|
| if (SkScalarNearlyEqual(oval.width(), oval.height())
|
| && circle_stays_circle(vm)) {
|
| - this->drawCircle(target, context, useCoverageAA, oval, stroke);
|
| + this->drawCircle(target, useCoverageAA, oval, stroke);
|
| // if we have shader derivative support, render as device-independent
|
| } else if (target->caps()->shaderDerivativeSupport()) {
|
| - return this->drawDIEllipse(target, context, useCoverageAA, oval, stroke);
|
| + return this->drawDIEllipse(target, useCoverageAA, oval, stroke);
|
| // otherwise axis-aligned ellipses only
|
| } else if (vm.rectStaysRect()) {
|
| - return this->drawEllipse(target, context, useCoverageAA, oval, stroke);
|
| + return this->drawEllipse(target, useCoverageAA, oval, stroke);
|
| } else {
|
| return false;
|
| }
|
| @@ -501,7 +501,6 @@
|
| };
|
|
|
| void GrOvalRenderer::drawCircle(GrDrawTarget* target,
|
| - const GrContext* context,
|
| bool useCoverageAA,
|
| const SkRect& circle,
|
| const SkStrokeRec& stroke)
|
| @@ -573,24 +572,22 @@
|
| verts[0].fOuterRadius = outerRadius;
|
| verts[0].fInnerRadius = innerRadius;
|
|
|
| - verts[1].fPos = SkPoint::Make(bounds.fLeft, bounds.fBottom);
|
| - verts[1].fOffset = SkPoint::Make(-outerRadius, outerRadius);
|
| + verts[1].fPos = SkPoint::Make(bounds.fRight, bounds.fTop);
|
| + verts[1].fOffset = SkPoint::Make(outerRadius, -outerRadius);
|
| verts[1].fOuterRadius = outerRadius;
|
| verts[1].fInnerRadius = innerRadius;
|
|
|
| - verts[2].fPos = SkPoint::Make(bounds.fRight, bounds.fBottom);
|
| - verts[2].fOffset = SkPoint::Make(outerRadius, outerRadius);
|
| + verts[2].fPos = SkPoint::Make(bounds.fLeft, bounds.fBottom);
|
| + verts[2].fOffset = SkPoint::Make(-outerRadius, outerRadius);
|
| verts[2].fOuterRadius = outerRadius;
|
| verts[2].fInnerRadius = innerRadius;
|
|
|
| - verts[3].fPos = SkPoint::Make(bounds.fRight, bounds.fTop);
|
| - verts[3].fOffset = SkPoint::Make(outerRadius, -outerRadius);
|
| + verts[3].fPos = SkPoint::Make(bounds.fRight, bounds.fBottom);
|
| + verts[3].fOffset = SkPoint::Make(outerRadius, outerRadius);
|
| verts[3].fOuterRadius = outerRadius;
|
| verts[3].fInnerRadius = innerRadius;
|
|
|
| - target->setIndexSourceToBuffer(context->getGpu()->getQuadIndexBuffer());
|
| - target->drawIndexedInstances(kTriangles_GrPrimitiveType, 1, 4, 6, &bounds);
|
| - target->resetIndexSource();
|
| + target->drawNonIndexed(kTriangleStrip_GrPrimitiveType, 0, 4, &bounds);
|
| }
|
|
|
| ///////////////////////////////////////////////////////////////////////////////
|
| @@ -610,7 +607,6 @@
|
| };
|
|
|
| bool GrOvalRenderer::drawEllipse(GrDrawTarget* target,
|
| - const GrContext* context,
|
| bool useCoverageAA,
|
| const SkRect& ellipse,
|
| const SkStrokeRec& stroke)
|
| @@ -722,30 +718,27 @@
|
| verts[0].fOuterRadii = SkPoint::Make(xRadRecip, yRadRecip);
|
| verts[0].fInnerRadii = SkPoint::Make(xInnerRadRecip, yInnerRadRecip);
|
|
|
| - verts[1].fPos = SkPoint::Make(bounds.fLeft, bounds.fBottom);
|
| - verts[1].fOffset = SkPoint::Make(-xRadius, yRadius);
|
| + verts[1].fPos = SkPoint::Make(bounds.fRight, bounds.fTop);
|
| + verts[1].fOffset = SkPoint::Make(xRadius, -yRadius);
|
| verts[1].fOuterRadii = SkPoint::Make(xRadRecip, yRadRecip);
|
| verts[1].fInnerRadii = SkPoint::Make(xInnerRadRecip, yInnerRadRecip);
|
|
|
| - verts[2].fPos = SkPoint::Make(bounds.fRight, bounds.fBottom);
|
| - verts[2].fOffset = SkPoint::Make(xRadius, yRadius);
|
| + verts[2].fPos = SkPoint::Make(bounds.fLeft, bounds.fBottom);
|
| + verts[2].fOffset = SkPoint::Make(-xRadius, yRadius);
|
| verts[2].fOuterRadii = SkPoint::Make(xRadRecip, yRadRecip);
|
| verts[2].fInnerRadii = SkPoint::Make(xInnerRadRecip, yInnerRadRecip);
|
|
|
| - verts[3].fPos = SkPoint::Make(bounds.fRight, bounds.fTop);
|
| - verts[3].fOffset = SkPoint::Make(xRadius, -yRadius);
|
| + verts[3].fPos = SkPoint::Make(bounds.fRight, bounds.fBottom);
|
| + verts[3].fOffset = SkPoint::Make(xRadius, yRadius);
|
| verts[3].fOuterRadii = SkPoint::Make(xRadRecip, yRadRecip);
|
| verts[3].fInnerRadii = SkPoint::Make(xInnerRadRecip, yInnerRadRecip);
|
|
|
| - target->setIndexSourceToBuffer(context->getGpu()->getQuadIndexBuffer());
|
| - target->drawIndexedInstances(kTriangles_GrPrimitiveType, 1, 4, 6, &bounds);
|
| - target->resetIndexSource();
|
| + target->drawNonIndexed(kTriangleStrip_GrPrimitiveType, 0, 4, &bounds);
|
|
|
| return true;
|
| }
|
|
|
| bool GrOvalRenderer::drawDIEllipse(GrDrawTarget* target,
|
| - const GrContext* context,
|
| bool useCoverageAA,
|
| const SkRect& ellipse,
|
| const SkStrokeRec& stroke)
|
| @@ -839,21 +832,19 @@
|
| verts[0].fOuterOffset = SkPoint::Make(-1.0f - offsetDx, -1.0f - offsetDy);
|
| verts[0].fInnerOffset = SkPoint::Make(-innerRatioX - offsetDx, -innerRatioY - offsetDy);
|
|
|
| - verts[1].fPos = SkPoint::Make(bounds.fLeft, bounds.fBottom);
|
| - verts[1].fOuterOffset = SkPoint::Make(-1.0f - offsetDx, 1.0f + offsetDy);
|
| - verts[1].fInnerOffset = SkPoint::Make(-innerRatioX - offsetDx, innerRatioY + offsetDy);
|
| -
|
| - verts[2].fPos = SkPoint::Make(bounds.fRight, bounds.fBottom);
|
| - verts[2].fOuterOffset = SkPoint::Make(1.0f + offsetDx, 1.0f + offsetDy);
|
| - verts[2].fInnerOffset = SkPoint::Make(innerRatioX + offsetDx, innerRatioY + offsetDy);
|
| -
|
| - verts[3].fPos = SkPoint::Make(bounds.fRight, bounds.fTop);
|
| - verts[3].fOuterOffset = SkPoint::Make(1.0f + offsetDx, -1.0f - offsetDy);
|
| - verts[3].fInnerOffset = SkPoint::Make(innerRatioX + offsetDx, -innerRatioY - offsetDy);
|
| -
|
| - target->setIndexSourceToBuffer(context->getGpu()->getQuadIndexBuffer());
|
| - target->drawIndexedInstances(kTriangles_GrPrimitiveType, 1, 4, 6, &bounds);
|
| - target->resetIndexSource();
|
| + verts[1].fPos = SkPoint::Make(bounds.fRight, bounds.fTop);
|
| + verts[1].fOuterOffset = SkPoint::Make(1.0f + offsetDx, -1.0f - offsetDy);
|
| + verts[1].fInnerOffset = SkPoint::Make(innerRatioX + offsetDx, -innerRatioY - offsetDy);
|
| +
|
| + verts[2].fPos = SkPoint::Make(bounds.fLeft, bounds.fBottom);
|
| + verts[2].fOuterOffset = SkPoint::Make(-1.0f - offsetDx, 1.0f + offsetDy);
|
| + verts[2].fInnerOffset = SkPoint::Make(-innerRatioX - offsetDx, innerRatioY + offsetDy);
|
| +
|
| + verts[3].fPos = SkPoint::Make(bounds.fRight, bounds.fBottom);
|
| + verts[3].fOuterOffset = SkPoint::Make(1.0f + offsetDx, 1.0f + offsetDy);
|
| + verts[3].fInnerOffset = SkPoint::Make(innerRatioX + offsetDx, innerRatioY + offsetDy);
|
| +
|
| + target->drawNonIndexed(kTriangleStrip_GrPrimitiveType, 0, 4, &bounds);
|
|
|
| return true;
|
| }
|
| @@ -878,29 +869,21 @@
|
| 5, 6, 10, 5, 10, 9
|
| };
|
|
|
| -static const int kIndicesPerStrokeRRect = SK_ARRAY_COUNT(gRRectIndices) - 6;
|
| -static const int kIndicesPerRRect = SK_ARRAY_COUNT(gRRectIndices);
|
| -static const int kVertsPerRRect = 16;
|
| -static const int kNumRRectsInIndexBuffer = 256;
|
| -
|
| -GrIndexBuffer* GrOvalRenderer::rRectIndexBuffer(bool isStrokeOnly, GrGpu* gpu) {
|
| - if (isStrokeOnly) {
|
| - if (NULL == fStrokeRRectIndexBuffer) {
|
| - fStrokeRRectIndexBuffer = gpu->createInstancedIndexBuffer(gRRectIndices,
|
| - kIndicesPerStrokeRRect,
|
| - kNumRRectsInIndexBuffer,
|
| - kVertsPerRRect);
|
| - }
|
| - return fStrokeRRectIndexBuffer;
|
| - } else {
|
| - if (NULL == fRRectIndexBuffer) {
|
| - fRRectIndexBuffer = gpu->createInstancedIndexBuffer(gRRectIndices,
|
| - kIndicesPerRRect,
|
| - kNumRRectsInIndexBuffer,
|
| - kVertsPerRRect);
|
| - }
|
| - return fRRectIndexBuffer;
|
| - }
|
| +
|
| +GrIndexBuffer* GrOvalRenderer::rRectIndexBuffer(GrGpu* gpu) {
|
| + if (NULL == fRRectIndexBuffer) {
|
| + fRRectIndexBuffer =
|
| + gpu->createIndexBuffer(sizeof(gRRectIndices), false);
|
| + if (fRRectIndexBuffer) {
|
| +#ifdef SK_DEBUG
|
| + bool updated =
|
| +#endif
|
| + fRRectIndexBuffer->updateData(gRRectIndices,
|
| + sizeof(gRRectIndices));
|
| + GR_DEBUGASSERT(updated);
|
| + }
|
| + }
|
| + return fRRectIndexBuffer;
|
| }
|
|
|
| bool GrOvalRenderer::drawDRRect(GrDrawTarget* target, GrContext* context, bool useAA,
|
| @@ -1035,7 +1018,7 @@
|
| return false;
|
| }
|
|
|
| - GrIndexBuffer* indexBuffer = this->rRectIndexBuffer(isStrokeOnly, context->getGpu());
|
| + GrIndexBuffer* indexBuffer = this->rRectIndexBuffer(context->getGpu());
|
| if (NULL == indexBuffer) {
|
| GrPrintf("Failed to create index buffer!\n");
|
| return false;
|
| @@ -1127,7 +1110,7 @@
|
| int indexCnt = isStrokeOnly ? SK_ARRAY_COUNT(gRRectIndices) - 6 :
|
| SK_ARRAY_COUNT(gRRectIndices);
|
| target->setIndexSourceToBuffer(indexBuffer);
|
| - target->drawIndexedInstances(kTriangles_GrPrimitiveType, 1, 16, indexCnt, &bounds);
|
| + target->drawIndexed(kTriangles_GrPrimitiveType, 0, 0, 16, indexCnt, &bounds);
|
|
|
| // otherwise we use the ellipse renderer
|
| } else {
|
| @@ -1234,9 +1217,8 @@
|
| int indexCnt = isStrokeOnly ? SK_ARRAY_COUNT(gRRectIndices) - 6 :
|
| SK_ARRAY_COUNT(gRRectIndices);
|
| target->setIndexSourceToBuffer(indexBuffer);
|
| - target->drawIndexedInstances(kTriangles_GrPrimitiveType, 1, 16, indexCnt, &bounds);
|
| - }
|
| -
|
| - target->resetIndexSource();
|
| + target->drawIndexed(kTriangles_GrPrimitiveType, 0, 0, 16, indexCnt, &bounds);
|
| + }
|
| +
|
| return true;
|
| }
|
|
|