forked from len0rd/rockbox
Implement HAVE_LCD_ENABLE and lcd_update_rect(). When Rockbox runs in the background
this greatly reduces CPU load. lcd_update_rect shoves a bit as well. CPU usage with Rockbox in background is between 3% (with a 200kbps vbr mp3) and 12% (320kbps cbr mp3), so it's low but still dependent on codecs and even particular files. Driving a WPS with peakmeter, e.g. the builtin one, adds about 30% cpu usage. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@27689 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
f66a233bdb
commit
594110e962
4 changed files with 98 additions and 24 deletions
|
|
@ -31,6 +31,9 @@ extern jobject RockboxService_instance;
|
|||
|
||||
static jobject Framebuffer_instance;
|
||||
static jmethodID java_lcd_update;
|
||||
static jmethodID java_lcd_update_rect;
|
||||
|
||||
static bool display_on;
|
||||
|
||||
void lcd_init_device(void)
|
||||
{
|
||||
|
|
@ -52,13 +55,17 @@ void lcd_init_device(void)
|
|||
* our framebuffer */
|
||||
|
||||
jmethodID java_init_lcd = (*env_ptr)->GetMethodID(env_ptr,
|
||||
Framebuffer_class,
|
||||
"java_lcd_init",
|
||||
"(IILjava/nio/ByteBuffer;)V");
|
||||
java_lcd_update = (*env_ptr)->GetMethodID(env_ptr,
|
||||
Framebuffer_class,
|
||||
"java_lcd_update",
|
||||
"()V");
|
||||
Framebuffer_class,
|
||||
"java_lcd_init",
|
||||
"(IILjava/nio/ByteBuffer;)V");
|
||||
java_lcd_update = (*env_ptr)->GetMethodID(env_ptr,
|
||||
Framebuffer_class,
|
||||
"java_lcd_update",
|
||||
"()V");
|
||||
java_lcd_update_rect = (*env_ptr)->GetMethodID(env_ptr,
|
||||
Framebuffer_class,
|
||||
"java_lcd_update_rect",
|
||||
"(IIII)V");
|
||||
|
||||
/* map the framebuffer to a ByteBuffer, this way lcd updates will
|
||||
* be directly feched from the framebuffer */
|
||||
|
|
@ -70,21 +77,50 @@ void lcd_init_device(void)
|
|||
Framebuffer_instance,
|
||||
java_init_lcd,
|
||||
LCD_WIDTH, LCD_HEIGHT, buf);
|
||||
display_on = true;
|
||||
}
|
||||
|
||||
void lcd_update()
|
||||
void lcd_update(void)
|
||||
{
|
||||
/* tell the system we're ready for drawing */
|
||||
(*env_ptr)->CallVoidMethod(env_ptr, Framebuffer_instance, java_lcd_update);
|
||||
if (display_on)
|
||||
(*env_ptr)->CallVoidMethod(env_ptr, Framebuffer_instance, java_lcd_update);
|
||||
}
|
||||
|
||||
void lcd_update_rect(int x, int y, int height, int width)
|
||||
{
|
||||
/* can't do partial updates yet */
|
||||
(void)x; (void)y; (void)height; (void)width;
|
||||
lcd_update();
|
||||
if (display_on)
|
||||
{
|
||||
(*env_ptr)->CallVoidMethod(env_ptr, Framebuffer_instance, java_lcd_update_rect,
|
||||
x, y, height, width);
|
||||
}
|
||||
}
|
||||
|
||||
bool lcd_active(void)
|
||||
{
|
||||
return display_on;
|
||||
}
|
||||
|
||||
/*
|
||||
* (un)block lcd updates.
|
||||
*
|
||||
* Notice: This is called from the activity thread, so take it
|
||||
* as interrupt context and take care what the event callback does
|
||||
* (it shouldn't block in particular
|
||||
*
|
||||
* the 1s are needed due to strange naming conventions...
|
||||
**/
|
||||
JNIEXPORT void JNICALL
|
||||
Java_org_rockbox_RockboxFramebuffer_set_1lcd_1active(JNIEnv *e,
|
||||
jobject this,
|
||||
jint active)
|
||||
{
|
||||
(void)e;
|
||||
(void)this;
|
||||
display_on = active != 0;
|
||||
if (active)
|
||||
send_event(LCD_EVENT_ACTIVATION, NULL);
|
||||
}
|
||||
/* below is a plain copy from lcd-sdl.c */
|
||||
|
||||
/**
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue