summaryrefslogtreecommitdiffstats
path: root/libs/hwui
diff options
context:
space:
mode:
Diffstat (limited to 'libs/hwui')
-rw-r--r--libs/hwui/Caches.cpp4
-rw-r--r--libs/hwui/Caches.h3
-rw-r--r--libs/hwui/DisplayListRenderer.cpp22
-rw-r--r--libs/hwui/DisplayListRenderer.h6
-rw-r--r--libs/hwui/Layer.h4
-rw-r--r--libs/hwui/LayerCache.cpp16
-rw-r--r--libs/hwui/LayerCache.h5
-rw-r--r--libs/hwui/LayerRenderer.cpp10
-rw-r--r--libs/hwui/OpenGLRenderer.cpp8
-rw-r--r--libs/hwui/Properties.h2
-rw-r--r--libs/hwui/SkiaShader.cpp7
-rw-r--r--libs/hwui/TextureCache.cpp2
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) {