Chromium Code Reviews| Index: src/gpu/GrContext.cpp |
| diff --git a/src/gpu/GrContext.cpp b/src/gpu/GrContext.cpp |
| index 13de4fec26bce2a2bf5f53f62caed71a97feb103..f4545c73d6ab5483cb8eb6f3ce2c3952cf868e74 100755 |
| --- a/src/gpu/GrContext.cpp |
| +++ b/src/gpu/GrContext.cpp |
| @@ -315,7 +315,7 @@ GrTexture* GrContext::createResizedTexture(const GrSurfaceDesc& desc, |
| uint32_t flags = GrDefaultGeoProcFactory::kPosition_GPType | |
| GrDefaultGeoProcFactory::kLocalCoord_GPType; |
| SkAutoTUnref<const GrGeometryProcessor> gp( |
| - GrDefaultGeoProcFactory::Create(GrColor_WHITE, flags)); |
| + GrDefaultGeoProcFactory::Create(flags, GrColor_WHITE)); |
| GrDrawTarget::AutoReleaseGeometry arg(fDrawBuffer, 4, gp->getVertexStride(), 0); |
| SkASSERT(gp->getVertexStride() == 2 * sizeof(SkPoint)); |
| @@ -540,7 +540,7 @@ void GrContext::clear(const SkIRect* rect, |
| AutoCheckFlush acf(this); |
| GR_CREATE_TRACE_MARKER_CONTEXT("GrContext::clear", this); |
| - GrDrawTarget* target = this->prepareToDraw(NULL, NULL, NULL, &acf); |
| + GrDrawTarget* target = this->prepareToDraw(NULL, NULL, &acf); |
| if (NULL == target) { |
| return; |
| } |
| @@ -583,13 +583,13 @@ void GrContext::drawPaint(const GrPaint& origPaint, const SkMatrix& viewMatrix) |
| AutoCheckFlush acf(this); |
| GrDrawState drawState; |
| - GrDrawTarget* target = this->prepareToDraw(&drawState, paint, &SkMatrix::I(), &acf); |
| + GrDrawTarget* target = this->prepareToDraw(&drawState, paint, &acf); |
| if (NULL == target) { |
| return; |
| } |
| GR_CREATE_TRACE_MARKER("GrContext::drawPaintWithPerspective", target); |
| - target->drawRect(&drawState, paint->getColor(), r, NULL, &localMatrix); |
| + target->drawRect(&drawState, paint->getColor(), SkMatrix::I(), r, NULL, &localMatrix); |
| } |
| } |
| @@ -692,14 +692,13 @@ void GrContext::drawRect(const GrPaint& paint, |
| AutoCheckFlush acf(this); |
| GrDrawState drawState; |
| - GrDrawTarget* target = this->prepareToDraw(&drawState, &paint, &viewMatrix, &acf); |
| + GrDrawTarget* target = this->prepareToDraw(&drawState, &paint, &acf); |
| if (NULL == target) { |
| return; |
| } |
| GR_CREATE_TRACE_MARKER("GrContext::drawRect", target); |
| SkScalar width = NULL == strokeInfo ? -1 : strokeInfo->getStrokeRec().getWidth(); |
| - SkMatrix matrix = drawState.getViewMatrix(); |
| // Check if this is a full RT draw and can be replaced with a clear. We don't bother checking |
| // cases where the RT is fully inside a stroke. |
| @@ -716,7 +715,7 @@ void GrContext::drawRect(const GrPaint& paint, |
| // Does the clip contain the entire RT? |
| if (!checkClip || target->getClip()->fClipStack->quickContains(clipSpaceRTRect)) { |
| SkMatrix invM; |
| - if (!matrix.invert(&invM)) { |
| + if (!viewMatrix.invert(&invM)) { |
| return; |
| } |
| // Does the rect bound the RT? |
| @@ -739,29 +738,33 @@ void GrContext::drawRect(const GrPaint& paint, |
| GrColor color = paint.getColor(); |
| SkRect devBoundRect; |
| bool needAA = paint.isAntiAlias() && !drawState.getRenderTarget()->isMultisampled(); |
| - bool doAA = needAA && apply_aa_to_rect(target, &drawState, &devBoundRect, rect, width, matrix, |
| - color); |
| + bool doAA = needAA && apply_aa_to_rect(target, &drawState, &devBoundRect, rect, width, |
| + viewMatrix, color); |
| if (doAA) { |
| SkMatrix invert; |
| - if (!drawState.getViewMatrix().invert(&invert)) { |
| + if (!viewMatrix.invert(&invert)) { |
| return; |
| } |
| - GrDrawState::AutoViewMatrixRestore avmr(&drawState); |
| if (width >= 0) { |
| const SkStrokeRec& strokeRec = strokeInfo->getStrokeRec(); |
| fAARectRenderer->strokeAARect(target, |
| &drawState, |
| color, |
| + viewMatrix, |
| invert, |
|
bsalomon
2014/12/29 20:26:58
Seems like every caller of the public drawing func
|
| rect, |
| - matrix, |
| devBoundRect, |
| strokeRec); |
| } else { |
| // filled AA rect |
| - fAARectRenderer->fillAARect(target, &drawState, color, invert, rect, matrix, |
| + fAARectRenderer->fillAARect(target, |
| + &drawState, |
| + color, |
| + viewMatrix, |
| + invert, |
| + rect, |
| devBoundRect); |
| } |
| return; |
| @@ -773,7 +776,11 @@ void GrContext::drawRect(const GrPaint& paint, |
| // unitSquareVertexBuffer() |
| static const int worstCaseVertCount = 10; |
| - SkAutoTUnref<const GrGeometryProcessor> gp(GrDefaultGeoProcFactory::Create(color)); |
| + SkAutoTUnref<const GrGeometryProcessor> gp( |
| + GrDefaultGeoProcFactory::Create(GrDefaultGeoProcFactory::kPosition_GPType, |
| + color, |
| + viewMatrix, |
| + SkMatrix::I())); |
| GrDrawTarget::AutoReleaseGeometry geo(target, |
| worstCaseVertCount, |
| gp->getVertexStride(), |
| @@ -807,7 +814,7 @@ void GrContext::drawRect(const GrPaint& paint, |
| target->drawNonIndexed(&drawState, gp, primType, 0, vertCount); |
| } else { |
| // filled BW rect |
| - target->drawSimpleRect(&drawState, color, rect); |
| + target->drawSimpleRect(&drawState, color, viewMatrix, rect); |
| } |
| } |
| @@ -818,21 +825,22 @@ void GrContext::drawNonAARectToRect(const GrPaint& paint, |
| const SkMatrix* localMatrix) { |
| AutoCheckFlush acf(this); |
| GrDrawState drawState; |
| - GrDrawTarget* target = this->prepareToDraw(&drawState, &paint, &viewMatrix, &acf); |
| + GrDrawTarget* target = this->prepareToDraw(&drawState, &paint, &acf); |
| if (NULL == target) { |
| return; |
| } |
| GR_CREATE_TRACE_MARKER("GrContext::drawRectToRect", target); |
| - target->drawRect(&drawState, paint.getColor(), rectToDraw, &localRect, localMatrix); |
| + target->drawRect(&drawState, paint.getColor(), viewMatrix, rectToDraw, &localRect, localMatrix); |
| } |
| static const GrGeometryProcessor* set_vertex_attributes(const SkPoint* texCoords, |
| const GrColor* colors, |
| int* colorOffset, |
| int* texOffset, |
| - GrColor color) { |
| + GrColor color, |
| + const SkMatrix& viewMatrix) { |
| *texOffset = -1; |
| *colorOffset = -1; |
| uint32_t flags = GrDefaultGeoProcFactory::kPosition_GPType; |
| @@ -848,7 +856,7 @@ static const GrGeometryProcessor* set_vertex_attributes(const SkPoint* texCoords |
| *colorOffset = sizeof(SkPoint); |
| flags |= GrDefaultGeoProcFactory::kColor_GPType; |
| } |
| - return GrDefaultGeoProcFactory::Create(color, flags); |
| + return GrDefaultGeoProcFactory::Create(flags, color, viewMatrix, SkMatrix::I()); |
| } |
| void GrContext::drawVertices(const GrPaint& paint, |
| @@ -864,7 +872,7 @@ void GrContext::drawVertices(const GrPaint& paint, |
| GrDrawState drawState; |
| GrDrawTarget::AutoReleaseGeometry geo; // must be inside AutoCheckFlush scope |
| - GrDrawTarget* target = this->prepareToDraw(&drawState, &paint, &viewMatrix, &acf); |
| + GrDrawTarget* target = this->prepareToDraw(&drawState, &paint, &acf); |
| if (NULL == target) { |
| return; |
| } |
| @@ -873,7 +881,8 @@ void GrContext::drawVertices(const GrPaint& paint, |
| int colorOffset = -1, texOffset = -1; |
| SkAutoTUnref<const GrGeometryProcessor> gp( |
| - set_vertex_attributes(texCoords, colors, &colorOffset, &texOffset, paint.getColor())); |
| + set_vertex_attributes(texCoords, colors, &colorOffset, &texOffset, |
| + paint.getColor(), viewMatrix)); |
| size_t vertexStride = gp->getVertexStride(); |
| SkASSERT(vertexStride == sizeof(SkPoint) + (SkToBool(texCoords) ? sizeof(SkPoint) : 0) |
| @@ -928,7 +937,7 @@ void GrContext::drawRRect(const GrPaint& paint, |
| AutoCheckFlush acf(this); |
| GrDrawState drawState; |
| - GrDrawTarget* target = this->prepareToDraw(&drawState, &paint, &viewMatrix, &acf); |
| + GrDrawTarget* target = this->prepareToDraw(&drawState, &paint, &acf); |
| if (NULL == target) { |
| return; |
| } |
| @@ -938,7 +947,7 @@ void GrContext::drawRRect(const GrPaint& paint, |
| const SkStrokeRec& strokeRec = strokeInfo.getStrokeRec(); |
| GrColor color = paint.getColor(); |
| - if (!fOvalRenderer->drawRRect(target, &drawState, color, paint.isAntiAlias(), rrect, |
| + if (!fOvalRenderer->drawRRect(target, &drawState, color, viewMatrix, paint.isAntiAlias(), rrect, |
| strokeRec)) { |
| SkPath path; |
| path.addRRect(rrect); |
| @@ -959,12 +968,12 @@ void GrContext::drawDRRect(const GrPaint& paint, |
| AutoCheckFlush acf(this); |
| GrDrawState drawState; |
| - GrDrawTarget* target = this->prepareToDraw(&drawState, &paint, &viewMatrix, &acf); |
| + GrDrawTarget* target = this->prepareToDraw(&drawState, &paint, &acf); |
| GR_CREATE_TRACE_MARKER("GrContext::drawDRRect", target); |
| GrColor color = paint.getColor(); |
| - if (!fOvalRenderer->drawDRRect(target, &drawState, color, paint.isAntiAlias(), outer, inner)) { |
| + if (!fOvalRenderer->drawDRRect(target, &drawState, color, viewMatrix, paint.isAntiAlias(), outer, inner)) { |
| SkPath path; |
| path.addRRect(inner); |
| path.addRRect(outer); |
| @@ -995,7 +1004,7 @@ void GrContext::drawOval(const GrPaint& paint, |
| AutoCheckFlush acf(this); |
| GrDrawState drawState; |
| - GrDrawTarget* target = this->prepareToDraw(&drawState, &paint, &viewMatrix, &acf); |
| + GrDrawTarget* target = this->prepareToDraw(&drawState, &paint, &acf); |
| if (NULL == target) { |
| return; |
| } |
| @@ -1005,7 +1014,8 @@ void GrContext::drawOval(const GrPaint& paint, |
| const SkStrokeRec& strokeRec = strokeInfo.getStrokeRec(); |
| GrColor color = paint.getColor(); |
| - if (!fOvalRenderer->drawOval(target, &drawState, color, paint.isAntiAlias(), oval, strokeRec)) { |
| + if (!fOvalRenderer->drawOval(target, &drawState, color, viewMatrix, paint.isAntiAlias(), oval, |
| + strokeRec)) { |
| SkPath path; |
| path.addOval(oval); |
| this->internalDrawPath(target, &drawState, viewMatrix, color, paint.isAntiAlias(), path, |
| @@ -1017,6 +1027,7 @@ void GrContext::drawOval(const GrPaint& paint, |
| static bool is_nested_rects(GrDrawTarget* target, |
| GrDrawState* drawState, |
| GrColor color, |
| + const SkMatrix& viewMatrix, |
| const SkPath& path, |
| const SkStrokeRec& stroke, |
| SkRect rects[2]) { |
| @@ -1028,7 +1039,7 @@ static bool is_nested_rects(GrDrawTarget* target, |
| // TODO: this restriction could be lifted if we were willing to apply |
| // the matrix to all the points individually rather than just to the rect |
| - if (!drawState->getViewMatrix().preservesAxisAlignment()) { |
| + if (!viewMatrix.preservesAxisAlignment()) { |
| return false; |
| } |
| @@ -1088,13 +1099,13 @@ void GrContext::drawPath(const GrPaint& paint, |
| if (path.isLine(pts)) { |
| AutoCheckFlush acf(this); |
| GrDrawState drawState; |
| - GrDrawTarget* target = this->prepareToDraw(&drawState, &paint, &viewMatrix, &acf); |
| + GrDrawTarget* target = this->prepareToDraw(&drawState, &paint, &acf); |
| if (NULL == target) { |
| return; |
| } |
| - if (GrDashingEffect::DrawDashLine(fGpu, target, &drawState, color, pts, paint, |
| - strokeInfo)) { |
| + if (GrDashingEffect::DrawDashLine(fGpu, target, &drawState, color, viewMatrix, pts, |
| + paint, strokeInfo)) { |
| return; |
| } |
| } |
| @@ -1120,7 +1131,7 @@ void GrContext::drawPath(const GrPaint& paint, |
| // OK. |
| AutoCheckFlush acf(this); |
| GrDrawState drawState; |
| - GrDrawTarget* target = this->prepareToDraw(&drawState, &paint, &viewMatrix, &acf); |
| + GrDrawTarget* target = this->prepareToDraw(&drawState, &paint, &acf); |
| if (NULL == target) { |
| return; |
| } |
| @@ -1135,17 +1146,13 @@ void GrContext::drawPath(const GrPaint& paint, |
| // Concave AA paths are expensive - try to avoid them for special cases |
| SkRect rects[2]; |
| - if (is_nested_rects(target, &drawState, color, path, strokeRec, rects)) { |
| - SkMatrix origViewMatrix = drawState.getViewMatrix(); |
| - |
| + if (is_nested_rects(target, &drawState, color, viewMatrix, path, strokeRec, rects)) { |
| SkMatrix invert; |
| - if (!drawState.getViewMatrix().invert(&invert)) { |
| + if (!viewMatrix.invert(&invert)) { |
| return; |
| } |
| - GrDrawState::AutoViewMatrixRestore avmr(&drawState); |
| - fAARectRenderer->fillAANestedRects(target, &drawState, color, invert, rects, |
| - origViewMatrix); |
| + fAARectRenderer->fillAANestedRects(target, &drawState, color, viewMatrix, invert,rects); |
| return; |
| } |
| } |
| @@ -1153,9 +1160,9 @@ void GrContext::drawPath(const GrPaint& paint, |
| SkRect ovalRect; |
| bool isOval = path.isOval(&ovalRect); |
| - if (!isOval || path.isInverseFillType() |
| - || !fOvalRenderer->drawOval(target, &drawState, color, paint.isAntiAlias(), ovalRect, |
| - strokeRec)) { |
| + if (!isOval || path.isInverseFillType() || |
| + !fOvalRenderer->drawOval(target, &drawState, color, viewMatrix, paint.isAntiAlias(), |
| + ovalRect, strokeRec)) { |
| this->internalDrawPath(target, &drawState, viewMatrix, color, paint.isAntiAlias(), path, |
| strokeInfo); |
| } |
| @@ -1191,7 +1198,8 @@ void GrContext::internalDrawPath(GrDrawTarget* target, |
| SkTCopyOnFirstWrite<SkStrokeRec> stroke(strokeInfo.getStrokeRec()); |
| // Try a 1st time without stroking the path and without allowing the SW renderer |
| - GrPathRenderer* pr = this->getPathRenderer(target, drawState, *pathPtr, *stroke, false, type); |
| + GrPathRenderer* pr = this->getPathRenderer(target, drawState, viewMatrix, *pathPtr, *stroke, |
| + false, type); |
| if (NULL == pr) { |
| if (!GrPathRenderer::IsStrokeHairlineOrEquivalent(*stroke, viewMatrix, NULL)) { |
| @@ -1206,7 +1214,7 @@ void GrContext::internalDrawPath(GrDrawTarget* target, |
| } |
| // This time, allow SW renderer |
| - pr = this->getPathRenderer(target, drawState, *pathPtr, *stroke, true, type); |
| + pr = this->getPathRenderer(target, drawState, viewMatrix, *pathPtr, *stroke, true, type); |
| } |
| if (NULL == pr) { |
| @@ -1216,7 +1224,7 @@ void GrContext::internalDrawPath(GrDrawTarget* target, |
| return; |
| } |
| - pr->drawPath(target, drawState, color, *pathPtr, *stroke, useCoverageAA); |
| + pr->drawPath(target, drawState, color, viewMatrix, *pathPtr, *stroke, useCoverageAA); |
| } |
| //////////////////////////////////////////////////////////////////////////////// |
| @@ -1351,14 +1359,14 @@ bool GrContext::writeSurfacePixels(GrSurface* surface, |
| // drawing a rect to the render target. |
| // The bracket ensures we pop the stack if we wind up flushing below. |
| { |
| - GrDrawTarget* drawTarget = this->prepareToDraw(NULL, NULL, NULL, NULL); |
| + GrDrawTarget* drawTarget = this->prepareToDraw(NULL, NULL, NULL); |
| GrDrawTarget::AutoGeometryPush agp(drawTarget); |
| - GrDrawState drawState(matrix); |
| + GrDrawState drawState; |
| drawState.addColorProcessor(fp); |
| drawState.setRenderTarget(renderTarget); |
| - drawTarget->drawSimpleRect(&drawState, GrColor_WHITE,SkRect::MakeWH(SkIntToScalar(width), |
| - SkIntToScalar(height))); |
| + drawTarget->drawSimpleRect(&drawState, GrColor_WHITE, matrix, |
| + SkRect::MakeWH(SkIntToScalar(width), SkIntToScalar(height))); |
| } |
| if (kFlushWrites_PixelOp & pixelOpsFlags) { |
| @@ -1479,7 +1487,7 @@ bool GrContext::readRenderTargetPixels(GrRenderTarget* target, |
| drawState.setRenderTarget(tempTexture->asRenderTarget()); |
| SkRect rect = SkRect::MakeWH(SkIntToScalar(width), SkIntToScalar(height)); |
| - fDrawBuffer->drawSimpleRect(&drawState, GrColor_WHITE, rect); |
| + fDrawBuffer->drawSimpleRect(&drawState, GrColor_WHITE, SkMatrix::I(), rect); |
| // we want to read back from the scratch's origin |
| left = 0; |
| top = 0; |
| @@ -1532,7 +1540,7 @@ void GrContext::discardRenderTarget(GrRenderTarget* renderTarget) { |
| SkASSERT(renderTarget); |
| ASSERT_OWNED_RESOURCE(renderTarget); |
| AutoCheckFlush acf(this); |
| - GrDrawTarget* target = this->prepareToDraw(NULL, NULL, NULL, &acf); |
| + GrDrawTarget* target = this->prepareToDraw(NULL, NULL, &acf); |
| if (NULL == target) { |
| return; |
| } |
| @@ -1550,7 +1558,7 @@ void GrContext::copySurface(GrSurface* dst, GrSurface* src, const SkIRect& srcRe |
| // Since we're going to the draw target and not GPU, no need to check kNoFlush |
| // here. |
| - GrDrawTarget* target = this->prepareToDraw(NULL, NULL, NULL, NULL); |
| + GrDrawTarget* target = this->prepareToDraw(NULL, NULL, NULL); |
| if (NULL == target) { |
| return; |
| } |
| @@ -1569,7 +1577,6 @@ void GrContext::flushSurfaceWrites(GrSurface* surface) { |
| GrDrawTarget* GrContext::prepareToDraw(GrDrawState* ds, |
| const GrPaint* paint, |
| - const SkMatrix* viewMatrix, |
| const AutoCheckFlush* acf) { |
| if (NULL == fGpu) { |
| return NULL; |
| @@ -1577,10 +1584,9 @@ GrDrawTarget* GrContext::prepareToDraw(GrDrawState* ds, |
| ASSERT_OWNED_RESOURCE(fRenderTarget.get()); |
| if (ds) { |
| - SkASSERT(viewMatrix); |
| if (paint) { |
| SkASSERT(acf); |
| - ds->setFromPaint(*paint, *viewMatrix, fRenderTarget.get()); |
| + ds->setFromPaint(*paint, fRenderTarget.get()); |
| #if GR_DEBUG_PARTIAL_COVERAGE_CHECK |
| if ((paint->hasMask()) && |
| !fDrawState->canUseFracCoveragePrimProc(paint.getColor(), fGpu->caps())) { |
| @@ -1588,7 +1594,7 @@ GrDrawTarget* GrContext::prepareToDraw(GrDrawState* ds, |
| } |
| #endif |
| } else { |
| - ds->reset(*viewMatrix); |
| + ds->reset(); |
| ds->setRenderTarget(fRenderTarget.get()); |
| } |
| ds->setState(GrDrawState::kClip_StateBit, fClip && !fClip->fClipStack->isWideOpen()); |
| @@ -1605,6 +1611,7 @@ GrDrawTarget* GrContext::prepareToDraw(GrDrawState* ds, |
| */ |
| GrPathRenderer* GrContext::getPathRenderer(const GrDrawTarget* target, |
| const GrDrawState* drawState, |
| + const SkMatrix& viewMatrix, |
| const SkPath& path, |
| const SkStrokeRec& stroke, |
| bool allowSW, |
| @@ -1617,6 +1624,7 @@ GrPathRenderer* GrContext::getPathRenderer(const GrDrawTarget* target, |
| GrPathRenderer* pr = fPathRendererChain->getPathRenderer(target, |
| drawState, |
| + viewMatrix, |
| path, |
| stroke, |
| drawType, |
| @@ -1674,7 +1682,7 @@ void GrContext::setupDrawBuffer() { |
| } |
| GrDrawTarget* GrContext::getTextTarget() { |
| - return this->prepareToDraw(NULL, NULL, NULL, NULL); |
| + return this->prepareToDraw(NULL, NULL, NULL); |
| } |
| const GrIndexBuffer* GrContext::getQuadIndexBuffer() const { |