aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--include/gpu/GrClip.h33
-rw-r--r--src/gpu/GrClip.cpp18
-rw-r--r--src/gpu/GrClipMaskManager.cpp12
-rw-r--r--src/gpu/GrClipMaskManager.h16
-rw-r--r--src/gpu/GrDrawContext.cpp11
-rw-r--r--src/gpu/GrDrawContextPriv.h8
-rw-r--r--src/gpu/GrDrawTarget.cpp18
-rw-r--r--src/gpu/GrDrawTarget.h15
-rw-r--r--src/gpu/batches/GrStencilAndCoverPathRenderer.cpp21
9 files changed, 84 insertions, 68 deletions
diff --git a/include/gpu/GrClip.h b/include/gpu/GrClip.h
index e58528114e..b177d6fda3 100644
--- a/include/gpu/GrClip.h
+++ b/include/gpu/GrClip.h
@@ -13,7 +13,6 @@
#include "SkClipStack.h"
class GrDrawContext;
-class GrPipelineBuilder;
/**
* Produced by GrClip. It provides a set of modifications to the drawing state that are used to
@@ -105,8 +104,12 @@ public:
virtual bool quickContains(const SkRect&) const = 0;
virtual void getConservativeBounds(int width, int height, SkIRect* devResult,
bool* isIntersectionOfRects = nullptr) const = 0;
- virtual bool apply(GrContext*, const GrPipelineBuilder&, GrDrawContext*,
- const SkRect* devBounds, GrAppliedClip*) const = 0;
+ virtual bool apply(GrContext*,
+ GrDrawContext*,
+ const SkRect* devBounds,
+ bool useHWAA,
+ bool hasUserStencilSettings,
+ GrAppliedClip* out) const = 0;
virtual ~GrClip() {}
};
@@ -119,8 +122,12 @@ private:
bool quickContains(const SkRect&) const final { return true; }
void getConservativeBounds(int width, int height, SkIRect* devResult,
bool* isIntersectionOfRects) const final;
- bool apply(GrContext*, const GrPipelineBuilder&, GrDrawContext*,
- const SkRect*, GrAppliedClip*) const final { return true; }
+ bool apply(GrContext*,
+ GrDrawContext*,
+ const SkRect* /* devBounds */,
+ bool /* useHWAA */,
+ bool /* hasUserStencilSettings */,
+ GrAppliedClip* /* out */) const final { return true; }
};
/**
@@ -180,8 +187,12 @@ public:
bool* isIntersectionOfRects) const final;
private:
- bool apply(GrContext*, const GrPipelineBuilder&, GrDrawContext*,
- const SkRect* devBounds, GrAppliedClip* out) const final;
+ bool apply(GrContext*,
+ GrDrawContext*,
+ const SkRect* devBounds,
+ bool useHWAA,
+ bool hasUserStencilSettings,
+ GrAppliedClip* out) const final;
GrScissorState fScissorState;
SkRect fDeviceBounds;
@@ -209,8 +220,12 @@ public:
bool quickContains(const SkRect&) const final;
void getConservativeBounds(int width, int height, SkIRect* devResult,
bool* isIntersectionOfRects) const final;
- bool apply(GrContext*, const GrPipelineBuilder&, GrDrawContext*,
- const SkRect* devBounds, GrAppliedClip*) const final;
+ bool apply(GrContext*,
+ GrDrawContext*,
+ const SkRect* devBounds,
+ bool useHWAA,
+ bool hasUserStencilSettings,
+ GrAppliedClip* out) const final;
private:
SkIPoint fOrigin;
diff --git a/src/gpu/GrClip.cpp b/src/gpu/GrClip.cpp
index b0577c5122..f55a2499b4 100644
--- a/src/gpu/GrClip.cpp
+++ b/src/gpu/GrClip.cpp
@@ -41,9 +41,12 @@ void GrFixedClip::getConservativeBounds(int width, int height, SkIRect* devResul
}
}
-bool GrFixedClip::apply(GrContext*, const GrPipelineBuilder& pipelineBuilder,
+bool GrFixedClip::apply(GrContext*,
GrDrawContext* drawContext,
- const SkRect* devBounds, GrAppliedClip* out) const {
+ const SkRect* devBounds,
+ bool isHWAntiAlias,
+ bool hasUserStencilSettings,
+ GrAppliedClip* out) const {
SkASSERT(!fDeviceBounds.isLargest());
if (fScissorState.enabled()) {
SkIRect tightScissor;
@@ -90,8 +93,11 @@ void GrClipStackClip::getConservativeBounds(int width, int height, SkIRect* devR
}
bool GrClipStackClip::apply(GrContext* context,
- const GrPipelineBuilder& pipelineBuilder, GrDrawContext* drawContext,
- const SkRect* devBounds, GrAppliedClip* out) const {
- return GrClipMaskManager::SetupClipping(context, pipelineBuilder, drawContext,
- *this, devBounds, out);
+ GrDrawContext* drawContext,
+ const SkRect* devBounds,
+ bool useHWAA,
+ bool hasUserStencilSettings,
+ GrAppliedClip* out) const {
+ return GrClipMaskManager::SetupClipping(context, drawContext, *this, devBounds,
+ useHWAA, hasUserStencilSettings, out);
}
diff --git a/src/gpu/GrClipMaskManager.cpp b/src/gpu/GrClipMaskManager.cpp
index c591bf1182..13dafea0e4 100644
--- a/src/gpu/GrClipMaskManager.cpp
+++ b/src/gpu/GrClipMaskManager.cpp
@@ -115,7 +115,7 @@ bool GrClipMaskManager::PathNeedsSWRenderer(GrContext* context,
* entire clip should be rendered in SW and then uploaded en masse to the gpu.
*/
bool GrClipMaskManager::UseSWOnlyPath(GrContext* context,
- const GrPipelineBuilder& pipelineBuilder,
+ bool hasUserStencilSettings,
const GrDrawContext* drawContext,
const SkVector& clipToMaskOffset,
const GrReducedClip::ElementList& elements) {
@@ -135,7 +135,7 @@ bool GrClipMaskManager::UseSWOnlyPath(GrContext* context,
bool needsStencil = invert ||
SkRegion::kIntersect_Op == op || SkRegion::kReverseDifference_Op == op;
- if (PathNeedsSWRenderer(context, pipelineBuilder.hasUserStencilSettings(),
+ if (PathNeedsSWRenderer(context, hasUserStencilSettings,
drawContext, translate, element, nullptr, needsStencil)) {
return true;
}
@@ -226,10 +226,11 @@ static bool get_analytic_clip_processor(const GrReducedClip::ElementList& elemen
// sort out what kind of clip mask needs to be created: alpha, stencil,
// scissor, or entirely software
bool GrClipMaskManager::SetupClipping(GrContext* context,
- const GrPipelineBuilder& pipelineBuilder,
GrDrawContext* drawContext,
const GrClipStackClip& clip,
const SkRect* origDevBounds,
+ bool useHWAA,
+ bool hasUserStencilSettings,
GrAppliedClip* out) {
if (!clip.clipStack() || clip.clipStack()->isWideOpen()) {
return true;
@@ -293,8 +294,7 @@ bool GrClipMaskManager::SetupClipping(GrContext* context,
// With a single color sample, any coverage info is lost from color once it hits the
// color buffer anyway, so we may as well use coverage AA if nothing else in the pipe
// is multisampled.
- disallowAnalyticAA = pipelineBuilder.isHWAntialias() ||
- pipelineBuilder.hasUserStencilSettings();
+ disallowAnalyticAA = useHWAA || hasUserStencilSettings;
}
sk_sp<GrFragmentProcessor> clipFP;
if (requiresAA &&
@@ -321,7 +321,7 @@ bool GrClipMaskManager::SetupClipping(GrContext* context,
SkIntToScalar(-clipSpaceIBounds.fTop)
};
- if (UseSWOnlyPath(context, pipelineBuilder, drawContext,
+ if (UseSWOnlyPath(context, hasUserStencilSettings, drawContext,
clipToMaskOffset, elements)) {
// The clip geometry is complex enough that it will be more efficient to create it
// entirely in software
diff --git a/src/gpu/GrClipMaskManager.h b/src/gpu/GrClipMaskManager.h
index dc24d9f5b3..5cf3569072 100644
--- a/src/gpu/GrClipMaskManager.h
+++ b/src/gpu/GrClipMaskManager.h
@@ -15,15 +15,10 @@ class GrAppliedClip;
class GrClipStackClip;
class GrContext;
class GrDrawContext;
-class GrFixedClip;
class GrPathRenderer;
-class GrPathRendererChain;
-class GrPipelineBuilder;
-class GrResourceProvider;
class GrTexture;
class GrTextureProvider;
class GrUniqueKey;
-struct GrUserStencilSettings;
/**
@@ -43,8 +38,13 @@ public:
* then the draw can be skipped. devBounds is optional but can help optimize
* clipping.
*/
- static bool SetupClipping(GrContext*, const GrPipelineBuilder&, GrDrawContext*,
- const GrClipStackClip&, const SkRect* devBounds, GrAppliedClip*);
+ static bool SetupClipping(GrContext*,
+ GrDrawContext*,
+ const GrClipStackClip&,
+ const SkRect* devBounds,
+ bool useHWAA,
+ bool hasUserStencilSettings,
+ GrAppliedClip* out);
private:
static bool PathNeedsSWRenderer(GrContext* context,
@@ -82,7 +82,7 @@ private:
const SkIRect& clipSpaceIBounds);
static bool UseSWOnlyPath(GrContext*,
- const GrPipelineBuilder&,
+ bool hasUserStencilSettings,
const GrDrawContext*,
const SkVector& clipToMaskOffset,
const GrReducedClip::ElementList& elements);
diff --git a/src/gpu/GrDrawContext.cpp b/src/gpu/GrDrawContext.cpp
index 80b18ecf88..24408a2a38 100644
--- a/src/gpu/GrDrawContext.cpp
+++ b/src/gpu/GrDrawContext.cpp
@@ -486,13 +486,12 @@ void GrDrawContextPriv::clearStencilClip(const SkIRect& rect, bool insideClip) {
fDrawContext->accessRenderTarget());
}
-void GrDrawContextPriv::stencilPath(const GrPipelineBuilder& pipelineBuilder,
- const GrClip& clip,
+void GrDrawContextPriv::stencilPath(const GrClip& clip,
+ const GrUserStencilSettings* ss,
+ bool useHWAA,
const SkMatrix& viewMatrix,
- const GrPath* path,
- GrPathRendering::FillType fill) {
- fDrawContext->getDrawTarget()->stencilPath(pipelineBuilder, fDrawContext,
- clip, viewMatrix, path, fill);
+ const GrPath* path) {
+ fDrawContext->getDrawTarget()->stencilPath(fDrawContext, clip, ss, useHWAA, viewMatrix, path);
}
void GrDrawContextPriv::stencilRect(const GrFixedClip& clip,
diff --git a/src/gpu/GrDrawContextPriv.h b/src/gpu/GrDrawContextPriv.h
index c77d8e488b..68f4204123 100644
--- a/src/gpu/GrDrawContextPriv.h
+++ b/src/gpu/GrDrawContextPriv.h
@@ -33,11 +33,11 @@ public:
const SkMatrix& viewMatrix,
const SkRect& rect);
- void stencilPath(const GrPipelineBuilder&,
- const GrClip&,
+ void stencilPath(const GrClip&,
+ const GrUserStencilSettings* ss,
+ bool useHWAA,
const SkMatrix& viewMatrix,
- const GrPath*,
- GrPathRendering::FillType);
+ const GrPath*);
bool drawAndStencilRect(const GrFixedClip&,
const GrUserStencilSettings*,
diff --git a/src/gpu/GrDrawTarget.cpp b/src/gpu/GrDrawTarget.cpp
index 252726c710..601b1b552a 100644
--- a/src/gpu/GrDrawTarget.cpp
+++ b/src/gpu/GrDrawTarget.cpp
@@ -329,7 +329,9 @@ void GrDrawTarget::drawBatch(const GrPipelineBuilder& pipelineBuilder,
GrAppliedClip appliedClip;
SkRect bounds;
batch_bounds(&bounds, batch);
- if (!clip.apply(fContext, pipelineBuilder, drawContext, &bounds, &appliedClip)) {
+ if (!clip.apply(fContext, drawContext, &bounds,
+ pipelineBuilder.isHWAntialias(), pipelineBuilder.hasUserStencilSettings(),
+ &appliedClip)) {
return;
}
@@ -403,19 +405,19 @@ void GrDrawTarget::drawBatch(const GrPipelineBuilder& pipelineBuilder,
this->recordBatch(batch, clippedBounds);
}
-void GrDrawTarget::stencilPath(const GrPipelineBuilder& pipelineBuilder,
- GrDrawContext* drawContext,
+void GrDrawTarget::stencilPath(GrDrawContext* drawContext,
const GrClip& clip,
+ const GrUserStencilSettings* ss,
+ bool useHWAA,
const SkMatrix& viewMatrix,
- const GrPath* path,
- GrPathRendering::FillType fill) {
+ const GrPath* path) {
// TODO: extract portions of checkDraw that are relevant to path stenciling.
SkASSERT(path);
SkASSERT(this->caps()->shaderCaps()->pathRenderingSupport());
// Setup clip
GrAppliedClip appliedClip;
- if (!clip.apply(fContext, pipelineBuilder, drawContext, nullptr, &appliedClip)) {
+ if (!clip.apply(fContext, drawContext, nullptr, useHWAA, SkToBool(ss), &appliedClip)) {
return;
}
// TODO: respect fClipBatchToBounds if we ever start computing bounds here.
@@ -432,8 +434,8 @@ void GrDrawTarget::stencilPath(const GrPipelineBuilder& pipelineBuilder,
}
GrBatch* batch = GrStencilPathBatch::Create(viewMatrix,
- pipelineBuilder.isHWAntialias(),
- fill,
+ useHWAA,
+ path->getFillType(),
appliedClip.hasStencilClip(),
stencilAttachment->bits(),
appliedClip.scissorState(),
diff --git a/src/gpu/GrDrawTarget.h b/src/gpu/GrDrawTarget.h
index 5f91baa33b..18ad1c8699 100644
--- a/src/gpu/GrDrawTarget.h
+++ b/src/gpu/GrDrawTarget.h
@@ -109,14 +109,17 @@ public:
void addBatch(sk_sp<GrBatch>);
/**
- * Draws path into the stencil buffer. The fill must be either even/odd or
- * winding (not inverse or hairline). It will respect the HW antialias flag
- * on the GrPipelineBuilder (if possible in the 3D API). Note, we will never have an inverse
+ * Draws path into the stencil buffer. The path's fill must be either even/odd or
+ * winding (not inverse or hairline). It will respect the HW antialias boolean
+ * (if possible in the 3D API). Note, we will never have an inverse
* fill with stencil path
*/
- void stencilPath(const GrPipelineBuilder&, GrDrawContext*,
- const GrClip&, const SkMatrix& viewMatrix,
- const GrPath*, GrPathRendering::FillType);
+ void stencilPath(GrDrawContext*,
+ const GrClip&,
+ const GrUserStencilSettings*,
+ bool useHWAA,
+ const SkMatrix& viewMatrix,
+ const GrPath*);
/** Discards the contents render target. */
void discard(GrRenderTarget*);
diff --git a/src/gpu/batches/GrStencilAndCoverPathRenderer.cpp b/src/gpu/batches/GrStencilAndCoverPathRenderer.cpp
index 5f98cfd15c..01193ad0aa 100644
--- a/src/gpu/batches/GrStencilAndCoverPathRenderer.cpp
+++ b/src/gpu/batches/GrStencilAndCoverPathRenderer.cpp
@@ -74,15 +74,9 @@ void GrStencilAndCoverPathRenderer::onStencilPath(const StencilPathArgs& args) {
SkPath path;
args.fShape->asPath(&path);
- GrPaint paint;
- paint.setXPFactory(GrDisableColorXPFactory::Make());
- paint.setAntiAlias(args.fIsAA);
-
- const GrPipelineBuilder pipelineBuilder(paint, args.fIsAA);
-
SkAutoTUnref<GrPath> p(get_gr_path(fResourceProvider, path, GrStyle::SimpleFill()));
- args.fDrawContext->drawContextPriv().stencilPath(pipelineBuilder, *args.fClip,
- *args.fViewMatrix, p, p->getFillType());
+ args.fDrawContext->drawContextPriv().stencilPath(*args.fClip, nullptr, args.fIsAA,
+ *args.fViewMatrix, p);
}
bool GrStencilAndCoverPathRenderer::onDrawPath(const DrawPathArgs& args) {
@@ -113,13 +107,10 @@ bool GrStencilAndCoverPathRenderer::onDrawPath(const DrawPathArgs& args) {
);
// fake inverse with a stencil and cover
- {
- GrPipelineBuilder pipelineBuilder(*args.fPaint, args.fPaint->isAntiAlias());
- pipelineBuilder.setUserStencil(&kInvertedCoverPass);
-
- args.fDrawContext->drawContextPriv().stencilPath(pipelineBuilder, *args.fClip,
- viewMatrix, p, p->getFillType());
- }
+ args.fDrawContext->drawContextPriv().stencilPath(*args.fClip,
+ &kInvertedCoverPass,
+ args.fPaint->isAntiAlias(),
+ viewMatrix, p);
SkMatrix invert = SkMatrix::I();
SkRect bounds =