diff options
| -rw-r--r-- | libs/hwui/FontRenderer.cpp | 29 | ||||
| -rw-r--r-- | libs/hwui/FontRenderer.h | 30 | ||||
| -rw-r--r-- | libs/hwui/Properties.h | 2 | ||||
| -rw-r--r-- | libs/hwui/font/FontUtil.h | 2 |
4 files changed, 44 insertions, 19 deletions
diff --git a/libs/hwui/FontRenderer.cpp b/libs/hwui/FontRenderer.cpp index f0dcb30db549..0c70e272d0a5 100644 --- a/libs/hwui/FontRenderer.cpp +++ b/libs/hwui/FontRenderer.cpp @@ -378,9 +378,9 @@ void FontRenderer::checkInit() { void FontRenderer::updateDrawParams() { if (mCurrentQuadIndex != mLastQuadIndex) { - mDrawOffsets.add((uint16_t*)(mLastQuadIndex * sizeof(uint16_t) * 6)); - mDrawCounts.add(mCurrentQuadIndex - mLastQuadIndex); - mDrawCacheTextures.add(mCurrentCacheTexture); + uint16_t* offset = (uint16_t*)(mLastQuadIndex * sizeof(uint16_t) * 6); + uint32_t count = mCurrentQuadIndex - mLastQuadIndex; + mDrawBatch.add(TextBatch(offset, count, mCurrentCacheTexture)); mLastQuadIndex = mCurrentQuadIndex; } } @@ -438,26 +438,27 @@ void FontRenderer::issueDrawCommand() { caches.bindTexCoordsVertexPointer(force, buffer + offset); } - for (uint32_t i = 0; i < mDrawOffsets.size(); i++) { - uint16_t* offset = mDrawOffsets[i]; - uint32_t count = mDrawCounts[i]; - CacheTexture* texture = mDrawCacheTextures[i]; + caches.activeTexture(0); + GLuint lastId = 0; - caches.activeTexture(0); - glBindTexture(GL_TEXTURE_2D, texture->getTextureId()); + for (uint32_t i = 0; i < mDrawBatch.size(); i++) { + const TextBatch& batch = mDrawBatch[i]; - texture->setLinearFiltering(mLinearFiltering, false); + GLuint id = batch.texture->getTextureId(); + if (id != lastId) { + glBindTexture(GL_TEXTURE_2D, id); + batch.texture->setLinearFiltering(mLinearFiltering, false); + lastId = id; + } - glDrawElements(GL_TRIANGLES, count * 6, GL_UNSIGNED_SHORT, offset); + glDrawElements(GL_TRIANGLES, batch.count * 6, GL_UNSIGNED_SHORT, batch.offset); } mDrawn = true; mCurrentQuadIndex = 0; mLastQuadIndex = 0; - mDrawOffsets.clear(); - mDrawCounts.clear(); - mDrawCacheTextures.clear(); + mDrawBatch.clear(); } void FontRenderer::appendMeshQuadNoClip(float x1, float y1, float u1, float v1, diff --git a/libs/hwui/FontRenderer.h b/libs/hwui/FontRenderer.h index d0c44ef5b982..442f4e2714a2 100644 --- a/libs/hwui/FontRenderer.h +++ b/libs/hwui/FontRenderer.h @@ -28,6 +28,7 @@ #include "font/CacheTexture.h" #include "font/CachedGlyphInfo.h" #include "font/Font.h" +#include "utils/SortedList.h" #include "Matrix.h" #include "Properties.h" @@ -180,9 +181,32 @@ private: bool mLinearFiltering; - Vector<uint16_t*> mDrawOffsets; - Vector<uint32_t> mDrawCounts; - Vector<CacheTexture*> mDrawCacheTextures; + struct TextBatch { + TextBatch(): offset(NULL), count(0), texture(NULL) { + } + + TextBatch(uint16_t* offset, uint32_t count, CacheTexture* texture): + offset(offset), count(count), texture(texture) { + } + + static int compare(const TextBatch& lhs, const TextBatch& rhs) { + return lhs.texture->getTextureId() - rhs.texture->getTextureId(); + } + + friend inline int strictly_order_type(const TextBatch& lhs, const TextBatch& rhs) { + return compare(lhs, rhs) < 0; + } + + friend inline int compare_type(const TextBatch& lhs, const TextBatch& rhs) { + return compare(lhs, rhs); + } + + uint16_t* offset; + uint32_t count; + CacheTexture* texture; + }; + + SortedList<TextBatch> mDrawBatch; // RS constructs sp<RSC::RS> mRs; diff --git a/libs/hwui/Properties.h b/libs/hwui/Properties.h index 5f39abfebdf3..e4b4f3c4fb8d 100644 --- a/libs/hwui/Properties.h +++ b/libs/hwui/Properties.h @@ -119,7 +119,7 @@ enum DebugLevel { #define PROPERTY_FBO_CACHE_SIZE "ro.hwui.fbo_cache_size" // These properties are defined in percentage (range 0..1) -#define PROPERTY_TEXTURE_CACHE_FLUSH_RATE "ro.hwui.texture_cache_flush_rate" +#define PROPERTY_TEXTURE_CACHE_FLUSH_RATE "ro.hwui.texture_cache_flushrate" // These properties are defined in pixels #define PROPERTY_TEXT_SMALL_CACHE_WIDTH "ro.hwui.text_small_cache_width" diff --git a/libs/hwui/font/FontUtil.h b/libs/hwui/font/FontUtil.h index 4f9c46be35a9..f758666c1fc8 100644 --- a/libs/hwui/font/FontUtil.h +++ b/libs/hwui/font/FontUtil.h @@ -26,7 +26,7 @@ /////////////////////////////////////////////////////////////////////////////// #define DEFAULT_TEXT_SMALL_CACHE_WIDTH 1024 -#define DEFAULT_TEXT_SMALL_CACHE_HEIGHT 256 +#define DEFAULT_TEXT_SMALL_CACHE_HEIGHT 512 #define DEFAULT_TEXT_LARGE_CACHE_WIDTH 2048 #define DEFAULT_TEXT_LARGE_CACHE_HEIGHT 512 |