Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(135)

Unified Diff: src/gpu/GrDrawContext.cpp

Issue 1406173003: Loosen requirement that there be only one GrDrawTarget (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Fix comment Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/gpu/GrContext.cpp ('k') | src/gpu/GrDrawTarget.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/gpu/GrDrawContext.cpp
diff --git a/src/gpu/GrDrawContext.cpp b/src/gpu/GrDrawContext.cpp
index dcf148f8113f642b7e8c25bce74c66ac4bc13277..1aec92ec4c49349b7af103a2169d489dc7602461 100644
--- a/src/gpu/GrDrawContext.cpp
+++ b/src/gpu/GrDrawContext.cpp
@@ -37,34 +37,52 @@ private:
GrContext* fContext;
};
+// In MDB mode the reffing of the 'getLastDrawTarget' call's result allows in-progress
+// drawTargets to be picked up and added to by drawContexts lower in the call
+// stack. When this occurs with a closed drawTarget, a new one will be allocated
+// when the drawContext attempts to use it (via getDrawTarget).
GrDrawContext::GrDrawContext(GrContext* context,
GrRenderTarget* rt,
- GrDrawTarget* drawTarget,
const SkSurfaceProps* surfaceProps)
: fContext(context)
, fRenderTarget(rt)
- , fDrawTarget(SkRef(drawTarget))
+ , fDrawTarget(SkSafeRef(rt->getLastDrawTarget()))
, fTextContext(nullptr)
, fSurfaceProps(SkSurfacePropsCopyOrDefault(surfaceProps)) {
SkDEBUGCODE(this->validate();)
}
-GrDrawContext::~GrDrawContext() {
- SkSafeUnref(fDrawTarget);
-}
-
#ifdef SK_DEBUG
void GrDrawContext::validate() const {
SkASSERT(fRenderTarget);
ASSERT_OWNED_RESOURCE(fRenderTarget);
+
+ if (fDrawTarget && !fDrawTarget->isClosed()) {
+ SkASSERT(fRenderTarget->getLastDrawTarget() == fDrawTarget);
+ }
}
#endif
+GrDrawContext::~GrDrawContext() {
+ SkSafeUnref(fDrawTarget);
+}
+
+GrDrawTarget* GrDrawContext::getDrawTarget() {
+ SkDEBUGCODE(this->validate();)
+
+ if (!fDrawTarget || fDrawTarget->isClosed()) {
+ fDrawTarget = fContext->newDrawTarget(fRenderTarget);
+ fRenderTarget->setLastDrawTarget(fDrawTarget);
+ }
+
+ return fDrawTarget;
+}
+
void GrDrawContext::copySurface(GrSurface* src, const SkIRect& srcRect, const SkIPoint& dstPoint) {
RETURN_IF_ABANDONED
SkDEBUGCODE(this->validate();)
- fDrawTarget->copySurface(fRenderTarget, src, srcRect, dstPoint);
+ this->getDrawTarget()->copySurface(fRenderTarget, src, srcRect, dstPoint);
}
@@ -126,8 +144,8 @@ void GrDrawContext::drawPathsFromRange(const GrPipelineBuilder* pipelineBuilder,
RETURN_IF_ABANDONED
SkDEBUGCODE(this->validate();)
- fDrawTarget->drawPathsFromRange(*pipelineBuilder, viewMatrix, localMatrix, color, range, draw,
- (GrPathRendering::FillType) fill);
+ this->getDrawTarget()->drawPathsFromRange(*pipelineBuilder, viewMatrix, localMatrix, color,
+ range, draw, (GrPathRendering::FillType) fill);
}
void GrDrawContext::discard() {
@@ -135,7 +153,7 @@ void GrDrawContext::discard() {
SkDEBUGCODE(this->validate();)
AutoCheckFlush acf(fContext);
- fDrawTarget->discard(fRenderTarget);
+ this->getDrawTarget()->discard(fRenderTarget);
}
void GrDrawContext::clear(const SkIRect* rect,
@@ -145,7 +163,7 @@ void GrDrawContext::clear(const SkIRect* rect,
SkDEBUGCODE(this->validate();)
AutoCheckFlush acf(fContext);
- fDrawTarget->clear(rect, color, canIgnoreRect, fRenderTarget);
+ this->getDrawTarget()->clear(rect, color, canIgnoreRect, fRenderTarget);
}
@@ -191,11 +209,11 @@ void GrDrawContext::drawPaint(const GrClip& clip,
AutoCheckFlush acf(fContext);
GrPipelineBuilder pipelineBuilder(*paint, fRenderTarget, clip);
- fDrawTarget->drawNonAARect(pipelineBuilder,
- paint->getColor(),
- SkMatrix::I(),
- r,
- localMatrix);
+ this->getDrawTarget()->drawNonAARect(pipelineBuilder,
+ paint->getColor(),
+ SkMatrix::I(),
+ r,
+ localMatrix);
}
}
@@ -253,7 +271,7 @@ void GrDrawContext::drawRect(const GrClip& clip,
// Will it blend?
GrColor clearColor;
if (paint.isConstantBlendedColor(&clearColor)) {
- fDrawTarget->clear(nullptr, clearColor, true, fRenderTarget);
+ this->getDrawTarget()->clear(nullptr, clearColor, true, fRenderTarget);
return;
}
}
@@ -279,7 +297,7 @@ void GrDrawContext::drawRect(const GrClip& clip,
viewMatrix.mapRect(&devBoundRect, rect);
batch.reset(GrRectBatchFactory::CreateAAFill(color, viewMatrix, rect, devBoundRect));
}
- fDrawTarget->drawBatch(pipelineBuilder, batch);
+ this->getDrawTarget()->drawBatch(pipelineBuilder, batch);
return;
}
@@ -294,10 +312,10 @@ void GrDrawContext::drawRect(const GrClip& clip,
// is enabled because it can cause ugly artifacts.
pipelineBuilder.setState(GrPipelineBuilder::kSnapVerticesToPixelCenters_Flag,
snapToPixelCenters);
- fDrawTarget->drawBatch(pipelineBuilder, batch);
+ this->getDrawTarget()->drawBatch(pipelineBuilder, batch);
} else {
// filled BW rect
- fDrawTarget->drawNonAARect(pipelineBuilder, color, viewMatrix, rect);
+ this->getDrawTarget()->drawNonAARect(pipelineBuilder, color, viewMatrix, rect);
}
}
@@ -312,11 +330,11 @@ void GrDrawContext::drawNonAARectToRect(const GrClip& clip,
AutoCheckFlush acf(fContext);
GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip);
- fDrawTarget->drawNonAARect(pipelineBuilder,
- paint.getColor(),
- viewMatrix,
- rectToDraw,
- localRect);
+ this->getDrawTarget()->drawNonAARect(pipelineBuilder,
+ paint.getColor(),
+ viewMatrix,
+ rectToDraw,
+ localRect);
}
void GrDrawContext::drawNonAARectWithLocalMatrix(const GrClip& clip,
@@ -330,11 +348,11 @@ void GrDrawContext::drawNonAARectWithLocalMatrix(const GrClip& clip,
AutoCheckFlush acf(fContext);
GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip);
- fDrawTarget->drawNonAARect(pipelineBuilder,
- paint.getColor(),
- viewMatrix,
- rectToDraw,
- localMatrix);
+ this->getDrawTarget()->drawNonAARect(pipelineBuilder,
+ paint.getColor(),
+ viewMatrix,
+ rectToDraw,
+ localMatrix);
}
void GrDrawContext::drawVertices(const GrClip& clip,
@@ -376,7 +394,7 @@ void GrDrawContext::drawVertices(const GrClip& clip,
indexCount, colors, texCoords,
bounds));
- fDrawTarget->drawBatch(pipelineBuilder, batch);
+ this->getDrawTarget()->drawBatch(pipelineBuilder, batch);
}
///////////////////////////////////////////////////////////////////////////////
@@ -400,7 +418,7 @@ void GrDrawContext::drawAtlas(const GrClip& clip,
SkAutoTUnref<GrDrawBatch> batch(GrDrawAtlasBatch::Create(geometry, viewMatrix, spriteCount,
xform, texRect, colors));
- fDrawTarget->drawBatch(pipelineBuilder, batch);
+ this->getDrawTarget()->drawBatch(pipelineBuilder, batch);
}
///////////////////////////////////////////////////////////////////////////////
@@ -430,7 +448,7 @@ void GrDrawContext::drawRRect(const GrClip& clip,
GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip);
GrColor color = paint.getColor();
- if (!GrOvalRenderer::DrawRRect(fDrawTarget,
+ if (!GrOvalRenderer::DrawRRect(this->getDrawTarget(),
pipelineBuilder,
color,
viewMatrix,
@@ -440,7 +458,7 @@ void GrDrawContext::drawRRect(const GrClip& clip,
SkPath path;
path.setIsVolatile(true);
path.addRRect(rrect);
- this->internalDrawPath(fDrawTarget, &pipelineBuilder, viewMatrix, color,
+ this->internalDrawPath(this->getDrawTarget(), &pipelineBuilder, viewMatrix, color,
paint.isAntiAlias(), path, strokeInfo);
}
}
@@ -463,7 +481,7 @@ void GrDrawContext::drawDRRect(const GrClip& clip,
GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip);
GrColor color = paint.getColor();
- if (!GrOvalRenderer::DrawDRRect(fDrawTarget,
+ if (!GrOvalRenderer::DrawDRRect(this->getDrawTarget(),
pipelineBuilder,
color,
viewMatrix,
@@ -477,7 +495,7 @@ void GrDrawContext::drawDRRect(const GrClip& clip,
path.setFillType(SkPath::kEvenOdd_FillType);
GrStrokeInfo fillRec(SkStrokeRec::kFill_InitStyle);
- this->internalDrawPath(fDrawTarget, &pipelineBuilder, viewMatrix, color,
+ this->internalDrawPath(this->getDrawTarget(), &pipelineBuilder, viewMatrix, color,
paint.isAntiAlias(), path, fillRec);
}
}
@@ -509,7 +527,7 @@ void GrDrawContext::drawOval(const GrClip& clip,
GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip);
GrColor color = paint.getColor();
- if (!GrOvalRenderer::DrawOval(fDrawTarget,
+ if (!GrOvalRenderer::DrawOval(this->getDrawTarget(),
pipelineBuilder,
color,
viewMatrix,
@@ -519,7 +537,7 @@ void GrDrawContext::drawOval(const GrClip& clip,
SkPath path;
path.setIsVolatile(true);
path.addOval(oval);
- this->internalDrawPath(fDrawTarget, &pipelineBuilder, viewMatrix, color,
+ this->internalDrawPath(this->getDrawTarget(), &pipelineBuilder, viewMatrix, color,
paint.isAntiAlias(), path, strokeInfo);
}
}
@@ -582,7 +600,7 @@ void GrDrawContext::drawBatch(const GrClip& clip,
AutoCheckFlush acf(fContext);
GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip);
- fDrawTarget->drawBatch(pipelineBuilder, batch);
+ this->getDrawTarget()->drawBatch(pipelineBuilder, batch);
}
void GrDrawContext::drawPath(const GrClip& clip,
@@ -621,7 +639,7 @@ void GrDrawContext::drawPath(const GrClip& clip,
if (is_nested_rects(viewMatrix, path, strokeInfo, rects)) {
SkAutoTUnref<GrDrawBatch> batch(GrRectBatchFactory::CreateAAFillNestedRects(
color, viewMatrix, rects));
- fDrawTarget->drawBatch(pipelineBuilder, batch);
+ this->getDrawTarget()->drawBatch(pipelineBuilder, batch);
return;
}
}
@@ -629,7 +647,7 @@ void GrDrawContext::drawPath(const GrClip& clip,
bool isOval = path.isOval(&ovalRect);
if (isOval && !path.isInverseFillType()) {
- if (GrOvalRenderer::DrawOval(fDrawTarget,
+ if (GrOvalRenderer::DrawOval(this->getDrawTarget(),
pipelineBuilder,
color,
viewMatrix,
@@ -640,8 +658,8 @@ void GrDrawContext::drawPath(const GrClip& clip,
}
}
}
- this->internalDrawPath(fDrawTarget, &pipelineBuilder, viewMatrix, color, paint.isAntiAlias(),
- path, strokeInfo);
+ this->internalDrawPath(this->getDrawTarget(), &pipelineBuilder, viewMatrix, color,
+ paint.isAntiAlias(), path, strokeInfo);
}
void GrDrawContext::internalDrawPath(GrDrawTarget* target,
@@ -736,5 +754,5 @@ void GrDrawContext::drawBatch(GrPipelineBuilder* pipelineBuilder, GrDrawBatch* b
RETURN_IF_ABANDONED
SkDEBUGCODE(this->validate();)
- fDrawTarget->drawBatch(*pipelineBuilder, batch);
+ this->getDrawTarget()->drawBatch(*pipelineBuilder, batch);
}
« no previous file with comments | « src/gpu/GrContext.cpp ('k') | src/gpu/GrDrawTarget.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698