diff options
-rw-r--r-- | src/gpu/GrClipMaskManager.cpp | 49 | ||||
-rw-r--r-- | src/gpu/GrDrawTarget.cpp | 25 | ||||
-rw-r--r-- | src/gpu/GrDrawTarget.h | 30 |
3 files changed, 33 insertions, 71 deletions
diff --git a/src/gpu/GrClipMaskManager.cpp b/src/gpu/GrClipMaskManager.cpp index 9eaf415cce..3168424cf8 100644 --- a/src/gpu/GrClipMaskManager.cpp +++ b/src/gpu/GrClipMaskManager.cpp @@ -20,6 +20,7 @@ #include "GrSWMaskHelper.h" #include "SkRasterClip.h" #include "SkTLazy.h" +#include "batches/GrRectBatchFactory.h" #include "effects/GrConvexPolyEffect.h" #include "effects/GrPorterDuffXferProcessor.h" #include "effects/GrRRectEffect.h" @@ -47,6 +48,16 @@ static const GrFragmentProcessor* create_fp_for_mask(GrTexture* result, const Sk kDevice_GrCoordSet); } +static void draw_non_aa_rect(GrDrawTarget* drawTarget, + const GrPipelineBuilder& pipelineBuilder, + GrColor color, + const SkMatrix& viewMatrix, + const SkRect& rect) { + SkAutoTUnref<GrDrawBatch> batch(GrRectBatchFactory::CreateNonAAFill(color, viewMatrix, rect, + nullptr, nullptr)); + drawTarget->drawBatch(pipelineBuilder, batch); +} + // Does the path in 'element' require SW rendering? If so, return true (and, // optionally, set 'prOut' to NULL. If not, return false (and, optionally, set // 'prOut' to the non-SW path renderer that will do the job). @@ -506,20 +517,24 @@ bool GrClipMaskManager::drawElement(GrPipelineBuilder* pipelineBuilder, case Element::kEmpty_Type: SkDEBUGFAIL("Should never get here with an empty element."); break; - case Element::kRect_Type: + case Element::kRect_Type: { // TODO: Do rects directly to the accumulator using a aa-rect GrProcessor that covers // the entire mask bounds and writes 0 outside the rect. if (element->isAA()) { SkRect devRect = element->getRect(); viewMatrix.mapRect(&devRect); - fDrawTarget->drawAARect(*pipelineBuilder, color, viewMatrix, - element->getRect(), devRect); + SkAutoTUnref<GrDrawBatch> batch( + GrRectBatchFactory::CreateAAFill(color, viewMatrix, element->getRect(), + devRect)); + + fDrawTarget->drawBatch(*pipelineBuilder, batch); } else { - fDrawTarget->drawNonAARect(*pipelineBuilder, color, viewMatrix, - element->getRect()); + draw_non_aa_rect(fDrawTarget, *pipelineBuilder, color, viewMatrix, + element->getRect()); } return true; + } default: { SkPath path; element->asPath(&path); @@ -691,8 +706,8 @@ GrTexture* GrClipMaskManager::createAlphaClipMask(int32_t elementsGenID, backgroundPipelineBuilder.setStencil(kDrawOutsideElement); // The color passed in here does not matter since the coverageSetOpXP won't read it. - fDrawTarget->drawNonAARect(backgroundPipelineBuilder, GrColor_WHITE, translate, - clipSpaceIBounds); + draw_non_aa_rect(fDrawTarget, backgroundPipelineBuilder, GrColor_WHITE, translate, + SkRect::Make(clipSpaceIBounds)); } } else { GrPipelineBuilder pipelineBuilder; @@ -831,11 +846,8 @@ bool GrClipMaskManager::createStencilClipMask(GrRenderTarget* rt, if (Element::kRect_Type == element->getType()) { *pipelineBuilder.stencil() = gDrawToStencil; - // We need this AGP until everything is in GrBatch - fDrawTarget->drawNonAARect(pipelineBuilder, - GrColor_WHITE, - viewMatrix, - element->getRect()); + draw_non_aa_rect(fDrawTarget, pipelineBuilder, GrColor_WHITE, viewMatrix, + element->getRect()); } else { if (!clipPath.isEmpty()) { if (canRenderDirectToStencil) { @@ -873,11 +885,8 @@ bool GrClipMaskManager::createStencilClipMask(GrRenderTarget* rt, if (canDrawDirectToClip) { if (Element::kRect_Type == element->getType()) { - // We need this AGP until everything is in GrBatch - fDrawTarget->drawNonAARect(pipelineBuilder, - GrColor_WHITE, - viewMatrix, - element->getRect()); + draw_non_aa_rect(fDrawTarget, pipelineBuilder, GrColor_WHITE, viewMatrix, + element->getRect()); } else { GrPathRenderer::DrawPathArgs args; args.fTarget = fDrawTarget; @@ -893,10 +902,8 @@ bool GrClipMaskManager::createStencilClipMask(GrRenderTarget* rt, } else { // The view matrix is setup to do clip space -> stencil space translation, so // draw rect in clip space. - fDrawTarget->drawNonAARect(pipelineBuilder, - GrColor_WHITE, - viewMatrix, - SkRect::Make(clipSpaceIBounds)); + draw_non_aa_rect(fDrawTarget, pipelineBuilder, GrColor_WHITE, viewMatrix, + SkRect::Make(clipSpaceIBounds)); } } } diff --git a/src/gpu/GrDrawTarget.cpp b/src/gpu/GrDrawTarget.cpp index 0389d92f48..e2e188eb12 100644 --- a/src/gpu/GrDrawTarget.cpp +++ b/src/gpu/GrDrawTarget.cpp @@ -350,25 +350,6 @@ void GrDrawTarget::drawPathBatch(const GrPipelineBuilder& pipelineBuilder, this->recordBatch(batch); } -void GrDrawTarget::drawNonAARect(const GrPipelineBuilder& pipelineBuilder, - GrColor color, - const SkMatrix& viewMatrix, - const SkRect& rect) { - SkAutoTUnref<GrDrawBatch> batch(GrRectBatchFactory::CreateNonAAFill(color, viewMatrix, rect, - nullptr, nullptr)); - this->drawBatch(pipelineBuilder, batch); -} - -void GrDrawTarget::drawAARect(const GrPipelineBuilder& pipelineBuilder, - GrColor color, - const SkMatrix& viewMatrix, - const SkRect& rect, - const SkRect& devRect) { - SkAutoTUnref<GrDrawBatch> batch(GrRectBatchFactory::CreateAAFill(color, viewMatrix, rect, - devRect)); - this->drawBatch(pipelineBuilder, batch); -} - void GrDrawTarget::clear(const SkIRect* rect, GrColor color, bool canIgnoreRect, @@ -400,7 +381,11 @@ void GrDrawTarget::clear(const SkIRect* rect, GrPorterDuffXPFactory::Create(SkXfermode::kSrc_Mode))->unref(); pipelineBuilder.setRenderTarget(renderTarget); - this->drawNonAARect(pipelineBuilder, color, SkMatrix::I(), *rect); + SkRect scalarRect = SkRect::Make(*rect); + SkAutoTUnref<GrDrawBatch> batch( + GrRectBatchFactory::CreateNonAAFill(color, SkMatrix::I(), scalarRect, + nullptr, nullptr)); + this->drawBatch(pipelineBuilder, batch); } else { GrBatch* batch = new GrClearBatch(*rect, color, renderTarget); this->recordBatch(batch); diff --git a/src/gpu/GrDrawTarget.h b/src/gpu/GrDrawTarget.h index e64df28ad7..d16d6e8c45 100644 --- a/src/gpu/GrDrawTarget.h +++ b/src/gpu/GrDrawTarget.h @@ -122,36 +122,6 @@ public: void drawPathBatch(const GrPipelineBuilder& pipelineBuilder, GrDrawPathBatchBase* batch); /** - * Helper function for drawing rects. - * - * @param rect the rect to draw - * @param localRect optional rect that specifies local coords to map onto - * rect. If nullptr then rect serves as the local coords. - * @param localMatrix Optional local matrix. The local coordinates are specified by localRect, - * or if it is nullptr by rect. This matrix applies to the coordinate implied by - * that rectangle before it is input to GrCoordTransforms that read local - * coordinates - */ - void drawNonAARect(const GrPipelineBuilder& pipelineBuilder, - GrColor color, - const SkMatrix& viewMatrix, - const SkRect& rect); - - void drawNonAARect(const GrPipelineBuilder& ds, - GrColor color, - const SkMatrix& viewM, - const SkIRect& irect) { - SkRect rect = SkRect::Make(irect); - this->drawNonAARect(ds, color, viewM, rect); - } - - void drawAARect(const GrPipelineBuilder& pipelineBuilder, - GrColor color, - const SkMatrix& viewMatrix, - const SkRect& rect, - const SkRect& devRect); - - /** * Clear the passed in render target. Ignores the GrPipelineBuilder and clip. Clears the whole * thing if rect is nullptr, otherwise just the rect. If canIgnoreRect is set then the entire * render target can be optionally cleared. |