summaryrefslogtreecommitdiffstats
path: root/cmds
diff options
context:
space:
mode:
authorPrashant Somashekar <prashsomash@gmail.com>2013-02-16 16:47:44 -0500
committerPrashant Somashekar <prashsomash@gmail.com>2013-02-16 19:58:38 -0500
commitdf09f053067d8348a3691340bd26d86f948d15d5 (patch)
tree8b0e866b5f93cb800681837ce4fb7a2c049ff869 /cmds
parent0588df9b7e9872fb36078c639de370abdb86aaac (diff)
downloadframeworks_base-df09f053067d8348a3691340bd26d86f948d15d5.zip
frameworks_base-df09f053067d8348a3691340bd26d86f948d15d5.tar.gz
frameworks_base-df09f053067d8348a3691340bd26d86f948d15d5.tar.bz2
bootanimation: performance/speedup enhancements (squashed from CM10)
bootanim: Don't cache textures if they're expected to use a lot of VRAM (rmcc) https://github.com/CyanogenMod/android_frameworks_base/commit/14f9eecd3f543a25c4a2053d6155a9396a777a3a#cmds/bootanimation bootanimation: performance enhancements (turl) https://github.com/CyanogenMod/android_frameworks_base/commit/e6b54405aa70d7503a114d9c90ef7518abdd7133#cmds/bootanimation bootanimation: fix usage of LOGW (intervigilium) https://github.com/CyanogenMod/android_frameworks_base/commit/e45cf7d232490f44aecf8f2447220a8b5ace4c10#cmds/bootanimation bootanimation: allow using RGB565 instead of ARGB8888 (tpruvot) https://github.com/CyanogenMod/android_frameworks_base/commit/204282870a9c69b04ad5ddecd73fafbd7996cbc0#cmds/bootanimation Change-Id: I203fa23f77d1349fb822a7662e2cd3998ba4c814 bootanim: Don't cache textures if they're expected to use a lot of VRAM bootanimation cached all the textures generated until the animation was completed. For Hi-res animations with lots of frames (like the new CM9 anim on xhdpi devices), this implied using large amounts of video RAM, more than most devices actually have available, causing the animation to stall (and in some cases, gralloc to lock up); so if an animation is expected to use a lot of RAM (rough estimation based on frame size and number of frames), disable cache entirely and generate the textures on demand Change-Id: I157e5cdde2aab1d82d980d77cbedd9f127c83a1d Conflicts: cmds/bootanimation/BootAnimation.cpp bootanimation: performance enhancements This patch implements two simple performance enhancements, which might benefit devices. They are completely opt-in by setting the following variables. * TARGET_BOOTANIMATION_PRELOAD: will preload the bootanimation zip to memory; this is handy on devices where the storage might be slow. By preloading it, we get quick access to the zip file, and the animation doesn't stutter. * TARGET_BOOTANIMATION_TEXTURE_CACHE: allows maintainers to force texture cache on/off. Also fixes the sign warnings related to int / size_t comparison Change-Id: Ie92d1b0aa90b43ba39c368a2a33657a60c3a64b5 Conflicts: cmds/bootanimation/BootAnimation.cpp bootanimation: fix usage of LOGW Change-Id: I1d59df9f44f414d80058a532644cbbb40e22c701 bootanimation: allow using RGB565 instead of ARGB8888 RGB565 uses considerably less memory, and together with texture cache, it allows us to offer a really smooth bootanimation on not so powerful devices. Change-Id: I9da8fd7e6a587b5895519dd0983ec9b8f676771b
Diffstat (limited to 'cmds')
-rw-r--r--cmds/bootanimation/Android.mk16
-rw-r--r--cmds/bootanimation/BootAnimation.cpp56
2 files changed, 68 insertions, 4 deletions
diff --git a/cmds/bootanimation/Android.mk b/cmds/bootanimation/Android.mk
index 8c46b21..14e713c 100644
--- a/cmds/bootanimation/Android.mk
+++ b/cmds/bootanimation/Android.mk
@@ -21,6 +21,22 @@ LOCAL_SHARED_LIBRARIES := \
LOCAL_C_INCLUDES := \
$(call include-path-for, corecg graphics)
+ifeq ($(TARGET_BOOTANIMATION_PRELOAD),true)
+ LOCAL_CFLAGS += -DPRELOAD_BOOTANIMATION
+endif
+
+ifeq ($(TARGET_BOOTANIMATION_TEXTURE_CACHE),true)
+ LOCAL_CFLAGS += -DNO_TEXTURE_CACHE=0
+endif
+
+ifeq ($(TARGET_BOOTANIMATION_TEXTURE_CACHE),false)
+ LOCAL_CFLAGS += -DNO_TEXTURE_CACHE=1
+endif
+
+ifeq ($(TARGET_BOOTANIMATION_USE_RGB565),true)
+ LOCAL_CFLAGS += -DUSE_565
+endif
+
LOCAL_MODULE:= bootanimation
diff --git a/cmds/bootanimation/BootAnimation.cpp b/cmds/bootanimation/BootAnimation.cpp
index 8511735..7c78cfb 100644
--- a/cmds/bootanimation/BootAnimation.cpp
+++ b/cmds/bootanimation/BootAnimation.cpp
@@ -162,7 +162,11 @@ status_t BootAnimation::initTexture(void* buffer, size_t len)
codec->setDitherImage(false);
if (codec) {
codec->decode(&stream, &bitmap,
+ #ifdef USE_565
+ SkBitmap::kRGB_565_Config,
+ #else
SkBitmap::kARGB_8888_Config,
+ #endif
SkImageDecoder::kDecodePixels_Mode);
delete codec;
}
@@ -289,6 +293,38 @@ status_t BootAnimation::readyToRun() {
mAndroidAnimation = false;
}
+
+#ifdef PRELOAD_BOOTANIMATION
+ // Preload the bootanimation zip on memory, so we don't stutter
+ // when showing the animation
+ FILE* fd;
+ if (encryptedAnimation && access(SYSTEM_ENCRYPTED_BOOTANIMATION_FILE, R_OK) == 0)
+ fd = fopen(SYSTEM_ENCRYPTED_BOOTANIMATION_FILE, "r");
+ else if (access(USER_BOOTANIMATION_FILE, R_OK) == 0)
+ fd = fopen(USER_BOOTANIMATION_FILE, "r");
+ else if (access(SYSTEM_BOOTANIMATION_FILE, R_OK) == 0)
+ fd = fopen(SYSTEM_BOOTANIMATION_FILE, "r");
+ else
+ return NO_ERROR;
+
+ if (fd != NULL) {
+ // We could use readahead..
+ // ... if bionic supported it :(
+ //readahead(fd, 0, INT_MAX);
+ void *crappyBuffer = malloc(2*1024*1024);
+ if (crappyBuffer != NULL) {
+ // Read all the zip
+ while (!feof(fd))
+ fread(crappyBuffer, 1024, 2*1024, fd);
+
+ free(crappyBuffer);
+ } else {
+ ALOGW("Unable to allocate memory to preload the animation");
+ }
+ fclose(fd);
+ }
+#endif
+
return NO_ERROR;
}
@@ -446,7 +482,7 @@ bool BootAnimation::movie()
const String8 path(entryName.getPathDir());
const String8 leaf(entryName.getPathLeaf());
if (leaf.size() > 0) {
- for (int j=0 ; j<pcount ; j++) {
+ for (size_t j=0 ; j<pcount ; j++) {
if (path == animation.parts[j].path) {
int method;
// supports only stored png files
@@ -497,6 +533,15 @@ bool BootAnimation::movie()
for (int i=0 ; i<pcount ; i++) {
const Animation::Part& part(animation.parts[i]);
const size_t fcount = part.frames.size();
+
+ // can be 1, 0, or not set
+ #ifdef NO_TEXTURE_CACHE
+ const int noTextureCache = NO_TEXTURE_CACHE;
+ #else
+ const int noTextureCache = ((animation.width * animation.height * fcount) >
+ 48 * 1024 * 1024) ? 1 : 0;
+ #endif
+
glBindTexture(GL_TEXTURE_2D, 0);
for (int r=0 ; !part.count || r<part.count ; r++) {
@@ -508,7 +553,7 @@ bool BootAnimation::movie()
const Animation::Frame& frame(part.frames[j]);
nsecs_t lastFrame = systemTime();
- if (r > 0) {
+ if (r > 0 && !noTextureCache) {
glBindTexture(GL_TEXTURE_2D, frame.tid);
} else {
if (part.count != 1) {
@@ -553,6 +598,9 @@ bool BootAnimation::movie()
}
checkExit();
+
+ if (noTextureCache)
+ glDeleteTextures(1, &frame.tid);
}
usleep(part.pause * ns2us(frameDuration));
@@ -563,8 +611,8 @@ bool BootAnimation::movie()
}
// free the textures for this part
- if (part.count != 1) {
- for (int j=0 ; j<fcount ; j++) {
+ if (part.count != 1 && !noTextureCache) {
+ for (size_t j=0 ; j<fcount ; j++) {
const Animation::Frame& frame(part.frames[j]);
glDeleteTextures(1, &frame.tid);
}