| Index: src/gpu/GrOvalRenderer.cpp
|
| diff --git a/src/gpu/GrOvalRenderer.cpp b/src/gpu/GrOvalRenderer.cpp
|
| index 2bb674a8ded376655e8c4c93c18392faab250d59..42844ee9ea64a90c980960897b64a722d91cb7fa 100644
|
| --- a/src/gpu/GrOvalRenderer.cpp
|
| +++ b/src/gpu/GrOvalRenderer.cpp
|
| @@ -481,12 +481,16 @@ void GrOvalRenderer::reset() {
|
| SkSafeSetNull(fStrokeRRectIndexBuffer);
|
| }
|
|
|
| -bool GrOvalRenderer::drawOval(GrDrawTarget* target, const GrContext* context, bool useAA,
|
| - const SkRect& oval, const SkStrokeRec& stroke)
|
| +bool GrOvalRenderer::drawOval(GrDrawTarget* target,
|
| + GrDrawState* drawState,
|
| + const GrContext* context,
|
| + bool useAA,
|
| + const SkRect& oval,
|
| + const SkStrokeRec& stroke)
|
| {
|
| bool useCoverageAA = useAA &&
|
| - !target->getDrawState().getRenderTarget()->isMultisampled() &&
|
| - !target->shouldDisableCoverageAAForBlend();
|
| + !drawState->getRenderTarget()->isMultisampled() &&
|
| + drawState->couldApplyCoverage(*target->caps());
|
|
|
| if (!useCoverageAA) {
|
| return false;
|
| @@ -497,13 +501,13 @@ bool GrOvalRenderer::drawOval(GrDrawTarget* target, const GrContext* context, bo
|
| // we can draw circles
|
| if (SkScalarNearlyEqual(oval.width(), oval.height())
|
| && circle_stays_circle(vm)) {
|
| - this->drawCircle(target, context, useCoverageAA, oval, stroke);
|
| + this->drawCircle(target, drawState, context, 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, drawState, context, useCoverageAA, oval, stroke);
|
| // otherwise axis-aligned ellipses only
|
| } else if (vm.rectStaysRect()) {
|
| - return this->drawEllipse(target, context, useCoverageAA, oval, stroke);
|
| + return this->drawEllipse(target, drawState, context, useCoverageAA, oval, stroke);
|
| } else {
|
| return false;
|
| }
|
| @@ -520,13 +524,12 @@ extern const GrVertexAttrib gCircleVertexAttribs[] = {
|
| };
|
|
|
| void GrOvalRenderer::drawCircle(GrDrawTarget* target,
|
| + GrDrawState* drawState,
|
| const GrContext* context,
|
| bool useCoverageAA,
|
| const SkRect& circle,
|
| const SkStrokeRec& stroke)
|
| {
|
| - GrDrawState* drawState = target->drawState();
|
| -
|
| const SkMatrix& vm = drawState->getViewMatrix();
|
| SkPoint center = SkPoint::Make(circle.centerX(), circle.centerY());
|
| vm.mapPoints(¢er, 1);
|
| @@ -541,7 +544,7 @@ void GrOvalRenderer::drawCircle(GrDrawTarget* target,
|
| drawState->setVertexAttribs<gCircleVertexAttribs>(SK_ARRAY_COUNT(gCircleVertexAttribs),
|
| sizeof(CircleVertex));
|
|
|
| - GrDrawTarget::AutoReleaseGeometry geo(target, 4, 0);
|
| + GrDrawTarget::AutoReleaseGeometry geo(target, 4, drawState->getVertexStride(), 0);
|
| if (!geo.succeeded()) {
|
| SkDebugf("Failed to get space for vertices!\n");
|
| return;
|
| @@ -608,7 +611,7 @@ void GrOvalRenderer::drawCircle(GrDrawTarget* target,
|
| verts[3].fInnerRadius = innerRadius;
|
|
|
| target->setIndexSourceToBuffer(context->getGpu()->getQuadIndexBuffer());
|
| - target->drawIndexedInstances(kTriangles_GrPrimitiveType, 1, 4, 6, &bounds);
|
| + target->drawIndexedInstances(drawState, kTriangles_GrPrimitiveType, 1, 4, 6, &bounds);
|
| target->resetIndexSource();
|
| }
|
|
|
| @@ -629,12 +632,12 @@ extern const GrVertexAttrib gDIEllipseVertexAttribs[] = {
|
| };
|
|
|
| bool GrOvalRenderer::drawEllipse(GrDrawTarget* target,
|
| + GrDrawState* drawState,
|
| const GrContext* context,
|
| bool useCoverageAA,
|
| const SkRect& ellipse,
|
| const SkStrokeRec& stroke)
|
| {
|
| - GrDrawState* drawState = target->drawState();
|
| #ifdef SK_DEBUG
|
| {
|
| // we should have checked for this previously
|
| @@ -704,7 +707,7 @@ bool GrOvalRenderer::drawEllipse(GrDrawTarget* target,
|
| drawState->setVertexAttribs<gEllipseVertexAttribs>(SK_ARRAY_COUNT(gEllipseVertexAttribs),
|
| sizeof(EllipseVertex));
|
|
|
| - GrDrawTarget::AutoReleaseGeometry geo(target, 4, 0);
|
| + GrDrawTarget::AutoReleaseGeometry geo(target, 4, drawState->getVertexStride(), 0);
|
| if (!geo.succeeded()) {
|
| SkDebugf("Failed to get space for vertices!\n");
|
| return false;
|
| @@ -757,19 +760,19 @@ bool GrOvalRenderer::drawEllipse(GrDrawTarget* target,
|
| verts[3].fInnerRadii = SkPoint::Make(xInnerRadRecip, yInnerRadRecip);
|
|
|
| target->setIndexSourceToBuffer(context->getGpu()->getQuadIndexBuffer());
|
| - target->drawIndexedInstances(kTriangles_GrPrimitiveType, 1, 4, 6, &bounds);
|
| + target->drawIndexedInstances(drawState, kTriangles_GrPrimitiveType, 1, 4, 6, &bounds);
|
| target->resetIndexSource();
|
|
|
| return true;
|
| }
|
|
|
| bool GrOvalRenderer::drawDIEllipse(GrDrawTarget* target,
|
| + GrDrawState* drawState,
|
| const GrContext* context,
|
| bool useCoverageAA,
|
| const SkRect& ellipse,
|
| const SkStrokeRec& stroke)
|
| {
|
| - GrDrawState* drawState = target->drawState();
|
| const SkMatrix& vm = drawState->getViewMatrix();
|
|
|
| SkPoint center = SkPoint::Make(ellipse.centerX(), ellipse.centerY());
|
| @@ -824,7 +827,7 @@ bool GrOvalRenderer::drawDIEllipse(GrDrawTarget* target,
|
| drawState->setVertexAttribs<gDIEllipseVertexAttribs>(SK_ARRAY_COUNT(gDIEllipseVertexAttribs),
|
| sizeof(DIEllipseVertex));
|
|
|
| - GrDrawTarget::AutoReleaseGeometry geo(target, 4, 0);
|
| + GrDrawTarget::AutoReleaseGeometry geo(target, 4, drawState->getVertexStride(), 0);
|
| if (!geo.succeeded()) {
|
| SkDebugf("Failed to get space for vertices!\n");
|
| return false;
|
| @@ -871,7 +874,7 @@ bool GrOvalRenderer::drawDIEllipse(GrDrawTarget* target,
|
| verts[3].fInnerOffset = SkPoint::Make(innerRatioX + offsetDx, -innerRatioY - offsetDy);
|
|
|
| target->setIndexSourceToBuffer(context->getGpu()->getQuadIndexBuffer());
|
| - target->drawIndexedInstances(kTriangles_GrPrimitiveType, 1, 4, 6, &bounds);
|
| + target->drawIndexedInstances(drawState, kTriangles_GrPrimitiveType, 1, 4, 6, &bounds);
|
| target->resetIndexSource();
|
|
|
| return true;
|
| @@ -922,11 +925,15 @@ GrIndexBuffer* GrOvalRenderer::rRectIndexBuffer(bool isStrokeOnly, GrGpu* gpu) {
|
| }
|
| }
|
|
|
| -bool GrOvalRenderer::drawDRRect(GrDrawTarget* target, GrContext* context, bool useAA,
|
| - const SkRRect& origOuter, const SkRRect& origInner) {
|
| +bool GrOvalRenderer::drawDRRect(GrDrawTarget* target,
|
| + GrDrawState* drawState,
|
| + GrContext* context,
|
| + bool useAA,
|
| + const SkRRect& origOuter,
|
| + const SkRRect& origInner) {
|
| bool applyAA = useAA &&
|
| - !target->getDrawState().getRenderTarget()->isMultisampled() &&
|
| - !target->shouldDisableCoverageAAForBlend();
|
| + !drawState->getRenderTarget()->isMultisampled() &&
|
| + drawState->couldApplyCoverage(*target->caps());
|
| GrDrawState::AutoRestoreEffects are;
|
| if (!origInner.isEmpty()) {
|
| SkTCopyOnFirstWrite<SkRRect> inner(origInner);
|
| @@ -942,12 +949,12 @@ bool GrOvalRenderer::drawDRRect(GrDrawTarget* target, GrContext* context, bool u
|
| if (NULL == fp) {
|
| return false;
|
| }
|
| - are.set(target->drawState());
|
| - target->drawState()->addCoverageProcessor(fp)->unref();
|
| + are.set(drawState);
|
| + drawState->addCoverageProcessor(fp)->unref();
|
| }
|
|
|
| SkStrokeRec fillRec(SkStrokeRec::kFill_InitStyle);
|
| - if (this->drawRRect(target, context, useAA, origOuter, fillRec)) {
|
| + if (this->drawRRect(target, drawState, context, useAA, origOuter, fillRec)) {
|
| return true;
|
| }
|
|
|
| @@ -965,30 +972,34 @@ bool GrOvalRenderer::drawDRRect(GrDrawTarget* target, GrContext* context, bool u
|
| return false;
|
| }
|
| if (!are.isSet()) {
|
| - are.set(target->drawState());
|
| + are.set(drawState);
|
| }
|
| GrDrawState::AutoViewMatrixRestore avmr;
|
| - if (!avmr.setIdentity(target->drawState())) {
|
| + if (!avmr.setIdentity(drawState)) {
|
| return false;
|
| }
|
| - target->drawState()->addCoverageProcessor(effect)->unref();
|
| + drawState->addCoverageProcessor(effect)->unref();
|
| SkRect bounds = outer->getBounds();
|
| if (applyAA) {
|
| bounds.outset(SK_ScalarHalf, SK_ScalarHalf);
|
| }
|
| - target->drawRect(bounds, NULL, NULL);
|
| + target->drawRect(drawState, bounds, NULL, NULL);
|
| return true;
|
| }
|
|
|
| -bool GrOvalRenderer::drawRRect(GrDrawTarget* target, GrContext* context, bool useAA,
|
| - const SkRRect& rrect, const SkStrokeRec& stroke) {
|
| +bool GrOvalRenderer::drawRRect(GrDrawTarget* target,
|
| + GrDrawState* drawState,
|
| + GrContext* context,
|
| + bool useAA,
|
| + const SkRRect& rrect,
|
| + const SkStrokeRec& stroke) {
|
| if (rrect.isOval()) {
|
| - return this->drawOval(target, context, useAA, rrect.getBounds(), stroke);
|
| + return this->drawOval(target, drawState, context, useAA, rrect.getBounds(), stroke);
|
| }
|
|
|
| bool useCoverageAA = useAA &&
|
| - !target->getDrawState().getRenderTarget()->isMultisampled() &&
|
| - !target->shouldDisableCoverageAAForBlend();
|
| + !drawState->getRenderTarget()->isMultisampled() &&
|
| + drawState->couldApplyCoverage(*target->caps());
|
|
|
| // only anti-aliased rrects for now
|
| if (!useCoverageAA) {
|
| @@ -1048,7 +1059,6 @@ bool GrOvalRenderer::drawRRect(GrDrawTarget* target, GrContext* context, bool us
|
| }
|
|
|
| // reset to device coordinates
|
| - GrDrawState* drawState = target->drawState();
|
| GrDrawState::AutoViewMatrixRestore avmr;
|
| if (!avmr.setIdentity(drawState)) {
|
| return false;
|
| @@ -1065,7 +1075,7 @@ bool GrOvalRenderer::drawRRect(GrDrawTarget* target, GrContext* context, bool us
|
| drawState->setVertexAttribs<gCircleVertexAttribs>(SK_ARRAY_COUNT(gCircleVertexAttribs),
|
| sizeof(CircleVertex));
|
|
|
| - GrDrawTarget::AutoReleaseGeometry geo(target, 16, 0);
|
| + GrDrawTarget::AutoReleaseGeometry geo(target, 16, drawState->getVertexStride(), 0);
|
| if (!geo.succeeded()) {
|
| SkDebugf("Failed to get space for vertices!\n");
|
| return false;
|
| @@ -1146,7 +1156,8 @@ bool GrOvalRenderer::drawRRect(GrDrawTarget* target, GrContext* context, bool us
|
| int indexCnt = isStrokeOnly ? SK_ARRAY_COUNT(gRRectIndices) - 6 :
|
| SK_ARRAY_COUNT(gRRectIndices);
|
| target->setIndexSourceToBuffer(indexBuffer);
|
| - target->drawIndexedInstances(kTriangles_GrPrimitiveType, 1, 16, indexCnt, &bounds);
|
| + target->drawIndexedInstances(drawState, kTriangles_GrPrimitiveType, 1, 16, indexCnt,
|
| + &bounds);
|
|
|
| // otherwise we use the ellipse renderer
|
| } else {
|
| @@ -1187,7 +1198,7 @@ bool GrOvalRenderer::drawRRect(GrDrawTarget* target, GrContext* context, bool us
|
|
|
| isStrokeOnly = (isStrokeOnly && innerXRadius >= 0 && innerYRadius >= 0);
|
|
|
| - GrDrawTarget::AutoReleaseGeometry geo(target, 16, 0);
|
| + GrDrawTarget::AutoReleaseGeometry geo(target, 16, drawState->getVertexStride(), 0);
|
| if (!geo.succeeded()) {
|
| SkDebugf("Failed to get space for vertices!\n");
|
| return false;
|
| @@ -1253,7 +1264,8 @@ bool GrOvalRenderer::drawRRect(GrDrawTarget* target, GrContext* context, bool us
|
| int indexCnt = isStrokeOnly ? SK_ARRAY_COUNT(gRRectIndices) - 6 :
|
| SK_ARRAY_COUNT(gRRectIndices);
|
| target->setIndexSourceToBuffer(indexBuffer);
|
| - target->drawIndexedInstances(kTriangles_GrPrimitiveType, 1, 16, indexCnt, &bounds);
|
| + target->drawIndexedInstances(drawState, kTriangles_GrPrimitiveType, 1, 16, indexCnt,
|
| + &bounds);
|
| }
|
|
|
| target->resetIndexSource();
|
|
|