mirror of
https://github.com/Rockbox/rockbox.git
synced 2025-11-09 13:12:37 -05:00
Lcd save function pointer to frame buffer get_address_fn before loops
Calling multiple levels of indirection in a loop slows things down Really these need to be rewritten to take a start and end address like most of the rest of the codebase But this is safer without having test hardware in hand Change-Id: Idae7b92ee779d020ed7fcc9334e2d5a9c710e64d
This commit is contained in:
parent
60e5786b48
commit
cfeeb7889d
23 changed files with 78 additions and 40 deletions
|
|
@ -310,6 +310,7 @@ static void internal_update_rect(int x, int y, int width, int height)
|
|||
const int column_high = get_column_high_byte(x);
|
||||
const int column_low = get_column_low_byte(x);
|
||||
|
||||
void* (*fbaddr)(int x, int y) = FB_CURRENTVP_BUFFER->get_address_fn;
|
||||
/* Copy specified rectange bitmap to hardware */
|
||||
for (; y <= height; y++)
|
||||
{
|
||||
|
|
@ -320,7 +321,7 @@ static void internal_update_rect(int x, int y, int width, int height)
|
|||
(column_low)
|
||||
);
|
||||
|
||||
lcd_write_data (FBADDR(x,y), width);
|
||||
lcd_write_data (fbaddr(x,y), width);
|
||||
}
|
||||
lcd_write_command (LCD_NOP); /* return to command mode */
|
||||
|
||||
|
|
|
|||
|
|
@ -440,9 +440,10 @@ void lcd_update_rect(int x, int y, int width, int height)
|
|||
/* setup GRAM write window */
|
||||
lcd_setup_rect(x, x_end - 1, y, y_end - 1);
|
||||
|
||||
void* (*fbaddr)(int x, int y) = FB_CURRENTVP_BUFFER->get_address_fn;
|
||||
/* write to GRAM */
|
||||
for (row = y; row < y_end; row++) {
|
||||
lcd_write_data(FBADDR(x,row), width);
|
||||
lcd_write_data(fbaddr(x,row), width);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -149,6 +149,8 @@ void lcd_update_rect(int x, int y, int w, int h)
|
|||
lcd_write_reg(0x17, y | (y + h - 1) << 8);
|
||||
lcd_write_reg(0x21, y * LCD_WIDTH + x);
|
||||
lcd_write_reg(0x22, 0);
|
||||
|
||||
void* (*fbaddr)(int x, int y) = FB_CURRENTVP_BUFFER->get_address_fn;
|
||||
for(int yy = y; yy < y + h; yy++)
|
||||
imx233_lcdif_pio_send(true, 2 * w, FBADDR(x, yy));
|
||||
imx233_lcdif_pio_send(true, 2 * w, fbaddr(x,yy));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -172,8 +172,9 @@ void lcd_update_rect(int x, int y, int w, int h)
|
|||
lcd_send(false, 0x75); lcd_send(true, y); lcd_send(true, y + h - 1);
|
||||
lcd_send(false, 0x5c);
|
||||
imx233_lcdif_set_word_length(16);
|
||||
void* (*fbaddr)(int x, int y) = FB_CURRENTVP_BUFFER->get_address_fn;
|
||||
for(int yy = y; yy < y + h; yy++)
|
||||
imx233_lcdif_pio_send(true, w, FBADDR(x, yy));
|
||||
imx233_lcdif_pio_send(true, w, fbaddr(x,yy));
|
||||
}
|
||||
|
||||
#ifndef BOOTLOADER
|
||||
|
|
|
|||
|
|
@ -282,8 +282,9 @@ void lcd_update_rect(int x, int y, int w, int h)
|
|||
}
|
||||
else
|
||||
{
|
||||
void* (*fbaddr)(int x, int y) = FB_CURRENTVP_BUFFER->get_address_fn;
|
||||
for(int i = 0; i < h; i++)
|
||||
memcpy((fb_data *)FRAME + i * w, FBADDR(x,y + i), w * sizeof(fb_data));
|
||||
memcpy((fb_data *)FRAME + i * w, fbaddr(x,y + i), w * sizeof(fb_data));
|
||||
}
|
||||
/* WARNING The LCDIF has a limitation on the vertical count ! In 16-bit packed mode
|
||||
* (which we used, ie 16-bit per pixel, 2 pixels per 32-bit words), the v_count
|
||||
|
|
|
|||
|
|
@ -241,8 +241,9 @@ void lcd_update_rect(int x, int y, int w, int h)
|
|||
}
|
||||
else
|
||||
{
|
||||
void* (*fbaddr)(int x, int y) = FB_CURRENTVP_BUFFER->get_address_fn;
|
||||
for(int i = 0; i < h; i++)
|
||||
memcpy((fb_data *)FRAME + i * w, FBADDR(x,y + i), w * sizeof(fb_data));
|
||||
memcpy((fb_data *)FRAME + i * w, fbaddr(x,y + i), w * sizeof(fb_data));
|
||||
}
|
||||
/* WARNING The LCDIF has a limitation on the vertical count ! In 16-bit packed mode
|
||||
* (which we used, ie 16-bit per pixel, 2 pixels per 32-bit words), the v_count
|
||||
|
|
|
|||
|
|
@ -188,8 +188,9 @@ void lcd_update_rect(int x, int y, int w, int h)
|
|||
}
|
||||
else
|
||||
{
|
||||
void* (*fbaddr)(int x, int y) = FB_CURRENTVP_BUFFER->get_address_fn;
|
||||
for(int i = 0; i < h; i++)
|
||||
memcpy((fb_data *)FRAME + i * w, FBADDR(x,y + i), w * sizeof(fb_data));
|
||||
memcpy((fb_data *)FRAME + i * w, fbaddr(x,y + i), w * sizeof(fb_data));
|
||||
}
|
||||
/* WARNING The LCDIF has a limitation on the vertical count ! In 16-bit packed mode
|
||||
* (which we used, ie 16-bit per pixel, 2 pixels per 32-bit words), the v_count
|
||||
|
|
|
|||
|
|
@ -637,8 +637,9 @@ void lcd_update_rect(int x, int y, int w, int h)
|
|||
}
|
||||
else
|
||||
{
|
||||
void* (*fbaddr)(int x, int y) = FB_CURRENTVP_BUFFER->get_address_fn;
|
||||
for(int i = 0; i < h; i++)
|
||||
memcpy((fb_data *)FRAME + i * w, FBADDR(x,y + i), w * sizeof(fb_data));
|
||||
memcpy((fb_data *)FRAME + i * w, fbaddr(x,y + i), w * sizeof(fb_data));
|
||||
}
|
||||
/* WARNING The LCDIF has a limitation on the vertical count ! In 16-bit packed mode
|
||||
* (which we used, ie 16-bit per pixel, 2 pixels per 32-bit words), the v_count
|
||||
|
|
|
|||
|
|
@ -228,8 +228,9 @@ void lcd_update_rect(int x, int y, int w, int h)
|
|||
}
|
||||
else
|
||||
{
|
||||
void* (*fbaddr)(int x, int y) = FB_CURRENTVP_BUFFER->get_address_fn;
|
||||
for(int i = 0; i < h; i++)
|
||||
memcpy((fb_data *)FRAME + i * w, FBADDR(x,y + i), w * sizeof(fb_data));
|
||||
memcpy((fb_data *)FRAME + i * w, fbaddr(x,y + i), w * sizeof(fb_data));
|
||||
}
|
||||
/* WARNING The LCDIF has a limitation on the vertical count ! In 16-bit packed mode
|
||||
* (which we used, ie 16-bit per pixel, 2 pixels per 32-bit words), the v_count
|
||||
|
|
|
|||
|
|
@ -189,8 +189,9 @@ void lcd_update_rect(int x, int y, int w, int h)
|
|||
}
|
||||
else
|
||||
{
|
||||
void* (*fbaddr)(int x, int y) = FB_CURRENTVP_BUFFER->get_address_fn;
|
||||
for(int i = 0; i < h; i++)
|
||||
memcpy((fb_data *)FRAME + i * w, FBADDR(x,y + i), w * sizeof(fb_data));
|
||||
memcpy((fb_data *)FRAME + i * w, fbaddr(x,y + i), w * sizeof(fb_data));
|
||||
}
|
||||
/* WARNING The LCDIF has a limitation on the vertical count ! In 16-bit packed mode
|
||||
* (which we used, ie 16-bit per pixel, 2 pixels per 32-bit words), the v_count
|
||||
|
|
|
|||
|
|
@ -333,17 +333,18 @@ void lcd_update_rect(int x, int y, int width, int height)
|
|||
x >>= 3;
|
||||
width = xmax - x + 1;
|
||||
|
||||
for (; y <= ymax; y++)
|
||||
void* (*fbaddr)(int x, int y) = FB_CURRENTVP_BUFFER->get_address_fn;
|
||||
for (; y <= ymax; y++)
|
||||
{
|
||||
lcd_cmd_and_data(R_RAM_ADDR_SET, (y << 5) + addr_offset - x);
|
||||
lcd_prepare_cmd(R_RAM_DATA);
|
||||
|
||||
fb_data *data = fbaddr(2*x,y);
|
||||
#if defined(IPOD_MINI) || defined(IPOD_MINI2G)
|
||||
if (pix_offset == -2)
|
||||
lcd_write_data_shifted(FBADDR(2*x, y), width);
|
||||
lcd_write_data_shifted(data, width);
|
||||
else
|
||||
#endif
|
||||
lcd_write_data(FBADDR(2*x, y), width);
|
||||
lcd_write_data(data, width);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -221,6 +221,7 @@ void lcd_update(void)
|
|||
{
|
||||
int y;
|
||||
|
||||
void* (*fbaddr)(int x, int y) = FB_CURRENTVP_BUFFER->get_address_fn;
|
||||
/* Copy display bitmap to hardware */
|
||||
for (y = 0; y < LCD_FBHEIGHT; y++)
|
||||
{
|
||||
|
|
@ -228,7 +229,7 @@ void lcd_update(void)
|
|||
lcd_write_command (LCD_CNTL_HIGHCOL | ((xoffset >> 4) & 0xf));
|
||||
lcd_write_command (LCD_CNTL_LOWCOL | (xoffset & 0xf));
|
||||
|
||||
lcd_write_data (FBADDR(0, y), LCD_WIDTH);
|
||||
lcd_write_data (fbaddr(0,y), LCD_WIDTH);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -249,6 +250,7 @@ void lcd_update_rect(int x, int y, int width, int height)
|
|||
if(ymax >= LCD_FBHEIGHT)
|
||||
ymax = LCD_FBHEIGHT-1;
|
||||
|
||||
void* (*fbaddr)(int x, int y) = FB_CURRENTVP_BUFFER->get_address_fn;
|
||||
/* Copy specified rectange bitmap to hardware */
|
||||
for (; y <= ymax; y++)
|
||||
{
|
||||
|
|
@ -256,6 +258,6 @@ void lcd_update_rect(int x, int y, int width, int height)
|
|||
lcd_write_command (LCD_CNTL_HIGHCOL | (((x+xoffset) >> 4) & 0xf));
|
||||
lcd_write_command (LCD_CNTL_LOWCOL | ((x+xoffset) & 0xf));
|
||||
|
||||
lcd_write_data (FBADDR(x,y), width);
|
||||
lcd_write_data (fbaddr(x,y), width);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -232,6 +232,7 @@ void lcd_update(void)
|
|||
cmd1 = LCD_CNTL_HIGHCOL | (((xoffset) >> 4) & 0xf);
|
||||
cmd2 = LCD_CNTL_LOWCOL | ((xoffset) & 0xf);
|
||||
|
||||
void* (*fbaddr)(int x, int y) = FB_CURRENTVP_BUFFER->get_address_fn;
|
||||
/* Copy display bitmap to hardware */
|
||||
for (y = 0; y < LCD_FBHEIGHT; y++)
|
||||
{
|
||||
|
|
@ -239,7 +240,7 @@ void lcd_update(void)
|
|||
lcd_write_command(cmd1);
|
||||
lcd_write_command(cmd2);
|
||||
|
||||
lcd_write_data (FBADDR(0, y), LCD_WIDTH);
|
||||
lcd_write_data (fbaddr(0,y), LCD_WIDTH);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -264,6 +265,7 @@ void lcd_update_rect(int x, int y, int width, int height)
|
|||
cmd1 = LCD_CNTL_HIGHCOL | (((x + xoffset) >> 4) & 0xf);
|
||||
cmd2 = LCD_CNTL_LOWCOL | ((x + xoffset) & 0xf);
|
||||
|
||||
void* (*fbaddr)(int x, int y) = FB_CURRENTVP_BUFFER->get_address_fn;
|
||||
/* Copy specified rectange bitmap to hardware */
|
||||
for (; y <= ymax; y++)
|
||||
{
|
||||
|
|
@ -271,6 +273,6 @@ void lcd_update_rect(int x, int y, int width, int height)
|
|||
lcd_write_command(cmd1);
|
||||
lcd_write_command(cmd2);
|
||||
|
||||
lcd_write_data (FBADDR(x,y), width);
|
||||
lcd_write_data (fbaddr(x,y), width);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -198,9 +198,10 @@ static void create_llp(int x, int y, int width, int height)
|
|||
|
||||
width = width>>1;
|
||||
|
||||
void* (*fbaddr)(int x, int y) = FB_CURRENTVP_BUFFER->get_address_fn;
|
||||
/* build LLPs */
|
||||
for (i=0; i<height; i++)
|
||||
llp_setup((void *)FBADDR(x,y+i),
|
||||
llp_setup((void *)fbaddr(x,y+i),
|
||||
(void*)(LCD_BUFF+((i%4)*4*width)),
|
||||
&(scr_llp[i]),
|
||||
width);
|
||||
|
|
|
|||
|
|
@ -299,14 +299,15 @@ void lcd_update_rect(int x, int y, int width, int height)
|
|||
{
|
||||
fb_data* p;
|
||||
int h, w;
|
||||
|
||||
|
||||
void* (*fbaddr)(int x, int y) = FB_CURRENTVP_BUFFER->get_address_fn;
|
||||
if (lcd_type == 1) {
|
||||
/* TODO implement and test */
|
||||
lcd_set_window1(x, y, width, height);
|
||||
lcd_set_position1(x, y);
|
||||
|
||||
|
||||
for (h = 0; h < height; h++) {
|
||||
p = FBADDR(0,y);
|
||||
p = fbaddr(0,y);
|
||||
for (w = 0; w < LCD_WIDTH; w++) {
|
||||
while (LCD_STATUS & 0x10);
|
||||
LCD_WDATA = *p++;
|
||||
|
|
@ -317,9 +318,9 @@ void lcd_update_rect(int x, int y, int width, int height)
|
|||
else {
|
||||
lcd_set_window2(x, y, width, height);
|
||||
lcd_set_position2(x, y);
|
||||
|
||||
|
||||
for (h = 0; h < height; h++) {
|
||||
p = FBADDR(x,y);
|
||||
p = fbaddr(x,y);
|
||||
for (w = 0; w < width; w++) {
|
||||
while (LCD_STATUS & 0x10);
|
||||
LCD_WDATA = *p++;
|
||||
|
|
|
|||
|
|
@ -253,13 +253,14 @@ void lcd_update_rect(int x, int y, int width, int height)
|
|||
if(ymax >= LCD_FBHEIGHT)
|
||||
ymax = LCD_FBHEIGHT-1;
|
||||
|
||||
void* (*fbaddr)(int x, int y) = FB_CURRENTVP_BUFFER->get_address_fn;
|
||||
/* Copy specified rectange bitmap to hardware */
|
||||
for (; y <= ymax; y++)
|
||||
{
|
||||
lcd_write_reg(LCD_CNTL_PAGE, y);
|
||||
lcd_write_reg(LCD_CNTL_COLUMN, x);
|
||||
|
||||
addr = FBADDR(x,y);
|
||||
addr = fbaddr(x,y);
|
||||
|
||||
lcd_send_cmd(LCD_CNTL_DATA_WRITE);
|
||||
lcd_write_data(addr, width);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue