From 93e2a44e7fdb51e87e1593ed11a34688cf19af3a Mon Sep 17 00:00:00 2001 From: ywen Date: Mon, 15 Feb 2016 16:09:40 +0800 Subject: Performance Optimization: Align texture dirty rect Align x offset and width to 32, y offset and height to 4. It improves the font texture upload performance. Change-Id: I967eeed90658f2ce1eb08cb2740d5dc34c72f40b --- libs/hwui/font/CacheTexture.cpp | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) (limited to 'libs/hwui') diff --git a/libs/hwui/font/CacheTexture.cpp b/libs/hwui/font/CacheTexture.cpp index d2685da..a767a4e 100644 --- a/libs/hwui/font/CacheTexture.cpp +++ b/libs/hwui/font/CacheTexture.cpp @@ -204,15 +204,21 @@ void CacheTexture::allocatePixelBuffer() { bool CacheTexture::upload() { const Rect& dirtyRect = mDirtyRect; - uint32_t x = mHasUnpackRowLength ? dirtyRect.left : 0; - uint32_t y = dirtyRect.top; - uint32_t width = mHasUnpackRowLength ? dirtyRect.getWidth() : getWidth(); - uint32_t height = dirtyRect.getHeight(); + // align the x direction to 32 and y direction to 4 for better performance + uint32_t x = (((uint32_t)dirtyRect.left) & (~0x1F)); + uint32_t y = (((uint32_t)dirtyRect.top) & (~0x3)); + uint32_t r = ((((uint32_t)dirtyRect.right) + 0x1F) & (~0x1F)); + uint32_t b = ((((uint32_t)dirtyRect.bottom) + 0x3) & (~0x3)); + uint32_t width = (r > getWidth() ? getWidth() : r) - x; + uint32_t height = (b > getHeight() ? getHeight() : b) - y; // The unpack row length only needs to be specified when a new // texture is bound if (mHasUnpackRowLength) { glPixelStorei(GL_UNPACK_ROW_LENGTH, getWidth()); + } else { + x = 0; + width = getWidth(); } mPixelBuffer->upload(x, y, width, height); -- cgit v1.1