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

Unified Diff: src/gpu/GrAtlasTextContext.cpp

Issue 1122673002: Start on simplifying generateGeometry() overrides (Closed) Base URL: https://skia.googlesource.com/skia.git@ibcache
Patch Set: whitespace, remove debug return Created 5 years, 8 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/GrAARectRenderer.cpp ('k') | src/gpu/GrBatch.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/gpu/GrAtlasTextContext.cpp
diff --git a/src/gpu/GrAtlasTextContext.cpp b/src/gpu/GrAtlasTextContext.cpp
index 33e4f7ed86237dba488e395e25978f81e3e8e6ca..c8688b0adc4ce532ff353dc524e85a07da346a5f 100644
--- a/src/gpu/GrAtlasTextContext.cpp
+++ b/src/gpu/GrAtlasTextContext.cpp
@@ -1474,6 +1474,13 @@ public:
fBatch.fCoverageIgnored = init.fCoverageIgnored;
}
+ struct FlushInfo {
+ SkAutoTUnref<const GrVertexBuffer> fVertexBuffer;
+ SkAutoTUnref<const GrIndexBuffer> fIndexBuffer;
+ int fGlyphsToFlush;
+ int fVertexOffset;
+ };
+
void generateGeometry(GrBatchTarget* batchTarget, const GrPipeline* pipeline) override {
// if we have RGB, then we won't have any SkShaders so no need to use a localmatrix.
// TODO actually only invert if we don't have RGBA
@@ -1506,6 +1513,8 @@ public:
localMatrix));
}
+ FlushInfo flushInfo;
+ flushInfo.fGlyphsToFlush = 0;
size_t vertexStride = gp->getVertexStride();
SkASSERT(vertexStride == (fUseDistanceFields ?
get_vertex_stride_df(fMaskFormat, fUseLCDText) :
@@ -1515,35 +1524,21 @@ public:
int glyphCount = this->numGlyphs();
int instanceCount = fInstanceCount;
- SkAutoTUnref<const GrIndexBuffer> indexBuffer(
- batchTarget->resourceProvider()->refQuadIndexBuffer());
-
const GrVertexBuffer* vertexBuffer;
- int firstVertex;
+
void* vertices = batchTarget->vertexPool()->makeSpace(vertexStride,
glyphCount * kVerticesPerGlyph,
&vertexBuffer,
- &firstVertex);
- if (!vertices || !indexBuffer) {
+ &flushInfo.fVertexOffset);
+ flushInfo.fVertexBuffer.reset(SkRef(vertexBuffer));
+ flushInfo.fIndexBuffer.reset(batchTarget->resourceProvider()->refQuadIndexBuffer());
+ if (!vertices || !flushInfo.fVertexBuffer) {
SkDebugf("Could not allocate vertices\n");
return;
}
unsigned char* currVertex = reinterpret_cast<unsigned char*>(vertices);
- // setup drawinfo
- int maxInstancesPerDraw = indexBuffer->maxQuads();
-
- GrDrawTarget::DrawInfo drawInfo;
- drawInfo.setPrimitiveType(kTriangles_GrPrimitiveType);
- drawInfo.setStartVertex(0);
- drawInfo.setStartIndex(0);
- drawInfo.setVerticesPerInstance(kVerticesPerGlyph);
- drawInfo.setIndicesPerInstance(kIndicesPerGlyph);
- drawInfo.adjustStartVertex(firstVertex);
- drawInfo.setVertexBuffer(vertexBuffer);
- drawInfo.setIndexBuffer(indexBuffer);
-
// We cache some values to avoid going to the glyphcache for the same fontScaler twice
// in a row
const SkDescriptor* desc = NULL;
@@ -1551,7 +1546,6 @@ public:
GrFontScaler* scaler = NULL;
SkTypeface* typeface = NULL;
- int instancesToFlush = 0;
for (int i = 0; i < instanceCount; i++) {
Geometry& args = fGeoData[i];
Blob* blob = args.fBlob;
@@ -1635,10 +1629,8 @@ public:
if (!fFontCache->hasGlyph(glyph) &&
!strike->addGlyphToAtlas(batchTarget, glyph, scaler)) {
- this->flush(batchTarget, &drawInfo, instancesToFlush,
- maxInstancesPerDraw);
+ this->flush(batchTarget, &flushInfo);
this->initDraw(batchTarget, gp, pipeline);
- instancesToFlush = 0;
brokenRun = glyphIdx > 0;
SkDEBUGCODE(bool success =) strike->addGlyphToAtlas(batchTarget,
@@ -1674,7 +1666,7 @@ public:
SkScalar transY = args.fTransY;
this->regeneratePositions(vertex, vertexStride, transX, transY);
}
- instancesToFlush++;
+ flushInfo.fGlyphsToFlush++;
}
// We my have changed the color so update it here
@@ -1687,7 +1679,7 @@ public:
fFontCache->atlasGeneration(fMaskFormat);
}
} else {
- instancesToFlush += glyphCount;
+ flushInfo.fGlyphsToFlush += glyphCount;
// set use tokens for all of the glyphs in our subrun. This is only valid if we
// have a valid atlas generation
@@ -1706,7 +1698,7 @@ public:
if (cache) {
SkGlyphCache::AttachCache(cache);
}
- this->flush(batchTarget, &drawInfo, instancesToFlush, maxInstancesPerDraw);
+ this->flush(batchTarget, &flushInfo);
}
// The minimum number of Geometry we will try to allocate.
@@ -1833,20 +1825,19 @@ private:
gp->initBatchTracker(batchTarget->currentBatchTracker(), init);
}
- void flush(GrBatchTarget* batchTarget,
- GrDrawTarget::DrawInfo* drawInfo,
- int instanceCount,
- int maxInstancesPerDraw) {
- 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();
- }
+ void flush(GrBatchTarget* batchTarget, FlushInfo* flushInfo) {
+ GrDrawTarget::DrawInfo drawInfo;
+ int glyphsToFlush = flushInfo->fGlyphsToFlush;
+ int maxGlyphsPerDraw = flushInfo->fIndexBuffer->maxQuads();
+ drawInfo.initInstanced(kTriangles_GrPrimitiveType, flushInfo->fVertexBuffer,
+ flushInfo->fIndexBuffer, flushInfo->fVertexOffset,
+ kVerticesPerGlyph, kIndicesPerGlyph, &glyphsToFlush,
+ maxGlyphsPerDraw);
+ do {
+ batchTarget->draw(drawInfo);
+ } while (drawInfo.nextInstances(&glyphsToFlush, maxGlyphsPerDraw));
+ flushInfo->fVertexOffset += kVerticesPerGlyph * flushInfo->fGlyphsToFlush;
+ flushInfo->fGlyphsToFlush = 0;
}
GrColor color() const { return fBatch.fColor; }
« no previous file with comments | « src/gpu/GrAARectRenderer.cpp ('k') | src/gpu/GrBatch.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698