diff options
author | Romain Guy <romainguy@google.com> | 2013-03-19 11:32:41 -0700 |
---|---|---|
committer | Romain Guy <romainguy@google.com> | 2013-03-19 11:32:41 -0700 |
commit | 115096f50a560e64a7f95d37686d4861042c7aeb (patch) | |
tree | 95f72f39e1f1275bf9c51dbda3c04774dc48d3fa /libs | |
parent | bbb4e03ad4e86e79c9b51cbb18c563a5a79cf837 (diff) | |
download | frameworks_base-115096f50a560e64a7f95d37686d4861042c7aeb.zip frameworks_base-115096f50a560e64a7f95d37686d4861042c7aeb.tar.gz frameworks_base-115096f50a560e64a7f95d37686d4861042c7aeb.tar.bz2 |
Minimize texture binds when drawing text
When several CacheTextures are used to draw text, sort the
draw batches by texture ID to minimize state changes in the
driver.
This change also tweaks the font cache size and renames
a property that was too long to be set using setprop.
Change-Id: I0a36dfffe58c9e75dd7384592d3343c192d042b1
Diffstat (limited to 'libs')
-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 f0dcb30..0c70e27 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 d0c44ef..442f4e2 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 5f39abf..e4b4f3c 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 4f9c46b..f758666 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 |