diff options
author | jvanverth <jvanverth@google.com> | 2014-07-25 11:31:13 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2014-07-25 11:31:13 -0700 |
commit | 1d38619389cc1100bd516b9acbf17b7bd42d33ce (patch) | |
tree | fa1cd72b4110e714d3ed9dac53f8e5ce9ce34c9d /src | |
parent | 50d715476b1d3a00fb43c13e34a80ea0a01d32bf (diff) |
Move vertex buffer setup out of drawPackedGlyph().
This gets a very welcome ~10% speedup on my Mac.
R=bsalomon@google.com
Author: jvanverth@google.com
Review URL: https://codereview.chromium.org/414573002
Diffstat (limited to 'src')
-rwxr-xr-x | src/gpu/GrBitmapTextContext.cpp | 106 | ||||
-rw-r--r-- | src/gpu/GrBitmapTextContext.h | 1 | ||||
-rwxr-xr-x | src/gpu/GrDistanceFieldTextContext.cpp | 96 | ||||
-rw-r--r-- | src/gpu/GrDistanceFieldTextContext.h | 3 |
4 files changed, 99 insertions, 107 deletions
diff --git a/src/gpu/GrBitmapTextContext.cpp b/src/gpu/GrBitmapTextContext.cpp index 3ca98e46eb..fe3fa31c19 100755 --- a/src/gpu/GrBitmapTextContext.cpp +++ b/src/gpu/GrBitmapTextContext.cpp @@ -59,7 +59,6 @@ GrBitmapTextContext::GrBitmapTextContext(GrContext* context, fEffectTextureUniqueID = SK_InvalidUniqueID; fVertices = NULL; - fMaxVertices = 0; fVertexBounds.setLargestInverted(); } @@ -154,7 +153,6 @@ void GrBitmapTextContext::flushGlyphs() { fDrawTarget->resetVertexSource(); fVertices = NULL; - fMaxVertices = 0; fCurrVertex = 0; fVertexBounds.setLargestInverted(); SkSafeSetNull(fCurrTexture); @@ -170,7 +168,6 @@ inline void GrBitmapTextContext::init(const GrPaint& paint, const SkPaint& skPai fCurrVertex = 0; fVertices = NULL; - fMaxVertices = 0; } inline void GrBitmapTextContext::finish() { @@ -191,11 +188,18 @@ void GrBitmapTextContext::drawText(const GrPaint& paint, const SkPaint& skPaint, this->init(paint, skPaint); + if (NULL == fDrawTarget) { + return; + } + SkDrawCacheProc glyphCacheProc = fSkPaint.getDrawCacheProc(); SkAutoGlyphCache autoCache(fSkPaint, &fDeviceProperties, &fContext->getMatrix()); SkGlyphCache* cache = autoCache.getCache(); GrFontScaler* fontScaler = GetGrFontScaler(cache); + if (NULL == fStrike) { + fStrike = fContext->getFontCache()->getStrike(fontScaler, false); + } // transform our starting point { @@ -224,6 +228,23 @@ void GrBitmapTextContext::drawText(const GrPaint& paint, const SkPaint& skPaint, const char* stop = text + byteLength; + // allocate vertices + SkASSERT(NULL == fVertices); + bool useColorVerts = kA8_GrMaskFormat == fStrike->getMaskFormat(); + if (useColorVerts) { + fDrawTarget->drawState()->setVertexAttribs<gTextVertexWithColorAttribs>( + SK_ARRAY_COUNT(gTextVertexWithColorAttribs)); + } else { + fDrawTarget->drawState()->setVertexAttribs<gTextVertexAttribs>( + SK_ARRAY_COUNT(gTextVertexAttribs)); + } + int numGlyphs = fSkPaint.textToGlyphs(text, byteLength, NULL); + bool success = fDrawTarget->reserveVertexAndIndexSpace(4*numGlyphs, + 0, + &fVertices, + NULL); + GrAlwaysAssert(success); + SkAutoKern autokern; SkFixed fxMask = ~0; @@ -284,17 +305,42 @@ void GrBitmapTextContext::drawPosText(const GrPaint& paint, const SkPaint& skPai this->init(paint, skPaint); + if (NULL == fDrawTarget) { + return; + } + SkDrawCacheProc glyphCacheProc = fSkPaint.getDrawCacheProc(); SkAutoGlyphCache autoCache(fSkPaint, &fDeviceProperties, &fContext->getMatrix()); SkGlyphCache* cache = autoCache.getCache(); GrFontScaler* fontScaler = GetGrFontScaler(cache); + + if (NULL == fStrike) { + fStrike = fContext->getFontCache()->getStrike(fontScaler, false); + } // store original matrix before we reset, so we can use it to transform positions SkMatrix ctm = fContext->getMatrix(); GrContext::AutoMatrix autoMatrix; autoMatrix.setIdentity(fContext, &fPaint); + // allocate vertices + SkASSERT(NULL == fVertices); + bool useColorVerts = kA8_GrMaskFormat == fStrike->getMaskFormat(); + if (useColorVerts) { + fDrawTarget->drawState()->setVertexAttribs<gTextVertexWithColorAttribs>( + SK_ARRAY_COUNT(gTextVertexWithColorAttribs)); + } else { + fDrawTarget->drawState()->setVertexAttribs<gTextVertexAttribs>( + SK_ARRAY_COUNT(gTextVertexAttribs)); + } + int numGlyphs = fSkPaint.textToGlyphs(text, byteLength, NULL); + bool success = fDrawTarget->reserveVertexAndIndexSpace(4*numGlyphs, + 0, + &fVertices, + NULL); + GrAlwaysAssert(success); + const char* stop = text + byteLength; SkTextAlignProc alignProc(fSkPaint.getTextAlign()); SkTextMapStateProc tmsProc(ctm, constY, scalarsPerPosition); @@ -426,14 +472,6 @@ void GrBitmapTextContext::drawPosText(const GrPaint& paint, const SkPaint& skPai void GrBitmapTextContext::drawPackedGlyph(GrGlyph::PackedID packed, SkFixed vx, SkFixed vy, GrFontScaler* scaler) { - if (NULL == fDrawTarget) { - return; - } - - if (NULL == fStrike) { - fStrike = fContext->getFontCache()->getStrike(scaler, false); - } - GrGlyph* glyph = fStrike->getGlyph(packed, scaler); if (NULL == glyph || glyph->fBounds.isEmpty()) { return; @@ -516,55 +554,12 @@ HAS_ATLAS: GrTexture* texture = glyph->fPlot->texture(); SkASSERT(texture); - if (fCurrTexture != texture || fCurrVertex + 4 > fMaxVertices) { + if (fCurrTexture != texture) { this->flushGlyphs(); fCurrTexture = texture; fCurrTexture->ref(); } - bool useColorVerts = kA8_GrMaskFormat == fStrike->getMaskFormat(); - - if (NULL == fVertices) { - // If we need to reserve vertices allow the draw target to suggest - // a number of verts to reserve and whether to perform a flush. - fMaxVertices = kMinRequestedVerts; - if (useColorVerts) { - fDrawTarget->drawState()->setVertexAttribs<gTextVertexWithColorAttribs>( - SK_ARRAY_COUNT(gTextVertexWithColorAttribs)); - } else { - fDrawTarget->drawState()->setVertexAttribs<gTextVertexAttribs>( - SK_ARRAY_COUNT(gTextVertexAttribs)); - } - bool flush = fDrawTarget->geometryHints(&fMaxVertices, NULL); - if (flush) { - this->flushGlyphs(); - fContext->flush(); - if (useColorVerts) { - fDrawTarget->drawState()->setVertexAttribs<gTextVertexWithColorAttribs>( - SK_ARRAY_COUNT(gTextVertexWithColorAttribs)); - } else { - fDrawTarget->drawState()->setVertexAttribs<gTextVertexAttribs>( - SK_ARRAY_COUNT(gTextVertexAttribs)); - } - } - fMaxVertices = kDefaultRequestedVerts; - // ignore return, no point in flushing again. - fDrawTarget->geometryHints(&fMaxVertices, NULL); - - int maxQuadVertices = 4 * fContext->getQuadIndexBuffer()->maxQuads(); - if (fMaxVertices < kMinRequestedVerts) { - fMaxVertices = kDefaultRequestedVerts; - } else if (fMaxVertices > maxQuadVertices) { - // don't exceed the limit of the index buffer - fMaxVertices = maxQuadVertices; - } - bool success = fDrawTarget->reserveVertexAndIndexSpace(fMaxVertices, - 0, - &fVertices, - NULL); - GrAlwaysAssert(success); - } - SkFixed tx = SkIntToFixed(glyph->fAtlasLocation.fX); SkFixed ty = SkIntToFixed(glyph->fAtlasLocation.fY); @@ -576,6 +571,7 @@ HAS_ATLAS: fVertexBounds.growToInclude(r); + bool useColorVerts = kA8_GrMaskFormat == fStrike->getMaskFormat(); size_t vertSize = useColorVerts ? (2 * sizeof(SkPoint) + sizeof(GrColor)) : (2 * sizeof(SkPoint)); diff --git a/src/gpu/GrBitmapTextContext.h b/src/gpu/GrBitmapTextContext.h index 6d4ea6d524..da7b5ca625 100644 --- a/src/gpu/GrBitmapTextContext.h +++ b/src/gpu/GrBitmapTextContext.h @@ -45,7 +45,6 @@ private: }; void* fVertices; - int32_t fMaxVertices; GrTexture* fCurrTexture; SkAutoTUnref<GrEffect> fCachedEffect; // Used to check whether fCachedEffect is still valid. diff --git a/src/gpu/GrDistanceFieldTextContext.cpp b/src/gpu/GrDistanceFieldTextContext.cpp index fe6e50fbde..f7d4f6f656 100755 --- a/src/gpu/GrDistanceFieldTextContext.cpp +++ b/src/gpu/GrDistanceFieldTextContext.cpp @@ -52,7 +52,6 @@ GrDistanceFieldTextContext::GrDistanceFieldTextContext(GrContext* context, fCurrVertex = 0; fVertices = NULL; - fMaxVertices = 0; } GrDistanceFieldTextContext::~GrDistanceFieldTextContext() { @@ -178,7 +177,6 @@ void GrDistanceFieldTextContext::flushGlyphs() { 4, 6); fDrawTarget->resetVertexSource(); fVertices = NULL; - fMaxVertices = 0; fCurrVertex = 0; SkSafeSetNull(fCurrTexture); } @@ -197,13 +195,6 @@ extern const GrVertexAttrib gTextVertexAttribs[] = { void GrDistanceFieldTextContext::drawPackedGlyph(GrGlyph::PackedID packed, SkFixed vx, SkFixed vy, GrFontScaler* scaler) { - if (NULL == fDrawTarget) { - return; - } - if (NULL == fStrike) { - fStrike = fContext->getFontCache()->getStrike(scaler, true); - } - GrGlyph* glyph = fStrike->getGlyph(packed, scaler); if (NULL == glyph || glyph->fBounds.isEmpty()) { return; @@ -286,44 +277,12 @@ HAS_ATLAS: GrTexture* texture = glyph->fPlot->texture(); SkASSERT(texture); - if (fCurrTexture != texture || fCurrVertex + 4 > fMaxVertices) { + if (fCurrTexture != texture) { this->flushGlyphs(); fCurrTexture = texture; fCurrTexture->ref(); } - if (NULL == fVertices) { - // If we need to reserve vertices allow the draw target to suggest - // a number of verts to reserve and whether to perform a flush. - fMaxVertices = kMinRequestedVerts; - fDrawTarget->drawState()->setVertexAttribs<gTextVertexAttribs>( - SK_ARRAY_COUNT(gTextVertexAttribs)); - bool flush = fDrawTarget->geometryHints(&fMaxVertices, NULL); - if (flush) { - this->flushGlyphs(); - fContext->flush(); - fDrawTarget->drawState()->setVertexAttribs<gTextVertexAttribs>( - SK_ARRAY_COUNT(gTextVertexAttribs)); - } - fMaxVertices = kDefaultRequestedVerts; - // ignore return, no point in flushing again. - fDrawTarget->geometryHints(&fMaxVertices, NULL); - - int maxQuadVertices = 4 * fContext->getQuadIndexBuffer()->maxQuads(); - if (fMaxVertices < kMinRequestedVerts) { - fMaxVertices = kDefaultRequestedVerts; - } else if (fMaxVertices > maxQuadVertices) { - // don't exceed the limit of the index buffer - fMaxVertices = maxQuadVertices; - } - bool success = fDrawTarget->reserveVertexAndIndexSpace(fMaxVertices, - 0, - GrTCast<void**>(&fVertices), - NULL); - GrAlwaysAssert(success); - SkASSERT(2*sizeof(SkPoint) == fDrawTarget->getDrawState().getVertexSize()); - } - SkScalar dx = SkIntToScalar(glyph->fBounds.fLeft + SK_DistanceFieldInset); SkScalar dy = SkIntToScalar(glyph->fBounds.fTop + SK_DistanceFieldInset); SkScalar width = SkIntToScalar(glyph->fBounds.width() - 2*SK_DistanceFieldInset); @@ -343,12 +302,16 @@ HAS_ATLAS: SkFixed th = SkIntToFixed(glyph->fBounds.height() - 2*SK_DistanceFieldInset); static const size_t kVertexSize = 2 * sizeof(SkPoint); - fVertices[2*fCurrVertex].setRectFan(sx, - sy, - sx + width, - sy + height, - kVertexSize); - fVertices[2*fCurrVertex+1].setRectFan(SkFixedToFloat(texture->normalizeFixedX(tx)), + SkPoint* positions = reinterpret_cast<SkPoint*>( + reinterpret_cast<intptr_t>(fVertices) + kVertexSize * fCurrVertex); + positions->setRectFan(sx, + sy, + sx + width, + sy + height, + kVertexSize); + SkPoint* textureCoords = reinterpret_cast<SkPoint*>( + reinterpret_cast<intptr_t>(positions) + kVertexSize - sizeof(SkPoint)); + textureCoords->setRectFan(SkFixedToFloat(texture->normalizeFixedX(tx)), SkFixedToFloat(texture->normalizeFixedY(ty)), SkFixedToFloat(texture->normalizeFixedX(tx + tw)), SkFixedToFloat(texture->normalizeFixedY(ty + th)), @@ -365,7 +328,6 @@ inline void GrDistanceFieldTextContext::init(const GrPaint& paint, const SkPaint fCurrVertex = 0; fVertices = NULL; - fMaxVertices = 0; if (fSkPaint.getTextSize() <= kSmallDFFontLimit) { fTextRatio = fSkPaint.getTextSize()/kSmallDFFontSize; @@ -446,6 +408,10 @@ void GrDistanceFieldTextContext::drawText(const GrPaint& paint, const SkPaint& s this->init(paint, skPaint); + if (NULL == fDrawTarget) { + return; + } + SkScalar sizeRatio = fTextRatio; SkDrawCacheProc glyphCacheProc = fSkPaint.getDrawCacheProc(); @@ -453,9 +419,23 @@ void GrDistanceFieldTextContext::drawText(const GrPaint& paint, const SkPaint& s SkAutoGlyphCacheNoGamma autoCache(fSkPaint, &fDeviceProperties, NULL); SkGlyphCache* cache = autoCache.getCache(); GrFontScaler* fontScaler = GetGrFontScaler(cache); + if (NULL == fStrike) { + fStrike = fContext->getFontCache()->getStrike(fontScaler, true); + } setup_gamma_texture(fContext, cache, fDeviceProperties, &fGammaTexture); + // allocate vertices + SkASSERT(NULL == fVertices); + fDrawTarget->drawState()->setVertexAttribs<gTextVertexAttribs>( + SK_ARRAY_COUNT(gTextVertexAttribs)); + int numGlyphs = fSkPaint.textToGlyphs(text, byteLength, NULL); + bool success = fDrawTarget->reserveVertexAndIndexSpace(4*numGlyphs, + 0, + &fVertices, + NULL); + GrAlwaysAssert(success); + // need to measure first // TODO - generate positions and pre-load cache as well? const char* stop = text + byteLength; @@ -523,11 +503,29 @@ void GrDistanceFieldTextContext::drawPosText(const GrPaint& paint, const SkPaint this->init(paint, skPaint); + if (NULL == fDrawTarget) { + return; + } + SkDrawCacheProc glyphCacheProc = fSkPaint.getDrawCacheProc(); SkAutoGlyphCacheNoGamma autoCache(fSkPaint, &fDeviceProperties, NULL); SkGlyphCache* cache = autoCache.getCache(); GrFontScaler* fontScaler = GetGrFontScaler(cache); + if (NULL == fStrike) { + fStrike = fContext->getFontCache()->getStrike(fontScaler, true); + } + + // allocate vertices + SkASSERT(NULL == fVertices); + fDrawTarget->drawState()->setVertexAttribs<gTextVertexAttribs>( + SK_ARRAY_COUNT(gTextVertexAttribs)); + int numGlyphs = fSkPaint.textToGlyphs(text, byteLength, NULL); + bool success = fDrawTarget->reserveVertexAndIndexSpace(4*numGlyphs, + 0, + &fVertices, + NULL); + GrAlwaysAssert(success); setup_gamma_texture(fContext, cache, fDeviceProperties, &fGammaTexture); diff --git a/src/gpu/GrDistanceFieldTextContext.h b/src/gpu/GrDistanceFieldTextContext.h index 3a602f050b..77e56c62e6 100644 --- a/src/gpu/GrDistanceFieldTextContext.h +++ b/src/gpu/GrDistanceFieldTextContext.h @@ -48,8 +48,7 @@ private: kDefaultRequestedVerts = kDefaultRequestedGlyphs * 4, }; - SkPoint* fVertices; - int32_t fMaxVertices; + void* fVertices; GrTexture* fCurrTexture; int fCurrVertex; }; |