Index: src/gpu/GrAARectRenderer.cpp |
diff --git a/src/gpu/GrAARectRenderer.cpp b/src/gpu/GrAARectRenderer.cpp |
index 267d970c625cf6d600f72058c4008c26d70a2640..d1c377aa532757ec1b392064026cca09787a067a 100644 |
--- a/src/gpu/GrAARectRenderer.cpp |
+++ b/src/gpu/GrAARectRenderer.cpp |
@@ -112,17 +112,22 @@ |
init.fUsesLocalCoords = this->usesLocalCoords(); |
gp->initBatchTracker(batchTarget->currentBatchTracker(), init); |
+ SkAutoTUnref<const GrIndexBuffer> indexBuffer(this->getIndexBuffer( |
+ batchTarget->resourceProvider())); |
+ |
size_t vertexStride = gp->getVertexStride(); |
SkASSERT(canTweakAlphaForCoverage ? |
vertexStride == sizeof(GrDefaultGeoProcFactory::PositionColorAttr) : |
vertexStride == sizeof(GrDefaultGeoProcFactory::PositionColorCoverageAttr)); |
int instanceCount = fGeoData.count(); |
- |
- SkAutoTUnref<const GrIndexBuffer> indexBuffer(this->getIndexBuffer( |
- batchTarget->resourceProvider())); |
- InstancedHelper helper; |
- void* vertices = helper.init(batchTarget, vertexStride, indexBuffer, kVertsPerAAFillRect, |
- kIndicesPerAAFillRect, instanceCount); |
+ int vertexCount = kVertsPerAAFillRect * instanceCount; |
+ const GrVertexBuffer* vertexBuffer; |
+ int firstVertex; |
+ void* vertices = batchTarget->vertexPool()->makeSpace(vertexStride, |
+ vertexCount, |
+ &vertexBuffer, |
+ &firstVertex); |
+ |
if (!vertices || !indexBuffer) { |
SkDebugf("Could not allocate vertices\n"); |
return; |
@@ -140,7 +145,28 @@ |
canTweakAlphaForCoverage); |
} |
- helper.issueDraws(batchTarget); |
+ GrDrawTarget::DrawInfo drawInfo; |
+ drawInfo.setPrimitiveType(kTriangles_GrPrimitiveType); |
+ drawInfo.setStartVertex(0); |
+ drawInfo.setStartIndex(0); |
+ drawInfo.setVerticesPerInstance(kVertsPerAAFillRect); |
+ drawInfo.setIndicesPerInstance(kIndicesPerAAFillRect); |
+ drawInfo.adjustStartVertex(firstVertex); |
+ drawInfo.setVertexBuffer(vertexBuffer); |
+ drawInfo.setIndexBuffer(indexBuffer); |
+ |
+ int maxInstancesPerDraw = kNumAAFillRectsInIndexBuffer; |
+ |
+ while (instanceCount) { |
+ drawInfo.setInstanceCount(SkTMin(instanceCount, maxInstancesPerDraw)); |
+ drawInfo.setVertexCount(drawInfo.instanceCount() * drawInfo.verticesPerInstance()); |
+ drawInfo.setIndexCount(drawInfo.instanceCount() * drawInfo.indicesPerInstance()); |
+ |
+ batchTarget->draw(drawInfo); |
+ |
+ drawInfo.setStartVertex(drawInfo.startVertex() + drawInfo.vertexCount()); |
+ instanceCount -= drawInfo.instanceCount(); |
+ } |
} |
SkSTArray<1, Geometry, true>* geoData() { return &fGeoData; } |
@@ -459,6 +485,9 @@ |
batchTarget->initDraw(gp, pipeline); |
+ const SkAutoTUnref<const GrIndexBuffer> indexBuffer( |
+ GetIndexBuffer(batchTarget->resourceProvider(), this->miterStroke())); |
+ |
// TODO this is hacky, but the only way we have to initialize the GP is to use the |
// GrPipelineInfo struct so we can generate the correct shader. Once we have GrBatch |
// everywhere we can remove this nastiness |
@@ -476,24 +505,28 @@ |
vertexStride == sizeof(GrDefaultGeoProcFactory::PositionColorCoverageAttr)); |
int innerVertexNum = 4; |
int outerVertexNum = this->miterStroke() ? 4 : 8; |
- int verticesPerInstance = (outerVertexNum + innerVertexNum) * 2; |
- int indicesPerInstance = this->miterStroke() ? kMiterIndexCnt : kBevelIndexCnt; |
+ int totalVertexNum = (outerVertexNum + innerVertexNum) * 2; |
+ |
int instanceCount = fGeoData.count(); |
- |
- const SkAutoTUnref<const GrIndexBuffer> indexBuffer( |
- GetIndexBuffer(batchTarget->resourceProvider(), this->miterStroke())); |
- InstancedHelper helper; |
- void* vertices = helper.init(batchTarget, vertexStride, indexBuffer, verticesPerInstance, |
- indicesPerInstance, instanceCount); |
+ int vertexCount = totalVertexNum * instanceCount; |
+ |
+ const GrVertexBuffer* vertexBuffer; |
+ int firstVertex; |
+ |
+ void* vertices = batchTarget->vertexPool()->makeSpace(vertexStride, |
+ vertexCount, |
+ &vertexBuffer, |
+ &firstVertex); |
+ |
if (!vertices || !indexBuffer) { |
- SkDebugf("Could not allocate vertices\n"); |
- return; |
- } |
+ SkDebugf("Could not allocate vertices\n"); |
+ return; |
+ } |
for (int i = 0; i < instanceCount; i++) { |
const Geometry& args = fGeoData[i]; |
this->generateAAStrokeRectGeometry(vertices, |
- i * verticesPerInstance * vertexStride, |
+ i * totalVertexNum * vertexStride, |
vertexStride, |
outerVertexNum, |
innerVertexNum, |
@@ -504,7 +537,30 @@ |
args.fMiterStroke, |
canTweakAlphaForCoverage); |
} |
- helper.issueDraws(batchTarget); |
+ int indicesPerInstance = this->miterStroke() ? kMiterIndexCnt : kBevelIndexCnt; |
+ GrDrawTarget::DrawInfo drawInfo; |
+ drawInfo.setPrimitiveType(kTriangles_GrPrimitiveType); |
+ drawInfo.setStartVertex(0); |
+ drawInfo.setStartIndex(0); |
+ drawInfo.setVerticesPerInstance(totalVertexNum); |
+ drawInfo.setIndicesPerInstance(indicesPerInstance); |
+ drawInfo.adjustStartVertex(firstVertex); |
+ drawInfo.setVertexBuffer(vertexBuffer); |
+ drawInfo.setIndexBuffer(indexBuffer); |
+ |
+ int maxInstancesPerDraw = this->miterStroke() ? kNumMiterRectsInIndexBuffer : |
+ kNumBevelRectsInIndexBuffer; |
+ |
+ while (instanceCount) { |
+ drawInfo.setInstanceCount(SkTMin(instanceCount, maxInstancesPerDraw)); |
+ drawInfo.setVertexCount(drawInfo.instanceCount() * drawInfo.verticesPerInstance()); |
+ drawInfo.setIndexCount(drawInfo.instanceCount() * drawInfo.indicesPerInstance()); |
+ |
+ batchTarget->draw(drawInfo); |
+ |
+ drawInfo.setStartVertex(drawInfo.startVertex() + drawInfo.vertexCount()); |
+ instanceCount -= drawInfo.instanceCount(); |
+ } |
} |
SkSTArray<1, Geometry, true>* geoData() { return &fGeoData; } |