aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/gpu/GrDrawContext.cpp26
-rw-r--r--src/gpu/GrDrawTarget.cpp33
-rw-r--r--src/gpu/GrDrawTarget.h34
-rw-r--r--src/gpu/GrStencilAndCoverTextContext.cpp8
-rw-r--r--src/gpu/GrStencilAndCoverTextContext.h1
-rw-r--r--src/gpu/batches/GrDrawPathBatch.cpp20
-rw-r--r--src/gpu/batches/GrDrawPathBatch.h29
-rw-r--r--src/gpu/batches/GrStencilAndCoverPathRenderer.cpp5
8 files changed, 51 insertions, 105 deletions
diff --git a/src/gpu/GrDrawContext.cpp b/src/gpu/GrDrawContext.cpp
index f8859df2ee..8978c6b542 100644
--- a/src/gpu/GrDrawContext.cpp
+++ b/src/gpu/GrDrawContext.cpp
@@ -136,22 +136,6 @@ void GrDrawContext::drawTextBlob(const GrClip& clip, const SkPaint& skPaint,
fTextContext->drawTextBlob(this, clip, skPaint, viewMatrix, blob, x, y, filter, clipBounds);
}
-void GrDrawContext::drawPathsFromRange(const GrPipelineBuilder* pipelineBuilder,
- const SkMatrix& viewMatrix,
- const SkMatrix& localMatrix,
- GrColor color,
- GrPathRange* range,
- GrPathRangeDraw* draw,
- int /*GrPathRendering::FillType*/ fill,
- const SkRect& bounds) {
- RETURN_IF_ABANDONED
- SkDEBUGCODE(this->validate();)
-
- this->getDrawTarget()->drawPathsFromRange(*pipelineBuilder, viewMatrix, localMatrix, color,
- range, draw, (GrPathRendering::FillType) fill,
- bounds);
-}
-
void GrDrawContext::discard() {
RETURN_IF_ABANDONED
SkDEBUGCODE(this->validate();)
@@ -638,6 +622,16 @@ void GrDrawContext::drawBatch(const GrClip& clip,
this->getDrawTarget()->drawBatch(pipelineBuilder, batch);
}
+void GrDrawContext::drawPathBatch(const GrPipelineBuilder& pipelineBuilder,
+ GrDrawPathBatchBase* batch) {
+ RETURN_IF_ABANDONED
+ SkDEBUGCODE(this->validate();)
+
+ AutoCheckFlush acf(fDrawingManager);
+
+ this->getDrawTarget()->drawPathBatch(pipelineBuilder, batch);
+}
+
void GrDrawContext::drawPath(const GrClip& clip,
const GrPaint& paint,
const SkMatrix& viewMatrix,
diff --git a/src/gpu/GrDrawTarget.cpp b/src/gpu/GrDrawTarget.cpp
index 4f91a3cf96..59488c4d03 100644
--- a/src/gpu/GrDrawTarget.cpp
+++ b/src/gpu/GrDrawTarget.cpp
@@ -316,40 +316,13 @@ void GrDrawTarget::stencilPath(const GrPipelineBuilder& pipelineBuilder,
batch->unref();
}
-void GrDrawTarget::drawPath(const GrPipelineBuilder& pipelineBuilder,
- const SkMatrix& viewMatrix,
- GrColor color,
- const GrPath* path,
- GrPathRendering::FillType fill) {
- SkASSERT(path);
- SkASSERT(this->caps()->shaderCaps()->pathRenderingSupport());
-
- GrDrawPathBatchBase* batch = GrDrawPathBatch::Create(viewMatrix, color, path);
- this->drawPathBatch(pipelineBuilder, batch, fill);
- batch->unref();
-}
-
-void GrDrawTarget::drawPathsFromRange(const GrPipelineBuilder& pipelineBuilder,
- const SkMatrix& viewMatrix,
- const SkMatrix& localMatrix,
- GrColor color,
- GrPathRange* range,
- GrPathRangeDraw* draw,
- GrPathRendering::FillType fill,
- const SkRect& bounds) {
- GrDrawPathBatchBase* batch = GrDrawPathRangeBatch::Create(viewMatrix, localMatrix, color,
- range, draw, bounds);
- this->drawPathBatch(pipelineBuilder, batch, fill);
- batch->unref();
-}
-
void GrDrawTarget::drawPathBatch(const GrPipelineBuilder& pipelineBuilder,
- GrDrawPathBatchBase* batch,
- GrPathRendering::FillType fill) {
+ GrDrawPathBatchBase* batch) {
// This looks like drawBatch() but there is an added wrinkle that stencil settings get inserted
// after setting up clipping but before onDrawBatch(). TODO: Figure out a better model for
// handling stencil settings WRT interactions between pipeline(builder), clipmaskmanager, and
// batches.
+ SkASSERT(this->caps()->shaderCaps()->pathRenderingSupport());
GrPipelineBuilder::AutoRestoreStencil ars;
GrAppliedClip clip;
@@ -367,7 +340,7 @@ void GrDrawTarget::drawPathBatch(const GrPipelineBuilder& pipelineBuilder,
GrStencilSettings stencilSettings;
GrRenderTarget* rt = pipelineBuilder.getRenderTarget();
GrStencilAttachment* sb = fResourceProvider->attachStencilAttachment(rt);
- this->getPathStencilSettingsForFilltype(fill, sb, &stencilSettings);
+ this->getPathStencilSettingsForFilltype(batch->fillType(), sb, &stencilSettings);
batch->setStencilSettings(stencilSettings);
GrPipeline::CreateArgs args;
diff --git a/src/gpu/GrDrawTarget.h b/src/gpu/GrDrawTarget.h
index dc38b5d6d8..c80ac34b94 100644
--- a/src/gpu/GrDrawTarget.h
+++ b/src/gpu/GrDrawTarget.h
@@ -39,7 +39,6 @@ class GrClip;
class GrCaps;
class GrPath;
class GrDrawPathBatchBase;
-class GrPathRangeDraw;
class GrDrawTarget final : public SkRefCnt {
public:
@@ -112,34 +111,13 @@ public:
GrPathRendering::FillType);
/**
- * Draws a path. Fill must not be a hairline. It will respect the HW
- * antialias flag on the GrPipelineBuilder (if possible in the 3D API).
+ * Draws a path batch. Fill must not be a hairline. It will respect the HW antialias flag on
+ * the GrPipelineBuilder (if possible in the 3D API). This needs to be separate from drawBatch
+ * because we install path stencil settings late.
*
- * TODO: Remove this function and construct the batch outside GrDrawTarget.
+ * TODO: Figure out a better model that allows us to roll this method into drawBatch.
*/
- void drawPath(const GrPipelineBuilder&, const SkMatrix& viewMatrix, GrColor color,
- const GrPath*, GrPathRendering::FillType);
-
- /**
- * Draws the aggregate path from combining multiple. Note that this will not
- * always be equivalent to back-to-back calls to drawPath(). It will respect
- * the HW antialias flag on the GrPipelineBuilder (if possible in the 3D API).
- *
- * TODO: Remove this function and construct the batch outside GrDrawTarget.
- *
- * @param draw The transforms and indices for the draw.
- * This object must only be drawn once. The draw
- * may modify its contents.
- * @param fill Fill type for drawing all the paths
- */
- void drawPathsFromRange(const GrPipelineBuilder&,
- const SkMatrix& viewMatrix,
- const SkMatrix& localMatrix,
- GrColor color,
- GrPathRange* range,
- GrPathRangeDraw* draw,
- GrPathRendering::FillType fill,
- const SkRect& bounds);
+ void drawPathBatch(const GrPipelineBuilder& pipelineBuilder, GrDrawPathBatchBase* batch);
/**
* Helper function for drawing rects.
@@ -288,8 +266,6 @@ private:
GrXferProcessor::DstTexture*,
const SkRect& batchBounds);
- void drawPathBatch(const GrPipelineBuilder& pipelineBuilder, GrDrawPathBatchBase* batch,
- GrPathRendering::FillType fill);
// Check to see if this set of draw commands has been sent out
void getPathStencilSettingsForFilltype(GrPathRendering::FillType,
const GrStencilAttachment*,
diff --git a/src/gpu/GrStencilAndCoverTextContext.cpp b/src/gpu/GrStencilAndCoverTextContext.cpp
index 4ae5ec43df..77960dbe7a 100644
--- a/src/gpu/GrStencilAndCoverTextContext.cpp
+++ b/src/gpu/GrStencilAndCoverTextContext.cpp
@@ -523,8 +523,12 @@ void GrStencilAndCoverTextContext::TextRun::draw(GrContext* ctx,
SkRect bounds = SkRect::MakeIWH(pipelineBuilder->getRenderTarget()->width(),
pipelineBuilder->getRenderTarget()->height());
- dc->drawPathsFromRange(pipelineBuilder, drawMatrix, localMatrix, color, glyphs, fDraw,
- GrPathRendering::kWinding_FillType, bounds);
+ SkAutoTUnref<GrDrawPathBatchBase> batch(
+ GrDrawPathRangeBatch::Create(drawMatrix, localMatrix, color,
+ GrPathRendering::kWinding_FillType, glyphs, fDraw,
+ bounds));
+
+ dc->drawPathBatch(*pipelineBuilder, batch);
}
if (fFallbackTextBlob) {
diff --git a/src/gpu/GrStencilAndCoverTextContext.h b/src/gpu/GrStencilAndCoverTextContext.h
index c223521c7c..7716c78405 100644
--- a/src/gpu/GrStencilAndCoverTextContext.h
+++ b/src/gpu/GrStencilAndCoverTextContext.h
@@ -18,6 +18,7 @@
class GrTextStrike;
class GrPath;
class SkSurfaceProps;
+class GrPathRangeDraw;
/*
* This class implements text rendering using stencil and cover path rendering
diff --git a/src/gpu/batches/GrDrawPathBatch.cpp b/src/gpu/batches/GrDrawPathBatch.cpp
index 5209f907de..c2007ce933 100644
--- a/src/gpu/batches/GrDrawPathBatch.cpp
+++ b/src/gpu/batches/GrDrawPathBatch.cpp
@@ -42,23 +42,11 @@ SkString GrDrawPathRangeBatch::dumpInfo() const {
return string;
}
-bool GrDrawPathRangeBatch::isWinding() const {
- static const GrStencilSettings::Face pathFace = GrStencilSettings::kFront_Face;
- bool isWinding = kInvert_StencilOp != this->stencilSettings().passOp(pathFace);
- if (isWinding) {
- // Double check that it is in fact winding.
- SkASSERT(kIncClamp_StencilOp == this->stencilSettings().passOp(pathFace));
- SkASSERT(kIncClamp_StencilOp == this->stencilSettings().failOp(pathFace));
- SkASSERT(0x1 != this->stencilSettings().writeMask(pathFace));
- SkASSERT(!this->stencilSettings().isTwoSided());
- }
- return isWinding;
-}
-
GrDrawPathRangeBatch::GrDrawPathRangeBatch(const SkMatrix& viewMatrix, const SkMatrix& localMatrix,
- GrColor color, GrPathRange* range, GrPathRangeDraw* draw,
+ GrColor color, GrPathRendering::FillType fill,
+ GrPathRange* range, GrPathRangeDraw* draw,
const SkRect& bounds)
- : INHERITED(ClassID(), viewMatrix, color)
+ : INHERITED(ClassID(), viewMatrix, color, fill)
, fPathRange(range)
, fLocalMatrix(localMatrix) {
SkDEBUGCODE(draw->fUsedInBatch = true;)
@@ -90,7 +78,7 @@ bool GrDrawPathRangeBatch::onCombineIfPossible(GrBatch* t, const GrCaps& caps) {
// work). Note that it's also possible for overlapping paths to cancel each other's winding
// numbers, and we only partially account for this by not allowing even/odd paths to be
// combined. (Glyphs in the same font tend to wind the same direction so it works out OK.)
- if (!this->isWinding() ||
+ if (GrPathRendering::kWinding_FillType != this->fillType() ||
this->stencilSettings() != that->stencilSettings() ||
this->overrides().willColorBlendWithDst()) {
return false;
diff --git a/src/gpu/batches/GrDrawPathBatch.h b/src/gpu/batches/GrDrawPathBatch.h
index 4067c808dc..fdd3448a73 100644
--- a/src/gpu/batches/GrDrawPathBatch.h
+++ b/src/gpu/batches/GrDrawPathBatch.h
@@ -27,13 +27,17 @@ public:
overrides->fUsePLSDstRead = false;
}
+ GrPathRendering::FillType fillType() const { return fFillType; }
+
void setStencilSettings(const GrStencilSettings& stencil) { fStencilSettings = stencil; }
protected:
- GrDrawPathBatchBase(uint32_t classID, const SkMatrix& viewMatrix, GrColor initialColor)
+ GrDrawPathBatchBase(uint32_t classID, const SkMatrix& viewMatrix, GrColor initialColor,
+ GrPathRendering::FillType fill)
: INHERITED(classID)
, fViewMatrix(viewMatrix)
- , fColor(initialColor) {}
+ , fColor(initialColor)
+ , fFillType(fill) {}
const GrStencilSettings& stencilSettings() const { return fStencilSettings; }
const GrXPOverridesForBatch& overrides() const { return fOverrides; }
@@ -48,6 +52,7 @@ private:
SkMatrix fViewMatrix;
GrColor fColor;
+ GrPathRendering::FillType fFillType;
GrStencilSettings fStencilSettings;
GrXPOverridesForBatch fOverrides;
@@ -60,8 +65,8 @@ public:
// This can't return a more abstract type because we install the stencil settings late :(
static GrDrawPathBatchBase* Create(const SkMatrix& viewMatrix, GrColor color,
- const GrPath* path) {
- return new GrDrawPathBatch(viewMatrix, color, path);
+ GrPathRendering::FillType fill, const GrPath* path) {
+ return new GrDrawPathBatch(viewMatrix, color, fill, path);
}
const char* name() const override { return "DrawPath"; }
@@ -69,8 +74,9 @@ public:
SkString dumpInfo() const override;
private:
- GrDrawPathBatch(const SkMatrix& viewMatrix, GrColor color, const GrPath* path)
- : INHERITED(ClassID(), viewMatrix, color)
+ GrDrawPathBatch(const SkMatrix& viewMatrix, GrColor color, GrPathRendering::FillType fill,
+ const GrPath* path)
+ : INHERITED(ClassID(), viewMatrix, color, fill)
, fPath(path) {
fBounds = path->getBounds();
viewMatrix.mapRect(&fBounds);
@@ -148,9 +154,11 @@ public:
// This can't return a more abstract type because we install the stencil settings late :(
static GrDrawPathBatchBase* Create(const SkMatrix& viewMatrix, const SkMatrix& localMatrix,
- GrColor color, GrPathRange* range, GrPathRangeDraw* draw,
+ GrColor color, GrPathRendering::FillType fill,
+ GrPathRange* range, GrPathRangeDraw* draw,
const SkRect& bounds) {
- return new GrDrawPathRangeBatch(viewMatrix, localMatrix, color, range, draw, bounds);
+ return new GrDrawPathRangeBatch(viewMatrix, localMatrix, color, fill, range, draw,
+ bounds);
}
~GrDrawPathRangeBatch() override;
@@ -160,10 +168,9 @@ public:
SkString dumpInfo() const override;
private:
- inline bool isWinding() const;
-
GrDrawPathRangeBatch(const SkMatrix& viewMatrix, const SkMatrix& localMatrix, GrColor color,
- GrPathRange* range, GrPathRangeDraw* draw, const SkRect& bounds);
+ GrPathRendering::FillType fill, GrPathRange* range,
+ GrPathRangeDraw* draw, const SkRect& bounds);
bool onCombineIfPossible(GrBatch* t, const GrCaps& caps) override;
diff --git a/src/gpu/batches/GrStencilAndCoverPathRenderer.cpp b/src/gpu/batches/GrStencilAndCoverPathRenderer.cpp
index cf5db3fc63..848c82104d 100644
--- a/src/gpu/batches/GrStencilAndCoverPathRenderer.cpp
+++ b/src/gpu/batches/GrStencilAndCoverPathRenderer.cpp
@@ -10,6 +10,7 @@
#include "GrStencilAndCoverPathRenderer.h"
#include "GrCaps.h"
#include "GrContext.h"
+#include "GrDrawPathBatch.h"
#include "GrGpu.h"
#include "GrPath.h"
#include "GrRenderTarget.h"
@@ -131,7 +132,9 @@ bool GrStencilAndCoverPathRenderer::onDrawPath(const DrawPathArgs& args) {
0xffff);
pipelineBuilder->setStencil(kStencilPass);
- args.fTarget->drawPath(*pipelineBuilder, viewMatrix, args.fColor, p, p->getFillType());
+ SkAutoTUnref<GrDrawPathBatchBase> batch(
+ GrDrawPathBatch::Create(viewMatrix, args.fColor, p->getFillType(), p));
+ args.fTarget->drawPathBatch(*pipelineBuilder, batch);
}
pipelineBuilder->stencil()->setDisabled();