From b372942bbc842b5728cbc8e9dd024928a793846a Mon Sep 17 00:00:00 2001 From: "bsalomon@google.com" Date: Wed, 7 Mar 2012 19:13:28 +0000 Subject: make pathrenderers release their geometry before returning Review URL: http://codereview.appspot.com/5753073/ git-svn-id: http://skia.googlecode.com/svn/trunk@3335 2bbb7eff-a529-9590-31e7-b0007b416f81 --- src/gpu/GrAAConvexPathRenderer.cpp | 11 ++++------- src/gpu/GrAAHairLinePathRenderer.cpp | 24 ++++++++++++++---------- src/gpu/GrAAHairLinePathRenderer.h | 3 ++- src/gpu/GrDefaultPathRenderer.cpp | 29 +++++++++++++---------------- src/gpu/GrDefaultPathRenderer.h | 3 ++- 5 files changed, 35 insertions(+), 35 deletions(-) diff --git a/src/gpu/GrAAConvexPathRenderer.cpp b/src/gpu/GrAAConvexPathRenderer.cpp index 029d493522..d1715e9079 100644 --- a/src/gpu/GrAAConvexPathRenderer.cpp +++ b/src/gpu/GrAAConvexPathRenderer.cpp @@ -505,15 +505,12 @@ bool GrAAConvexPathRenderer::onDrawPath(const SkPath& origPath, return false; } - if (!target->reserveVertexSpace(layout, - vCount, - reinterpret_cast(&verts))) { - return false; - } - if (!target->reserveIndexSpace(iCount, reinterpret_cast(&idxs))) { - target->resetVertexSource(); + GrDrawTarget::AutoReleaseGeometry arg(target, layout, vCount, iCount); + if (!arg.succeeded()) { return false; } + verts = reinterpret_cast(arg.vertices()); + idxs = reinterpret_cast(arg.indices()); create_vertices(segments, fanPt, verts, idxs); diff --git a/src/gpu/GrAAHairLinePathRenderer.cpp b/src/gpu/GrAAHairLinePathRenderer.cpp index 3ed4488f2b..527c18b36b 100644 --- a/src/gpu/GrAAHairLinePathRenderer.cpp +++ b/src/gpu/GrAAHairLinePathRenderer.cpp @@ -500,12 +500,14 @@ void add_line(const SkPoint p[2], } -bool GrAAHairLinePathRenderer::createGeom(const SkPath& path, - const GrVec* translate, - GrDrawTarget* target, - GrDrawState::StageMask stageMask, - int* lineCnt, - int* quadCnt) { +bool GrAAHairLinePathRenderer::createGeom( + const SkPath& path, + const GrVec* translate, + GrDrawTarget* target, + GrDrawState::StageMask stageMask, + int* lineCnt, + int* quadCnt, + GrDrawTarget::AutoReleaseGeometry* arg) { const GrDrawState& drawState = target->getDrawState(); int rtHeight = drawState.getRenderTarget()->height(); @@ -542,11 +544,12 @@ bool GrAAHairLinePathRenderer::createGeom(const SkPath& path, GrAssert(sizeof(Vertex) == GrDrawTarget::VertexSize(layout)); - Vertex* verts; - if (!target->reserveVertexSpace(layout, vertCnt, (void**)&verts)) { + if (!arg->set(target, layout, vertCnt, 0)) { return false; } + Vertex* verts = reinterpret_cast(arg->vertices()); + const GrMatrix* toDevice = NULL; const GrMatrix* toSrc = NULL; GrMatrix ivm; @@ -597,13 +600,14 @@ bool GrAAHairLinePathRenderer::onDrawPath(const SkPath& path, int lineCnt; int quadCnt; - + GrDrawTarget::AutoReleaseGeometry arg; if (!this->createGeom(path, translate, target, stageMask, &lineCnt, - &quadCnt)) { + &quadCnt, + &arg)) { return false; } diff --git a/src/gpu/GrAAHairLinePathRenderer.h b/src/gpu/GrAAHairLinePathRenderer.h index 33b73320aa..6dd9ea9f98 100644 --- a/src/gpu/GrAAHairLinePathRenderer.h +++ b/src/gpu/GrAAHairLinePathRenderer.h @@ -40,7 +40,8 @@ private: GrDrawTarget* target, GrDrawState::StageMask stageMask, int* lineCnt, - int* quadCnt); + int* quadCnt, + GrDrawTarget::AutoReleaseGeometry* arg); const GrIndexBuffer* fLinesIndexBuffer; const GrIndexBuffer* fQuadsIndexBuffer; diff --git a/src/gpu/GrDefaultPathRenderer.cpp b/src/gpu/GrDefaultPathRenderer.cpp index 72b3c60c2a..7130bb5e27 100644 --- a/src/gpu/GrDefaultPathRenderer.cpp +++ b/src/gpu/GrDefaultPathRenderer.cpp @@ -189,7 +189,8 @@ bool GrDefaultPathRenderer::createGeom(const SkPath& path, GrDrawState::StageMask stageMask, GrPrimitiveType* primType, int* vertexCnt, - int* indexCnt) { + int* indexCnt, + GrDrawTarget::AutoReleaseGeometry* arg) { { SK_TRACE_EVENT0("GrDefaultPathRenderer::createGeom"); @@ -232,24 +233,18 @@ bool GrDefaultPathRenderer::createGeom(const SkPath& path, } } - GrPoint* base; - if (!target->reserveVertexSpace(layout, maxPts, (void**)&base)) { + + if (!arg->set(target, layout, maxPts, maxIdxs)) { return false; } - GrAssert(NULL != base); - GrPoint* vert = base; - uint16_t* idxBase = NULL; - uint16_t* idx = NULL; + uint16_t* idxBase = reinterpret_cast(arg->indices());; + uint16_t* idx = idxBase; uint16_t subpathIdxStart = 0; - if (indexed) { - if (!target->reserveIndexSpace(maxIdxs, (void**)&idxBase)) { - target->resetVertexSource(); - return false; - } - GrAssert(NULL != idxBase); - idx = idxBase; - } + + GrPoint* base = reinterpret_cast(arg->vertices()); + GrAssert(NULL != base); + GrPoint* vert = base; GrPoint pts[4]; @@ -350,6 +345,7 @@ bool GrDefaultPathRenderer::internalDrawPath(const SkPath& path, int vertexCnt; int indexCnt; GrPrimitiveType primType; + GrDrawTarget::AutoReleaseGeometry arg; if (!this->createGeom(path, fill, translate, @@ -358,7 +354,8 @@ bool GrDefaultPathRenderer::internalDrawPath(const SkPath& path, stageMask, &primType, &vertexCnt, - &indexCnt)) { + &indexCnt, + &arg)) { return false; } diff --git a/src/gpu/GrDefaultPathRenderer.h b/src/gpu/GrDefaultPathRenderer.h index a6a4cda84d..d5b973892a 100644 --- a/src/gpu/GrDefaultPathRenderer.h +++ b/src/gpu/GrDefaultPathRenderer.h @@ -58,7 +58,8 @@ private: GrDrawState::StageMask stages, GrPrimitiveType* primType, int* vertexCnt, - int* indexCnt); + int* indexCnt, + GrDrawTarget::AutoReleaseGeometry* arg); bool fSeparateStencil; bool fStencilWrapOps; -- cgit v1.2.3