diff options
author | jdgleaver | 2020-11-09 13:04:00 +0000 |
---|---|---|
committer | jdgleaver | 2020-11-09 13:04:00 +0000 |
commit | 908be08be58d0150f05c92fdac7c4c98f3bd81be (patch) | |
tree | cd1646858d585316b5b9935ace53ae7f47331bc1 | |
parent | c54a3bf21c3020f4d212587af4c633cbdf530063 (diff) | |
download | picogpsp-908be08be58d0150f05c92fdac7c4c98f3bd81be.tar.gz picogpsp-908be08be58d0150f05c92fdac7c4c98f3bd81be.tar.bz2 picogpsp-908be08be58d0150f05c92fdac7c4c98f3bd81be.zip |
Optimise interframe blending
-rw-r--r-- | libretro.c | 41 |
1 files changed, 10 insertions, 31 deletions
@@ -279,25 +279,13 @@ static void video_post_process_mix(void) uint16_t rgb_curr = *(src_curr + x); uint16_t rgb_prev = *(src_prev + x); - uint16_t r_curr = rgb_curr >> 11 & 0x1F; - uint16_t g_curr = rgb_curr >> 6 & 0x1F; - uint16_t b_curr = rgb_curr & 0x1F; - - uint16_t r_prev = rgb_prev >> 11 & 0x1F; - uint16_t g_prev = rgb_prev >> 6 & 0x1F; - uint16_t b_prev = rgb_prev & 0x1F; - /* Store colours for next frame */ *(src_prev + x) = rgb_curr; - /* Mix colours */ - uint16_t r_mix = (r_curr >> 1) + (r_prev >> 1) + (((r_curr & 0x1) + (r_prev & 0x1)) >> 1); - uint16_t g_mix = (g_curr >> 1) + (g_prev >> 1) + (((g_curr & 0x1) + (g_prev & 0x1)) >> 1); - uint16_t b_mix = (b_curr >> 1) + (b_prev >> 1) + (((b_curr & 0x1) + (b_prev & 0x1)) >> 1); - - /* Convert back to RGB565 and assign - * to current frame */ - *(dst + x) = r_mix << 11 | g_mix << 6 | b_mix; + /* Mix colours + * > "Mixing Packed RGB Pixels Efficiently" + * http://blargg.8bitalley.com/info/rgb_mixing.html */ + *(dst + x) = (rgb_curr + rgb_prev + ((rgb_curr ^ rgb_prev) & 0x821)) >> 1; } src_curr += GBA_SCREEN_PITCH; @@ -321,25 +309,16 @@ static void video_post_process_cc_mix(void) uint16_t rgb_curr = *(src_curr + x); uint16_t rgb_prev = *(src_prev + x); - uint16_t r_curr = rgb_curr >> 11 & 0x1F; - uint16_t g_curr = rgb_curr >> 6 & 0x1F; - uint16_t b_curr = rgb_curr & 0x1F; - - uint16_t r_prev = rgb_prev >> 11 & 0x1F; - uint16_t g_prev = rgb_prev >> 6 & 0x1F; - uint16_t b_prev = rgb_prev & 0x1F; - /* Store colours for next frame */ *(src_prev + x) = rgb_curr; - /* Mix colours */ - uint16_t r_mix = (r_curr >> 1) + (r_prev >> 1) + (((r_curr & 0x1) + (r_prev & 0x1)) >> 1); - uint16_t g_mix = (g_curr >> 1) + (g_prev >> 1) + (((g_curr & 0x1) + (g_prev & 0x1)) >> 1); - uint16_t b_mix = (b_curr >> 1) + (b_prev >> 1) + (((b_curr & 0x1) + (b_prev & 0x1)) >> 1); + /* Mix colours + * > "Mixing Packed RGB Pixels Efficiently" + * http://blargg.8bitalley.com/info/rgb_mixing.html */ + uint16_t rgb_mix = (rgb_curr + rgb_prev + ((rgb_curr ^ rgb_prev) & 0x821)) >> 1; - /* Convert colour to RGB555, perform lookup - * and assign to current frame */ - *(dst + x) = *(gba_cc_lut + (r_mix << 10 | g_mix << 5 | b_mix)); + /* Convert colour to RGB555 and perform lookup */ + *(dst + x) = *(gba_cc_lut + (((rgb_mix & 0xFFC0) >> 1) | (rgb_mix & 0x1F))); } src_curr += GBA_SCREEN_PITCH; |