diff options
Diffstat (limited to 'libs/hwui')
-rw-r--r-- | libs/hwui/Caches.cpp | 4 | ||||
-rw-r--r-- | libs/hwui/Caches.h | 3 | ||||
-rw-r--r-- | libs/hwui/DisplayListRenderer.cpp | 22 | ||||
-rw-r--r-- | libs/hwui/DisplayListRenderer.h | 6 | ||||
-rw-r--r-- | libs/hwui/Layer.h | 4 | ||||
-rw-r--r-- | libs/hwui/LayerCache.cpp | 16 | ||||
-rw-r--r-- | libs/hwui/LayerCache.h | 5 | ||||
-rw-r--r-- | libs/hwui/LayerRenderer.cpp | 10 | ||||
-rw-r--r-- | libs/hwui/OpenGLRenderer.cpp | 8 | ||||
-rw-r--r-- | libs/hwui/Properties.h | 2 | ||||
-rw-r--r-- | libs/hwui/SkiaShader.cpp | 7 | ||||
-rw-r--r-- | libs/hwui/TextureCache.cpp | 2 |
12 files changed, 68 insertions, 21 deletions
diff --git a/libs/hwui/Caches.cpp b/libs/hwui/Caches.cpp index 7114b6a..c5858e9 100644 --- a/libs/hwui/Caches.cpp +++ b/libs/hwui/Caches.cpp @@ -173,13 +173,15 @@ void Caches::flush(FlushMode mode) { gradientCache.clear(); // fall through case kFlushMode_Moderate: - layerCache.clear(); pathCache.clear(); roundRectShapeCache.clear(); circleShapeCache.clear(); ovalShapeCache.clear(); rectShapeCache.clear(); arcShapeCache.clear(); + // fall through + case kFlushMode_Layers: + layerCache.clear(); break; } } diff --git a/libs/hwui/Caches.h b/libs/hwui/Caches.h index 76dff4b..cdcbf21 100644 --- a/libs/hwui/Caches.h +++ b/libs/hwui/Caches.h @@ -101,7 +101,8 @@ class Caches: public Singleton<Caches> { public: enum FlushMode { - kFlushMode_Moderate = 0, + kFlushMode_Layers = 0, + kFlushMode_Moderate, kFlushMode_Full }; diff --git a/libs/hwui/DisplayListRenderer.cpp b/libs/hwui/DisplayListRenderer.cpp index 886c05c..88cfc5a 100644 --- a/libs/hwui/DisplayListRenderer.cpp +++ b/libs/hwui/DisplayListRenderer.cpp @@ -74,12 +74,17 @@ void DisplayList::outputLogBuffer(int fd) { if (logBuffer.isEmpty()) { return; } - String8 cachesLog; - Caches::getInstance().dumpMemoryUsage(cachesLog); + FILE *file = fdopen(fd, "a"); - fprintf(file, "\nCaches:\n%s", cachesLog.string()); + fprintf(file, "\nRecent DisplayList operations\n"); logBuffer.outputCommands(file, OP_NAMES); + + String8 cachesLog; + Caches::getInstance().dumpMemoryUsage(cachesLog); + fprintf(file, "\nCaches:\n%s", cachesLog.string()); + fprintf(file, "\n"); + fflush(file); } @@ -143,10 +148,10 @@ void DisplayList::initFromDisplayListRenderer(const DisplayListRenderer& recorde clearResources(); } - size_t size = writer.size(); - void* buffer = sk_malloc_throw(size); + mSize = writer.size(); + void* buffer = sk_malloc_throw(mSize); writer.flatten(buffer); - mReader.setMemory(buffer, size); + mReader.setMemory(buffer, mSize); Caches& caches = Caches::getInstance(); @@ -188,6 +193,11 @@ void DisplayList::initFromDisplayListRenderer(const DisplayListRenderer& recorde } void DisplayList::init() { + mSize = 0; +} + +size_t DisplayList::getSize() { + return mSize; } /** diff --git a/libs/hwui/DisplayListRenderer.h b/libs/hwui/DisplayListRenderer.h index 8157631..69e72a4 100644 --- a/libs/hwui/DisplayListRenderer.h +++ b/libs/hwui/DisplayListRenderer.h @@ -37,7 +37,7 @@ namespace uirenderer { // Defines /////////////////////////////////////////////////////////////////////////////// -#define MIN_WRITER_SIZE 16384 +#define MIN_WRITER_SIZE 4096 // Debug #if DEBUG_DISPLAY_LIST @@ -105,6 +105,8 @@ public: void initFromDisplayListRenderer(const DisplayListRenderer& recorder, bool reusing = false); + size_t getSize(); + bool replay(OpenGLRenderer& renderer, Rect& dirty, uint32_t level = 0); void output(OpenGLRenderer& renderer, uint32_t level = 0); @@ -203,6 +205,8 @@ private: Vector<SkiaShader*> mShaders; mutable SkFlattenableReadBuffer mReader; + + size_t mSize; }; /////////////////////////////////////////////////////////////////////////////// diff --git a/libs/hwui/Layer.h b/libs/hwui/Layer.h index 0c536b0..dd75497 100644 --- a/libs/hwui/Layer.h +++ b/libs/hwui/Layer.h @@ -191,6 +191,10 @@ struct Layer { if (texture.id) glDeleteTextures(1, &texture.id); } + inline void deleteFbo() { + if (fbo) glDeleteFramebuffers(1, &fbo); + } + inline void allocateTexture(GLenum format, GLenum storage) { glTexImage2D(renderTarget, 0, format, getWidth(), getHeight(), 0, format, storage, NULL); } diff --git a/libs/hwui/LayerCache.cpp b/libs/hwui/LayerCache.cpp index 36083af..0af0177 100644 --- a/libs/hwui/LayerCache.cpp +++ b/libs/hwui/LayerCache.cpp @@ -68,7 +68,9 @@ void LayerCache::setMaxSize(uint32_t maxSize) { void LayerCache::deleteLayer(Layer* layer) { if (layer) { + LAYER_LOGD("Destroying layer %dx%d", layer->getWidth(), layer->getHeight()); mSize -= layer->getWidth() * layer->getHeight() * 4; + layer->deleteFbo(); layer->deleteTexture(); delete layer; } @@ -111,17 +113,21 @@ Layer* LayerCache::get(const uint32_t width, const uint32_t height) { glPixelStorei(GL_UNPACK_ALIGNMENT, 4); #if DEBUG_LAYERS - size_t size = mCache.size(); - for (size_t i = 0; i < size; i++) { - const LayerEntry& entry = mCache.itemAt(i); - LAYER_LOGD(" Layer size %dx%d", entry.mWidth, entry.mHeight); - } + dump(); #endif } return layer; } +void LayerCache::dump() { + size_t size = mCache.size(); + for (size_t i = 0; i < size; i++) { + const LayerEntry& entry = mCache.itemAt(i); + LAYER_LOGD(" Layer size %dx%d", entry.mWidth, entry.mHeight); + } +} + bool LayerCache::resize(Layer* layer, const uint32_t width, const uint32_t height) { // TODO: We should be smarter and see if we have a texture of the appropriate // size already in the cache, and reuse it instead of creating a new one diff --git a/libs/hwui/LayerCache.h b/libs/hwui/LayerCache.h index 81b8bf3..a0eae59 100644 --- a/libs/hwui/LayerCache.h +++ b/libs/hwui/LayerCache.h @@ -101,6 +101,11 @@ public: */ uint32_t getSize(); + /** + * Prints out the content of the cache. + */ + void dump(); + private: void deleteLayer(Layer* layer); diff --git a/libs/hwui/LayerRenderer.cpp b/libs/hwui/LayerRenderer.cpp index 1fa343b..7e8c7fd 100644 --- a/libs/hwui/LayerRenderer.cpp +++ b/libs/hwui/LayerRenderer.cpp @@ -167,7 +167,7 @@ void LayerRenderer::generateMesh() { /////////////////////////////////////////////////////////////////////////////// Layer* LayerRenderer::createLayer(uint32_t width, uint32_t height, bool isOpaque) { - LAYER_RENDERER_LOGD("Creating new layer %dx%d", width, height); + LAYER_RENDERER_LOGD("Requesting new render layer %dx%d", width, height); GLuint fbo = Caches::getInstance().fboCache.get(); if (!fbo) { @@ -288,16 +288,22 @@ void LayerRenderer::updateTextureLayer(Layer* layer, uint32_t width, uint32_t he void LayerRenderer::destroyLayer(Layer* layer) { if (layer) { - LAYER_RENDERER_LOGD("Destroying layer, fbo = %d", layer->getFbo()); + LAYER_RENDERER_LOGD("Recycling layer, %dx%d fbo = %d", + layer->getWidth(), layer->getHeight(), layer->getFbo()); if (layer->getFbo()) { Caches::getInstance().fboCache.put(layer->getFbo()); } if (!Caches::getInstance().layerCache.put(layer)) { + LAYER_RENDERER_LOGD(" Destroyed!"); layer->deleteTexture(); delete layer; } else { + LAYER_RENDERER_LOGD(" Cached!"); +#if DEBUG_LAYER_RENDERER + Caches::getInstance().layerCache.dump(); +#endif layer->region.clear(); } } diff --git a/libs/hwui/OpenGLRenderer.cpp b/libs/hwui/OpenGLRenderer.cpp index e67abbd..ed2fa3c 100644 --- a/libs/hwui/OpenGLRenderer.cpp +++ b/libs/hwui/OpenGLRenderer.cpp @@ -1489,13 +1489,19 @@ void OpenGLRenderer::drawBitmap(SkBitmap* bitmap, const float x = (int) floorf(dstLeft + mSnapshot->transform->getTranslateX() + 0.5f); const float y = (int) floorf(dstTop + mSnapshot->transform->getTranslateY() + 0.5f); - texture->setFilter(GL_NEAREST, GL_NEAREST, true); + GLenum filter = GL_NEAREST; + if (u1 > 0.0f || u2 < 1.0f || v1 > 0.0f || v2 < 1.0f) { + filter = GL_LINEAR; + } + texture->setFilter(filter, filter, true); + drawTextureMesh(x, y, x + (dstRight - dstLeft), y + (dstBottom - dstTop), texture->id, alpha / 255.0f, mode, texture->blend, &mMeshVertices[0].position[0], &mMeshVertices[0].texture[0], GL_TRIANGLE_STRIP, gMeshCount, false, true); } else { texture->setFilter(GL_LINEAR, GL_LINEAR, true); + drawTextureMesh(dstLeft, dstTop, dstRight, dstBottom, texture->id, alpha / 255.0f, mode, texture->blend, &mMeshVertices[0].position[0], &mMeshVertices[0].texture[0], GL_TRIANGLE_STRIP, gMeshCount); diff --git a/libs/hwui/Properties.h b/libs/hwui/Properties.h index 47049e2..923978f 100644 --- a/libs/hwui/Properties.h +++ b/libs/hwui/Properties.h @@ -68,7 +68,7 @@ enum DebugLevel { #define MB(s) s * 1024 * 1024 #define DEFAULT_TEXTURE_CACHE_SIZE 24.0f -#define DEFAULT_LAYER_CACHE_SIZE 24.0f +#define DEFAULT_LAYER_CACHE_SIZE 16.0f #define DEFAULT_PATH_CACHE_SIZE 4.0f #define DEFAULT_SHAPE_CACHE_SIZE 1.0f #define DEFAULT_PATCH_CACHE_SIZE 512 diff --git a/libs/hwui/SkiaShader.cpp b/libs/hwui/SkiaShader.cpp index 1a60dca..06382f2 100644 --- a/libs/hwui/SkiaShader.cpp +++ b/libs/hwui/SkiaShader.cpp @@ -144,8 +144,11 @@ void SkiaBitmapShader::setupProgram(Program* program, const mat4& modelView, // Uniforms bindTexture(texture, mWrapS, mWrapT); - GLenum filter = textureTransform.isPureTranslate() ? GL_NEAREST : GL_LINEAR; - texture->setFilter(filter, filter); + // Assume linear here; we should really check the transform in + // ::updateTransforms() but we don't have the texture object + // available at that point. The optimization is not worth the + // effort for now. + texture->setFilter(GL_LINEAR, GL_LINEAR); glUniform1i(program->getUniform("bitmapSampler"), textureSlot); glUniformMatrix4fv(program->getUniform("textureTransform"), 1, diff --git a/libs/hwui/TextureCache.cpp b/libs/hwui/TextureCache.cpp index f926fdd..fbdbf92 100644 --- a/libs/hwui/TextureCache.cpp +++ b/libs/hwui/TextureCache.cpp @@ -165,7 +165,7 @@ void TextureCache::clearGarbage() { void TextureCache::clear() { mCache.clear(); - TEXTURE_LOGD("TextureCache:clear(), miSize = %d", mSize); + TEXTURE_LOGD("TextureCache:clear(), mSize = %d", mSize); } void TextureCache::generateTexture(SkBitmap* bitmap, Texture* texture, bool regenerate) { |