diff options
author | Jens Arnold <amiconn@rockbox.org> | 2006-11-04 00:42:18 +0000 |
---|---|---|
committer | Jens Arnold <amiconn@rockbox.org> | 2006-11-04 00:42:18 +0000 |
commit | f8b1da2f7bddebc9c7026bd5d106dec118ce70a9 (patch) | |
tree | 474e99488c568355dcd07c497181a11afa0245f9 /firmware/drivers/lcd-h300.c | |
parent | 0d8781e2f99ea11298b6a290a979417647a5ce37 (diff) | |
download | rockbox-f8b1da2f7bddebc9c7026bd5d106dec118ce70a9.tar.gz rockbox-f8b1da2f7bddebc9c7026bd5d106dec118ce70a9.zip |
H300, X5: Faster lcd_yuv_blit() using EMAC. Speedup of the function itself at 124MHz: 10.5% on X5, 16.5% on H300. mpegplayer speedup 3..4%
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@11429 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/drivers/lcd-h300.c')
-rw-r--r-- | firmware/drivers/lcd-h300.c | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/firmware/drivers/lcd-h300.c b/firmware/drivers/lcd-h300.c index b7865fa7c5..3e5642e35d 100644 --- a/firmware/drivers/lcd-h300.c +++ b/firmware/drivers/lcd-h300.c | |||
@@ -304,10 +304,11 @@ void lcd_blit(const fb_data* data, int x, int by, int width, | |||
304 | /* Line write helper function for lcd_yuv_blit. Write two lines of yuv420. | 304 | /* Line write helper function for lcd_yuv_blit. Write two lines of yuv420. |
305 | * y should have two lines of Y back to back. | 305 | * y should have two lines of Y back to back. |
306 | * bu and rv should contain the Cb and Cr data for the two lines of Y. | 306 | * bu and rv should contain the Cb and Cr data for the two lines of Y. |
307 | * Stores bu, guv and rv in repective buffers for use in second line. | 307 | * Needs EMAC set to saturated, signed integer mode. |
308 | */ | 308 | */ |
309 | extern void lcd_write_yuv420_lines(const unsigned char *y, | 309 | extern void lcd_write_yuv420_lines(const unsigned char *y, |
310 | unsigned char *bu, unsigned char *guv, unsigned char *rv, int width); | 310 | const unsigned char *bu, |
311 | const unsigned char *rv, int width); | ||
311 | 312 | ||
312 | /* Performance function to blit a YUV bitmap directly to the LCD | 313 | /* Performance function to blit a YUV bitmap directly to the LCD |
313 | * src_x, src_y, width and height should be even | 314 | * src_x, src_y, width and height should be even |
@@ -317,10 +318,9 @@ void lcd_yuv_blit(unsigned char * const src[3], | |||
317 | int src_x, int src_y, int stride, | 318 | int src_x, int src_y, int stride, |
318 | int x, int y, int width, int height) | 319 | int x, int y, int width, int height) |
319 | { | 320 | { |
320 | /* IRAM Y, Cb/bu, guv and Cb/rv buffers. */ | 321 | /* IRAM Y, Cb and Cb buffers. */ |
321 | unsigned char y_ibuf[LCD_WIDTH*2]; | 322 | unsigned char y_ibuf[LCD_WIDTH*2]; |
322 | unsigned char bu_ibuf[LCD_WIDTH/2]; | 323 | unsigned char bu_ibuf[LCD_WIDTH/2]; |
323 | unsigned char guv_ibuf[LCD_WIDTH/2]; | ||
324 | unsigned char rv_ibuf[LCD_WIDTH/2]; | 324 | unsigned char rv_ibuf[LCD_WIDTH/2]; |
325 | const unsigned char *ysrc, *usrc, *vsrc; | 325 | const unsigned char *ysrc, *usrc, *vsrc; |
326 | const unsigned char *ysrc_max; | 326 | const unsigned char *ysrc_max; |
@@ -342,13 +342,14 @@ void lcd_yuv_blit(unsigned char * const src[3], | |||
342 | vsrc = src[2] + (src_y * stride >> 2) + (src_x >> 1); | 342 | vsrc = src[2] + (src_y * stride >> 2) + (src_x >> 1); |
343 | ysrc_max = ysrc + height * stride; | 343 | ysrc_max = ysrc + height * stride; |
344 | 344 | ||
345 | coldfire_set_macsr(EMAC_SATURATE); | ||
345 | do | 346 | do |
346 | { | 347 | { |
347 | memcpy(y_ibuf, ysrc, width); | 348 | memcpy(y_ibuf, ysrc, width); |
348 | memcpy(y_ibuf + width, ysrc + stride, width); | 349 | memcpy(y_ibuf + width, ysrc + stride, width); |
349 | memcpy(bu_ibuf, usrc, width >> 1); | 350 | memcpy(bu_ibuf, usrc, width >> 1); |
350 | memcpy(rv_ibuf, vsrc, width >> 1); | 351 | memcpy(rv_ibuf, vsrc, width >> 1); |
351 | lcd_write_yuv420_lines(y_ibuf, bu_ibuf, guv_ibuf, rv_ibuf, width); | 352 | lcd_write_yuv420_lines(y_ibuf, bu_ibuf, rv_ibuf, width); |
352 | ysrc += 2 * stride; | 353 | ysrc += 2 * stride; |
353 | usrc += stride >> 1; | 354 | usrc += stride >> 1; |
354 | vsrc += stride >> 1; | 355 | vsrc += stride >> 1; |
@@ -381,6 +382,7 @@ void lcd_update(void) | |||
381 | } | 382 | } |
382 | } | 383 | } |
383 | 384 | ||
385 | |||
384 | /* Update a fraction of the display. */ | 386 | /* Update a fraction of the display. */ |
385 | void lcd_update_rect(int, int, int, int) ICODE_ATTR; | 387 | void lcd_update_rect(int, int, int, int) ICODE_ATTR; |
386 | void lcd_update_rect(int x, int y, int width, int height) | 388 | void lcd_update_rect(int x, int y, int width, int height) |