aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar bsalomon@google.com <bsalomon@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2011-08-05 16:27:32 +0000
committerGravatar bsalomon@google.com <bsalomon@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2011-08-05 16:27:32 +0000
commit82866fd5a7ac55a7abe7bc1069741fa353e608d8 (patch)
treee6705e1604f32b823ef034be407df71e2a2d5965
parent3bbee32664d6b7eb55b66ceeb7860d679a3e5a38 (diff)
Fail path rendering gracefully when vb/ib space alloc fails
Review URL: http://codereview.appspot.com/4839050/ git-svn-id: http://skia.googlecode.com/svn/trunk@2052 2bbb7eff-a529-9590-31e7-b0007b416f81
-rw-r--r--gpu/src/GrPathRenderer.cpp22
1 files changed, 17 insertions, 5 deletions
diff --git a/gpu/src/GrPathRenderer.cpp b/gpu/src/GrPathRenderer.cpp
index 7220d0e4aa..26c92b8400 100644
--- a/gpu/src/GrPathRenderer.cpp
+++ b/gpu/src/GrPathRenderer.cpp
@@ -233,6 +233,9 @@ bool GrDefaultPathRenderer::requiresStencilPass(const GrDrawTarget* target,
void GrDefaultPathRenderer::pathWillClear() {
fSubpathVertCount.realloc(0);
fTarget->resetVertexSource();
+ if (fUseIndexedDraw) {
+ fTarget->resetIndexSource();
+ }
fPreviousSrcTol = -GR_Scalar1;
fPreviousStages = -1;
}
@@ -268,9 +271,6 @@ bool GrDefaultPathRenderer::createGeom(GrScalar srcSpaceTol,
return false;
}
- fPreviousSrcTol = srcSpaceTol;
- fPreviousStages = stages;
-
GrVertexLayout layout = 0;
for (int s = 0; s < GrDrawTarget::kNumStages; ++s) {
if ((1 << s) & stages) {
@@ -298,14 +298,21 @@ bool GrDefaultPathRenderer::createGeom(GrScalar srcSpaceTol,
}
GrPoint* base;
- fTarget->reserveVertexSpace(layout, maxPts, (void**)&base);
+ if (!fTarget->reserveVertexSpace(layout, maxPts, (void**)&base)) {
+ return false;
+ }
+ GrAssert(NULL != base);
GrPoint* vert = base;
uint16_t* idxBase = NULL;
uint16_t* idx = NULL;
uint16_t subpathIdxStart = 0;
if (fUseIndexedDraw) {
- fTarget->reserveIndexSpace(maxIdxs, (void**)&idxBase);
+ if (!fTarget->reserveIndexSpace(maxIdxs, (void**)&idxBase)) {
+ fTarget->resetVertexSource();
+ return false;
+ }
+ GrAssert(NULL != idxBase);
idx = idxBase;
}
@@ -393,6 +400,11 @@ FINISHED:
}
}
}
+ // set these at the end so if we failed on first drawPath inside a
+ // setPath/clearPath block we won't assume geom was created on a subsequent
+ // drawPath in the same block.
+ fPreviousSrcTol = srcSpaceTol;
+ fPreviousStages = stages;
return true;
}