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

Unified Diff: src/gpu/GrContext.cpp

Issue 428103003: Exit early when draw can be skipped. Be more robust against abandoned GrContext. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 6 years, 5 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 | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/gpu/GrContext.cpp
diff --git a/src/gpu/GrContext.cpp b/src/gpu/GrContext.cpp
index 95e0d51cf8979dae8c9a6eaf7cfbd9956d42c540..3dc78c117c74e7db63cecc5480036a1aac53a32b 100755
--- a/src/gpu/GrContext.cpp
+++ b/src/gpu/GrContext.cpp
@@ -644,12 +644,16 @@ bool GrContext::supportsIndex8PixelConfig(const GrTextureParams* params,
void GrContext::clear(const SkIRect* rect,
const GrColor color,
bool canIgnoreRect,
- GrRenderTarget* target) {
+ GrRenderTarget* renderTarget) {
+ ASSERT_OWNED_RESOURCE(renderTarget);
AutoRestoreEffects are;
AutoCheckFlush acf(this);
GR_CREATE_TRACE_MARKER_CONTEXT("GrContext::clear", this);
- this->prepareToDraw(NULL, BUFFERED_DRAW, &are, &acf)->clear(rect, color,
- canIgnoreRect, target);
+ GrDrawTarget* target = this->prepareToDraw(NULL, BUFFERED_DRAW, &are, &acf);
+ if (NULL == target) {
+ return;
+ }
+ target->clear(rect, color, canIgnoreRect, renderTarget);
}
void GrContext::drawPaint(const GrPaint& origPaint) {
@@ -794,6 +798,9 @@ void GrContext::drawRect(const GrPaint& paint,
AutoRestoreEffects are;
AutoCheckFlush acf(this);
GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW, &are, &acf);
+ if (NULL == target) {
+ return;
+ }
GR_CREATE_TRACE_MARKER("GrContext::drawRect", target);
SkScalar width = NULL == strokeInfo ? -1 : strokeInfo->getStrokeRec().getWidth();
@@ -918,6 +925,9 @@ void GrContext::drawRectToRect(const GrPaint& paint,
AutoRestoreEffects are;
AutoCheckFlush acf(this);
GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW, &are, &acf);
+ if (NULL == target) {
+ return;
+ }
GR_CREATE_TRACE_MARKER("GrContext::drawRectToRect", target);
@@ -975,6 +985,9 @@ void GrContext::drawVertices(const GrPaint& paint,
GrDrawTarget::AutoReleaseGeometry geo; // must be inside AutoCheckFlush scope
GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW, &are, &acf);
+ if (NULL == target) {
+ return;
+ }
GrDrawState* drawState = target->drawState();
GR_CREATE_TRACE_MARKER("GrContext::drawVertices", target);
@@ -1036,6 +1049,9 @@ void GrContext::drawRRect(const GrPaint& paint,
AutoRestoreEffects are;
AutoCheckFlush acf(this);
GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW, &are, &acf);
+ if (NULL == target) {
+ return;
+ }
GR_CREATE_TRACE_MARKER("GrContext::drawRRect", target);
@@ -1093,6 +1109,9 @@ void GrContext::drawOval(const GrPaint& paint,
AutoRestoreEffects are;
AutoCheckFlush acf(this);
GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW, &are, &acf);
+ if (NULL == target) {
+ return;
+ }
GR_CREATE_TRACE_MARKER("GrContext::drawOval", target);
@@ -1176,6 +1195,9 @@ void GrContext::drawPath(const GrPaint& paint, const SkPath& path, const GrStrok
AutoRestoreEffects are;
AutoCheckFlush acf(this);
GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW, &are, &acf);
+ if (NULL == target) {
+ return;
+ }
GrDrawState* drawState = target->drawState();
SkMatrix origViewMatrix = drawState->getViewMatrix();
@@ -1210,6 +1232,9 @@ void GrContext::drawPath(const GrPaint& paint, const SkPath& path, const GrStrok
AutoRestoreEffects are;
AutoCheckFlush acf(this);
GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW, &are, &acf);
+ if (NULL == target) {
+ return;
+ }
GrDrawState* drawState = target->drawState();
GR_CREATE_TRACE_MARKER1("GrContext::drawPath", target, "Is Convex", path.isConvex());
@@ -1539,15 +1564,21 @@ void GrContext::resolveRenderTarget(GrRenderTarget* target) {
// target. We don't today so we always perform a flush. We don't promise
// this to our clients, though.
this->flush();
- fGpu->resolveRenderTarget(target);
+ if (NULL != fGpu) {
+ fGpu->resolveRenderTarget(target);
+ }
}
-void GrContext::discardRenderTarget(GrRenderTarget* target) {
- SkASSERT(target);
- ASSERT_OWNED_RESOURCE(target);
+void GrContext::discardRenderTarget(GrRenderTarget* renderTarget) {
+ SkASSERT(renderTarget);
+ ASSERT_OWNED_RESOURCE(renderTarget);
AutoRestoreEffects are;
AutoCheckFlush acf(this);
- this->prepareToDraw(NULL, BUFFERED_DRAW, &are, &acf)->discard(target);
+ GrDrawTarget* target = this->prepareToDraw(NULL, BUFFERED_DRAW, &are, &acf);
+ if (NULL == target) {
+ return;
+ }
+ target->discard(renderTarget);
}
void GrContext::copyTexture(GrTexture* src, GrRenderTarget* dst, const SkIPoint* topLeft) {
@@ -1718,6 +1749,10 @@ GrDrawTarget* GrContext::prepareToDraw(const GrPaint* paint,
// Otherwise effects that own resources may keep those resources alive indefinitely.
SkASSERT(0 == fDrawState->numColorStages() && 0 == fDrawState->numCoverageStages());
+ if (NULL == fGpu) {
+ return NULL;
+ }
+
if (kNo_BufferedDraw == buffered && kYes_BufferedDraw == fLastDrawWasBuffered) {
fDrawBuffer->flush();
fLastDrawWasBuffered = kNo_BufferedDraw;
@@ -1734,6 +1769,10 @@ GrDrawTarget* GrContext::prepareToDraw(const GrPaint* paint,
GrPrintf("Partial pixel coverage will be incorrectly blended.\n");
}
#endif
+ if (fDrawState->getBlendOpts() & GrDrawState::kSkipDraw_BlendOptFlag) {
+ are->set(NULL);
+ return NULL;
+ }
} else {
fDrawState->reset(fViewMatrix);
fDrawState->setRenderTarget(fRenderTarget.get());
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698