Index: src/gpu/GrDrawContext.cpp |
diff --git a/src/gpu/GrDrawContext.cpp b/src/gpu/GrDrawContext.cpp |
index 96bc3f3d955b3ce498c517240374ce0c38170fc2..dcf148f8113f642b7e8c25bce74c66ac4bc13277 100644 |
--- a/src/gpu/GrDrawContext.cpp |
+++ b/src/gpu/GrDrawContext.cpp |
@@ -38,72 +38,81 @@ private: |
}; |
GrDrawContext::GrDrawContext(GrContext* context, |
+ GrRenderTarget* rt, |
GrDrawTarget* drawTarget, |
const SkSurfaceProps* surfaceProps) |
: fContext(context) |
+ , fRenderTarget(rt) |
, fDrawTarget(SkRef(drawTarget)) |
, fTextContext(nullptr) |
, fSurfaceProps(SkSurfacePropsCopyOrDefault(surfaceProps)) { |
+ SkDEBUGCODE(this->validate();) |
} |
GrDrawContext::~GrDrawContext() { |
SkSafeUnref(fDrawTarget); |
} |
-void GrDrawContext::copySurface(GrRenderTarget* dst, GrSurface* src, |
- const SkIRect& srcRect, const SkIPoint& dstPoint) { |
- RETURN_IF_ABANDONED |
+#ifdef SK_DEBUG |
+void GrDrawContext::validate() const { |
+ SkASSERT(fRenderTarget); |
+ ASSERT_OWNED_RESOURCE(fRenderTarget); |
+} |
+#endif |
- if (!this->prepareToDraw(dst)) { |
- return; |
- } |
+void GrDrawContext::copySurface(GrSurface* src, const SkIRect& srcRect, const SkIPoint& dstPoint) { |
+ RETURN_IF_ABANDONED |
+ SkDEBUGCODE(this->validate();) |
- fDrawTarget->copySurface(dst, src, srcRect, dstPoint); |
+ fDrawTarget->copySurface(fRenderTarget, src, srcRect, dstPoint); |
} |
-void GrDrawContext::drawText(GrRenderTarget* rt, const GrClip& clip, const GrPaint& grPaint, |
+void GrDrawContext::drawText(const GrClip& clip, const GrPaint& grPaint, |
const SkPaint& skPaint, |
const SkMatrix& viewMatrix, |
const char text[], size_t byteLength, |
SkScalar x, SkScalar y, const SkIRect& clipBounds) { |
RETURN_IF_ABANDONED |
+ SkDEBUGCODE(this->validate();) |
if (!fTextContext) { |
- fTextContext = fContext->textContext(fSurfaceProps, rt); |
+ fTextContext = fContext->textContext(fSurfaceProps, fRenderTarget); |
} |
- fTextContext->drawText(this, rt, clip, grPaint, skPaint, viewMatrix, |
+ fTextContext->drawText(this, fRenderTarget, clip, grPaint, skPaint, viewMatrix, |
text, byteLength, x, y, clipBounds); |
} |
-void GrDrawContext::drawPosText(GrRenderTarget* rt, const GrClip& clip, const GrPaint& grPaint, |
+void GrDrawContext::drawPosText(const GrClip& clip, const GrPaint& grPaint, |
const SkPaint& skPaint, |
const SkMatrix& viewMatrix, |
const char text[], size_t byteLength, |
const SkScalar pos[], int scalarsPerPosition, |
const SkPoint& offset, const SkIRect& clipBounds) { |
RETURN_IF_ABANDONED |
+ SkDEBUGCODE(this->validate();) |
if (!fTextContext) { |
- fTextContext = fContext->textContext(fSurfaceProps, rt); |
+ fTextContext = fContext->textContext(fSurfaceProps, fRenderTarget); |
} |
- fTextContext->drawPosText(this, rt, clip, grPaint, skPaint, viewMatrix, text, byteLength, |
+ fTextContext->drawPosText(this, fRenderTarget, clip, grPaint, skPaint, viewMatrix, text, byteLength, |
pos, scalarsPerPosition, offset, clipBounds); |
} |
-void GrDrawContext::drawTextBlob(GrRenderTarget* rt, const GrClip& clip, const SkPaint& skPaint, |
+void GrDrawContext::drawTextBlob(const GrClip& clip, const SkPaint& skPaint, |
const SkMatrix& viewMatrix, const SkTextBlob* blob, |
SkScalar x, SkScalar y, |
SkDrawFilter* filter, const SkIRect& clipBounds) { |
RETURN_IF_ABANDONED |
+ SkDEBUGCODE(this->validate();) |
if (!fTextContext) { |
- fTextContext = fContext->textContext(fSurfaceProps, rt); |
+ fTextContext = fContext->textContext(fSurfaceProps, fRenderTarget); |
} |
- fTextContext->drawTextBlob(this, rt, |
+ fTextContext->drawTextBlob(this, fRenderTarget, |
clip, skPaint, viewMatrix, blob, x, y, filter, clipBounds); |
} |
@@ -115,47 +124,43 @@ void GrDrawContext::drawPathsFromRange(const GrPipelineBuilder* pipelineBuilder, |
GrPathRangeDraw* draw, |
int /*GrPathRendering::FillType*/ fill) { |
RETURN_IF_ABANDONED |
+ SkDEBUGCODE(this->validate();) |
fDrawTarget->drawPathsFromRange(*pipelineBuilder, viewMatrix, localMatrix, color, range, draw, |
(GrPathRendering::FillType) fill); |
} |
-void GrDrawContext::discard(GrRenderTarget* renderTarget) { |
+void GrDrawContext::discard() { |
RETURN_IF_ABANDONED |
- SkASSERT(renderTarget); |
+ SkDEBUGCODE(this->validate();) |
+ |
AutoCheckFlush acf(fContext); |
- if (!this->prepareToDraw(renderTarget)) { |
- return; |
- } |
- fDrawTarget->discard(renderTarget); |
+ fDrawTarget->discard(fRenderTarget); |
} |
-void GrDrawContext::clear(GrRenderTarget* renderTarget, |
- const SkIRect* rect, |
+void GrDrawContext::clear(const SkIRect* rect, |
const GrColor color, |
bool canIgnoreRect) { |
RETURN_IF_ABANDONED |
- SkASSERT(renderTarget); |
+ SkDEBUGCODE(this->validate();) |
AutoCheckFlush acf(fContext); |
- if (!this->prepareToDraw(renderTarget)) { |
- return; |
- } |
- fDrawTarget->clear(rect, color, canIgnoreRect, renderTarget); |
+ fDrawTarget->clear(rect, color, canIgnoreRect, fRenderTarget); |
} |
-void GrDrawContext::drawPaint(GrRenderTarget* rt, |
- const GrClip& clip, |
+void GrDrawContext::drawPaint(const GrClip& clip, |
const GrPaint& origPaint, |
const SkMatrix& viewMatrix) { |
RETURN_IF_ABANDONED |
+ SkDEBUGCODE(this->validate();) |
+ |
// set rect to be big enough to fill the space, but not super-huge, so we |
// don't overflow fixed-point implementations |
SkRect r; |
r.setLTRB(0, 0, |
- SkIntToScalar(rt->width()), |
- SkIntToScalar(rt->height())); |
+ SkIntToScalar(fRenderTarget->width()), |
+ SkIntToScalar(fRenderTarget->height())); |
SkTCopyOnFirstWrite<GrPaint> paint(origPaint); |
// by definition this fills the entire clip, no need for AA |
@@ -175,7 +180,7 @@ void GrDrawContext::drawPaint(GrRenderTarget* rt, |
return; |
} |
inverse.mapRect(&r); |
- this->drawRect(rt, clip, *paint, viewMatrix, r); |
+ this->drawRect(clip, *paint, viewMatrix, r); |
} else { |
SkMatrix localMatrix; |
if (!viewMatrix.invert(&localMatrix)) { |
@@ -184,11 +189,8 @@ void GrDrawContext::drawPaint(GrRenderTarget* rt, |
} |
AutoCheckFlush acf(fContext); |
- if (!this->prepareToDraw(rt)) { |
- return; |
- } |
- GrPipelineBuilder pipelineBuilder(*paint, rt, clip); |
+ GrPipelineBuilder pipelineBuilder(*paint, fRenderTarget, clip); |
fDrawTarget->drawNonAARect(pipelineBuilder, |
paint->getColor(), |
SkMatrix::I(), |
@@ -202,27 +204,25 @@ static inline bool rect_contains_inclusive(const SkRect& rect, const SkPoint& po |
point.fY >= rect.fTop && point.fY <= rect.fBottom; |
} |
-void GrDrawContext::drawRect(GrRenderTarget* rt, |
- const GrClip& clip, |
+void GrDrawContext::drawRect(const GrClip& clip, |
const GrPaint& paint, |
const SkMatrix& viewMatrix, |
const SkRect& rect, |
const GrStrokeInfo* strokeInfo) { |
RETURN_IF_ABANDONED |
+ SkDEBUGCODE(this->validate();) |
+ |
if (strokeInfo && strokeInfo->isDashed()) { |
SkPath path; |
path.setIsVolatile(true); |
path.addRect(rect); |
- this->drawPath(rt, clip, paint, viewMatrix, path, *strokeInfo); |
+ this->drawPath(clip, paint, viewMatrix, path, *strokeInfo); |
return; |
} |
AutoCheckFlush acf(fContext); |
- if (!this->prepareToDraw(rt)) { |
- return; |
- } |
- GrPipelineBuilder pipelineBuilder(paint, rt, clip); |
+ GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip); |
SkScalar width = nullptr == strokeInfo ? -1 : strokeInfo->getWidth(); |
@@ -253,7 +253,7 @@ void GrDrawContext::drawRect(GrRenderTarget* rt, |
// Will it blend? |
GrColor clearColor; |
if (paint.isConstantBlendedColor(&clearColor)) { |
- fDrawTarget->clear(nullptr, clearColor, true, rt); |
+ fDrawTarget->clear(nullptr, clearColor, true, fRenderTarget); |
return; |
} |
} |
@@ -285,7 +285,7 @@ void GrDrawContext::drawRect(GrRenderTarget* rt, |
if (width >= 0) { |
// Non-AA hairlines are snapped to pixel centers to make which pixels are hit deterministic |
- bool snapToPixelCenters = (0 == width && !rt->isUnifiedMultisampled()); |
+ bool snapToPixelCenters = (0 == width && !fRenderTarget->isUnifiedMultisampled()); |
SkAutoTUnref<GrDrawBatch> batch(GrRectBatchFactory::CreateNonAAStroke( |
color, viewMatrix, rect, width, snapToPixelCenters)); |
@@ -301,19 +301,17 @@ void GrDrawContext::drawRect(GrRenderTarget* rt, |
} |
} |
-void GrDrawContext::drawNonAARectToRect(GrRenderTarget* rt, |
- const GrClip& clip, |
+void GrDrawContext::drawNonAARectToRect(const GrClip& clip, |
const GrPaint& paint, |
const SkMatrix& viewMatrix, |
const SkRect& rectToDraw, |
const SkRect& localRect) { |
RETURN_IF_ABANDONED |
+ SkDEBUGCODE(this->validate();) |
+ |
AutoCheckFlush acf(fContext); |
- if (!this->prepareToDraw(rt)) { |
- return; |
- } |
- GrPipelineBuilder pipelineBuilder(paint, rt, clip); |
+ GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip); |
fDrawTarget->drawNonAARect(pipelineBuilder, |
paint.getColor(), |
viewMatrix, |
@@ -321,19 +319,17 @@ void GrDrawContext::drawNonAARectToRect(GrRenderTarget* rt, |
localRect); |
} |
-void GrDrawContext::drawNonAARectWithLocalMatrix(GrRenderTarget* rt, |
- const GrClip& clip, |
+void GrDrawContext::drawNonAARectWithLocalMatrix(const GrClip& clip, |
const GrPaint& paint, |
const SkMatrix& viewMatrix, |
const SkRect& rectToDraw, |
const SkMatrix& localMatrix) { |
RETURN_IF_ABANDONED |
+ SkDEBUGCODE(this->validate();) |
+ |
AutoCheckFlush acf(fContext); |
- if (!this->prepareToDraw(rt)) { |
- return; |
- } |
- GrPipelineBuilder pipelineBuilder(paint, rt, clip); |
+ GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip); |
fDrawTarget->drawNonAARect(pipelineBuilder, |
paint.getColor(), |
viewMatrix, |
@@ -341,8 +337,7 @@ void GrDrawContext::drawNonAARectWithLocalMatrix(GrRenderTarget* rt, |
localMatrix); |
} |
-void GrDrawContext::drawVertices(GrRenderTarget* rt, |
- const GrClip& clip, |
+void GrDrawContext::drawVertices(const GrClip& clip, |
const GrPaint& paint, |
const SkMatrix& viewMatrix, |
GrPrimitiveType primitiveType, |
@@ -353,12 +348,11 @@ void GrDrawContext::drawVertices(GrRenderTarget* rt, |
const uint16_t indices[], |
int indexCount) { |
RETURN_IF_ABANDONED |
+ SkDEBUGCODE(this->validate();) |
+ |
AutoCheckFlush acf(fContext); |
- if (!this->prepareToDraw(rt)) { |
- return; |
- } |
- GrPipelineBuilder pipelineBuilder(paint, rt, clip); |
+ GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip); |
// TODO clients should give us bounds |
SkRect bounds; |
@@ -387,8 +381,7 @@ void GrDrawContext::drawVertices(GrRenderTarget* rt, |
/////////////////////////////////////////////////////////////////////////////// |
-void GrDrawContext::drawAtlas(GrRenderTarget* rt, |
- const GrClip& clip, |
+void GrDrawContext::drawAtlas(const GrClip& clip, |
const GrPaint& paint, |
const SkMatrix& viewMatrix, |
int spriteCount, |
@@ -396,12 +389,11 @@ void GrDrawContext::drawAtlas(GrRenderTarget* rt, |
const SkRect texRect[], |
const SkColor colors[]) { |
RETURN_IF_ABANDONED |
+ SkDEBUGCODE(this->validate();) |
+ |
AutoCheckFlush acf(fContext); |
- if (!this->prepareToDraw(rt)) { |
- return; |
- } |
- GrPipelineBuilder pipelineBuilder(paint, rt, clip); |
+ GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip); |
GrDrawAtlasBatch::Geometry geometry; |
geometry.fColor = paint.getColor(); |
@@ -413,13 +405,14 @@ void GrDrawContext::drawAtlas(GrRenderTarget* rt, |
/////////////////////////////////////////////////////////////////////////////// |
-void GrDrawContext::drawRRect(GrRenderTarget*rt, |
- const GrClip& clip, |
+void GrDrawContext::drawRRect(const GrClip& clip, |
const GrPaint& paint, |
const SkMatrix& viewMatrix, |
const SkRRect& rrect, |
const GrStrokeInfo& strokeInfo) { |
RETURN_IF_ABANDONED |
+ SkDEBUGCODE(this->validate();) |
+ |
if (rrect.isEmpty()) { |
return; |
} |
@@ -428,17 +421,15 @@ void GrDrawContext::drawRRect(GrRenderTarget*rt, |
SkPath path; |
path.setIsVolatile(true); |
path.addRRect(rrect); |
- this->drawPath(rt, clip, paint, viewMatrix, path, strokeInfo); |
+ this->drawPath(clip, paint, viewMatrix, path, strokeInfo); |
return; |
} |
AutoCheckFlush acf(fContext); |
- if (!this->prepareToDraw(rt)) { |
- return; |
- } |
- GrPipelineBuilder pipelineBuilder(paint, rt, clip); |
+ GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip); |
GrColor color = paint.getColor(); |
+ |
if (!GrOvalRenderer::DrawRRect(fDrawTarget, |
pipelineBuilder, |
color, |
@@ -456,23 +447,21 @@ void GrDrawContext::drawRRect(GrRenderTarget*rt, |
/////////////////////////////////////////////////////////////////////////////// |
-void GrDrawContext::drawDRRect(GrRenderTarget* rt, |
- const GrClip& clip, |
+void GrDrawContext::drawDRRect(const GrClip& clip, |
const GrPaint& paint, |
const SkMatrix& viewMatrix, |
const SkRRect& outer, |
const SkRRect& inner) { |
RETURN_IF_ABANDONED |
+ SkDEBUGCODE(this->validate();) |
+ |
if (outer.isEmpty()) { |
return; |
} |
AutoCheckFlush acf(fContext); |
- if (!this->prepareToDraw(rt)) { |
- return; |
- } |
- GrPipelineBuilder pipelineBuilder(paint, rt, clip); |
+ GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip); |
GrColor color = paint.getColor(); |
if (!GrOvalRenderer::DrawDRRect(fDrawTarget, |
pipelineBuilder, |
@@ -495,13 +484,14 @@ void GrDrawContext::drawDRRect(GrRenderTarget* rt, |
/////////////////////////////////////////////////////////////////////////////// |
-void GrDrawContext::drawOval(GrRenderTarget* rt, |
- const GrClip& clip, |
+void GrDrawContext::drawOval(const GrClip& clip, |
const GrPaint& paint, |
const SkMatrix& viewMatrix, |
const SkRect& oval, |
const GrStrokeInfo& strokeInfo) { |
RETURN_IF_ABANDONED |
+ SkDEBUGCODE(this->validate();) |
+ |
if (oval.isEmpty()) { |
return; |
} |
@@ -510,17 +500,15 @@ void GrDrawContext::drawOval(GrRenderTarget* rt, |
SkPath path; |
path.setIsVolatile(true); |
path.addOval(oval); |
- this->drawPath(rt, clip, paint, viewMatrix, path, strokeInfo); |
+ this->drawPath(clip, paint, viewMatrix, path, strokeInfo); |
return; |
} |
AutoCheckFlush acf(fContext); |
- if (!this->prepareToDraw(rt)) { |
- return; |
- } |
- GrPipelineBuilder pipelineBuilder(paint, rt, clip); |
+ GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip); |
GrColor color = paint.getColor(); |
+ |
if (!GrOvalRenderer::DrawOval(fDrawTarget, |
pipelineBuilder, |
color, |
@@ -586,29 +574,28 @@ static bool is_nested_rects(const SkMatrix& viewMatrix, |
return allEq || allGoE1; |
} |
-void GrDrawContext::drawBatch(GrRenderTarget* rt, const GrClip& clip, |
+void GrDrawContext::drawBatch(const GrClip& clip, |
const GrPaint& paint, GrDrawBatch* batch) { |
RETURN_IF_ABANDONED |
+ SkDEBUGCODE(this->validate();) |
AutoCheckFlush acf(fContext); |
- if (!this->prepareToDraw(rt)) { |
- return; |
- } |
- GrPipelineBuilder pipelineBuilder(paint, rt, clip); |
+ GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip); |
fDrawTarget->drawBatch(pipelineBuilder, batch); |
} |
-void GrDrawContext::drawPath(GrRenderTarget* rt, |
- const GrClip& clip, |
+void GrDrawContext::drawPath(const GrClip& clip, |
const GrPaint& paint, |
const SkMatrix& viewMatrix, |
const SkPath& path, |
const GrStrokeInfo& strokeInfo) { |
RETURN_IF_ABANDONED |
+ SkDEBUGCODE(this->validate();) |
+ |
if (path.isEmpty()) { |
if (path.isInverseFillType()) { |
- this->drawPaint(rt, clip, paint, viewMatrix); |
+ this->drawPaint(clip, paint, viewMatrix); |
} |
return; |
} |
@@ -621,11 +608,8 @@ void GrDrawContext::drawPath(GrRenderTarget* rt, |
// the writePixels that uploads to the scratch will perform a flush so we're |
// OK. |
AutoCheckFlush acf(fContext); |
- if (!this->prepareToDraw(rt)) { |
- return; |
- } |
- GrPipelineBuilder pipelineBuilder(paint, rt, clip); |
+ GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip); |
if (!strokeInfo.isDashed()) { |
bool useCoverageAA = paint.isAntiAlias() && |
!pipelineBuilder.getRenderTarget()->isUnifiedMultisampled(); |
@@ -670,7 +654,6 @@ void GrDrawContext::internalDrawPath(GrDrawTarget* target, |
RETURN_IF_ABANDONED |
SkASSERT(!path.isEmpty()); |
- |
// An Assumption here is that path renderer would use some form of tweaking |
// the src color (either the input alpha or in the frag shader) to implement |
// aa. If we have some future driver-mojo path AA that can do the right |
@@ -749,16 +732,9 @@ void GrDrawContext::internalDrawPath(GrDrawTarget* target, |
pr->drawPath(args); |
} |
-bool GrDrawContext::prepareToDraw(GrRenderTarget* rt) { |
- RETURN_FALSE_IF_ABANDONED |
- |
- ASSERT_OWNED_RESOURCE(rt); |
- SkASSERT(rt); |
- return true; |
-} |
- |
void GrDrawContext::drawBatch(GrPipelineBuilder* pipelineBuilder, GrDrawBatch* batch) { |
RETURN_IF_ABANDONED |
+ SkDEBUGCODE(this->validate();) |
fDrawTarget->drawBatch(*pipelineBuilder, batch); |
} |