diff options
author | Michael Sevakis <jethead71@rockbox.org> | 2012-01-05 23:00:14 +0000 |
---|---|---|
committer | Michael Sevakis <jethead71@rockbox.org> | 2012-01-05 23:00:14 +0000 |
commit | 302937e586ea44ed72e0485ef9e6732027ea9164 (patch) | |
tree | 1ef0542eefbc5919585b0ac8a472b96658d89919 | |
parent | c6dcec4e0d9af18a3e45d557e9e072c5640d85cd (diff) | |
download | rockbox-302937e586ea44ed72e0485ef9e6732027ea9164.tar.gz rockbox-302937e586ea44ed72e0485ef9e6732027ea9164.zip |
Coldfire: Fix alpha bitmap drawing from messing up the emac status register.
It failed to restore macsr to the expected default (FRAC/SAT) which caused DSP
functions like tone control filter calculation to fail (resulting in noise).
The FFT plugin was also affected.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@31589 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r-- | firmware/drivers/lcd-16bit-common.c | 13 | ||||
-rw-r--r-- | firmware/target/coldfire/iaudio/x5/lcd-x5.c | 4 |
2 files changed, 16 insertions, 1 deletions
diff --git a/firmware/drivers/lcd-16bit-common.c b/firmware/drivers/lcd-16bit-common.c index 2e5ce208b0..467d9f32a6 100644 --- a/firmware/drivers/lcd-16bit-common.c +++ b/firmware/drivers/lcd-16bit-common.c | |||
@@ -606,6 +606,7 @@ void lcd_mono_bitmap(const unsigned char *src, int x, int y, int width, int heig | |||
606 | #define ALPHA_COLOR_PIXEL_PER_WORD (32 >> ALPHA_COLOR_FONT_DEPTH) | 606 | #define ALPHA_COLOR_PIXEL_PER_WORD (32 >> ALPHA_COLOR_FONT_DEPTH) |
607 | #ifdef CPU_ARM | 607 | #ifdef CPU_ARM |
608 | #define BLEND_INIT do {} while (0) | 608 | #define BLEND_INIT do {} while (0) |
609 | #define BLEND_FINISH do {} while(0) | ||
609 | #define BLEND_START(acc, color, alpha) \ | 610 | #define BLEND_START(acc, color, alpha) \ |
610 | asm volatile("mul %0, %1, %2" : "=&r" (acc) : "r" (color), "r" (alpha)) | 611 | asm volatile("mul %0, %1, %2" : "=&r" (acc) : "r" (color), "r" (alpha)) |
611 | #define BLEND_CONT(acc, color, alpha) \ | 612 | #define BLEND_CONT(acc, color, alpha) \ |
@@ -613,13 +614,18 @@ void lcd_mono_bitmap(const unsigned char *src, int x, int y, int width, int heig | |||
613 | #define BLEND_OUT(acc) do {} while (0) | 614 | #define BLEND_OUT(acc) do {} while (0) |
614 | #elif defined(CPU_COLDFIRE) | 615 | #elif defined(CPU_COLDFIRE) |
615 | #define ALPHA_BITMAP_READ_WORDS | 616 | #define ALPHA_BITMAP_READ_WORDS |
616 | #define BLEND_INIT coldfire_set_macsr(EMAC_UNSIGNED) | 617 | #define BLEND_INIT \ |
618 | unsigned long _macsr = coldfire_get_macsr(); \ | ||
619 | coldfire_set_macsr(EMAC_UNSIGNED) | ||
620 | #define BLEND_FINISH \ | ||
621 | coldfire_set_macsr(_macsr) | ||
617 | #define BLEND_START(acc, color, alpha) \ | 622 | #define BLEND_START(acc, color, alpha) \ |
618 | asm volatile("mac.l %0, %1, %%acc0" :: "%d" (color), "d" (alpha)) | 623 | asm volatile("mac.l %0, %1, %%acc0" :: "%d" (color), "d" (alpha)) |
619 | #define BLEND_CONT BLEND_START | 624 | #define BLEND_CONT BLEND_START |
620 | #define BLEND_OUT(acc) asm volatile("movclr.l %%acc0, %0" : "=d" (acc)) | 625 | #define BLEND_OUT(acc) asm volatile("movclr.l %%acc0, %0" : "=d" (acc)) |
621 | #else | 626 | #else |
622 | #define BLEND_INIT do {} while (0) | 627 | #define BLEND_INIT do {} while (0) |
628 | #define BLEND_FINISH do {} while(0) | ||
623 | #define BLEND_START(acc, color, alpha) ((acc) = (color) * (alpha)) | 629 | #define BLEND_START(acc, color, alpha) ((acc) = (color) * (alpha)) |
624 | #define BLEND_CONT(acc, color, alpha) ((acc) += (color) * (alpha)) | 630 | #define BLEND_CONT(acc, color, alpha) ((acc) += (color) * (alpha)) |
625 | #define BLEND_OUT(acc) do {} while (0) | 631 | #define BLEND_OUT(acc) do {} while (0) |
@@ -701,7 +707,10 @@ static void ICODE_ATTR lcd_alpha_bitmap_part_mix(const fb_data* image, | |||
701 | /* nothing to draw? */ | 707 | /* nothing to draw? */ |
702 | if ((x >= LCD_WIDTH) || (y >= LCD_HEIGHT) | 708 | if ((x >= LCD_WIDTH) || (y >= LCD_HEIGHT) |
703 | || (x + width <= 0) || (y + height <= 0)) | 709 | || (x + width <= 0) || (y + height <= 0)) |
710 | { | ||
711 | BLEND_FINISH; | ||
704 | return; | 712 | return; |
713 | } | ||
705 | 714 | ||
706 | /* clip image in viewport in screen */ | 715 | /* clip image in viewport in screen */ |
707 | if (x < 0) | 716 | if (x < 0) |
@@ -908,6 +917,8 @@ static void ICODE_ATTR lcd_alpha_bitmap_part_mix(const fb_data* image, | |||
908 | } | 917 | } |
909 | #endif | 918 | #endif |
910 | } while (--row); | 919 | } while (--row); |
920 | |||
921 | BLEND_FINISH; | ||
911 | } | 922 | } |
912 | 923 | ||
913 | /* Draw a full native bitmap */ | 924 | /* Draw a full native bitmap */ |
diff --git a/firmware/target/coldfire/iaudio/x5/lcd-x5.c b/firmware/target/coldfire/iaudio/x5/lcd-x5.c index e1504b6e98..19b0725ce4 100644 --- a/firmware/target/coldfire/iaudio/x5/lcd-x5.c +++ b/firmware/target/coldfire/iaudio/x5/lcd-x5.c | |||
@@ -451,7 +451,9 @@ void lcd_blit_yuv(unsigned char * const src[3], | |||
451 | vsrc = src[2] + (src_y * stride >> 2) + (src_x >> 1); | 451 | vsrc = src[2] + (src_y * stride >> 2) + (src_x >> 1); |
452 | ysrc_max = ysrc + height * stride; | 452 | ysrc_max = ysrc + height * stride; |
453 | 453 | ||
454 | unsigned long macsr = coldfire_get_macsr(); | ||
454 | coldfire_set_macsr(EMAC_SATURATE); | 455 | coldfire_set_macsr(EMAC_SATURATE); |
456 | |||
455 | do | 457 | do |
456 | { | 458 | { |
457 | lcd_write_reg(R_HORIZ_RAM_ADDR_POS, ((y + y_offset + 1) << 8) | (y + y_offset)); | 459 | lcd_write_reg(R_HORIZ_RAM_ADDR_POS, ((y + y_offset + 1) << 8) | (y + y_offset)); |
@@ -470,6 +472,8 @@ void lcd_blit_yuv(unsigned char * const src[3], | |||
470 | vsrc += stride >> 1; | 472 | vsrc += stride >> 1; |
471 | } | 473 | } |
472 | while (ysrc < ysrc_max); | 474 | while (ysrc < ysrc_max); |
475 | |||
476 | coldfire_set_macsr(macsr); | ||
473 | } /* lcd_yuv_blit */ | 477 | } /* lcd_yuv_blit */ |
474 | 478 | ||
475 | 479 | ||