From 4ea7de6a1495abfbc49c54fd2a90e902fdfa13d9 Mon Sep 17 00:00:00 2001 From: notaz Date: Sun, 29 Apr 2012 19:18:49 +0300 Subject: gpu plugins: always support 16bpp blit use this for generic sdl and maemo --- plugins/gpulib/cspace.c | 28 +++++++++++++++++++++++++--- plugins/gpulib/vout_pl.c | 31 ++++++++++++++++--------------- 2 files changed, 41 insertions(+), 18 deletions(-) (limited to 'plugins/gpulib') diff --git a/plugins/gpulib/cspace.c b/plugins/gpulib/cspace.c index eee56ce..408211f 100644 --- a/plugins/gpulib/cspace.c +++ b/plugins/gpulib/cspace.c @@ -1,9 +1,14 @@ #include "cspace.h" +/* + * note: these are intended for testing and should be avoided + * in favor of NEON version or platform-specific conversion + */ + void bgr555_to_rgb565(void *dst_, const void *src_, int bytes) { - unsigned int *src = (unsigned int *)src_; - unsigned int *dst = (unsigned int *)dst_; + const unsigned int *src = src_; + unsigned int *dst = dst_; unsigned int p; int x; @@ -15,7 +20,24 @@ void bgr555_to_rgb565(void *dst_, const void *src_, int bytes) } } +void bgr888_to_rgb565(void *dst_, const void *src_, int bytes) +{ + const unsigned char *src = src_; + unsigned int *dst = dst_; + unsigned int r1, g1, b1, r2, g2, b2; + + for (; bytes >= 6; bytes -= 6, src += 6, dst++) { + r1 = src[0] & 0xf8; + g1 = src[1] & 0xfc; + b1 = src[2] & 0xf8; + r2 = src[3] & 0xf8; + g2 = src[4] & 0xfc; + b2 = src[5] & 0xf8; + *dst = (r2 << 24) | (g2 << 19) | (b2 << 13) | + (r1 << 8) | (g1 << 3) | (b1 >> 3); + } +} + // TODO? void bgr888_to_rgb888(void *dst, const void *src, int bytes) {} -void bgr888_to_rgb565(void *dst, const void *src, int bytes) {} diff --git a/plugins/gpulib/vout_pl.c b/plugins/gpulib/vout_pl.c index 91de057..79b6c3e 100644 --- a/plugins/gpulib/vout_pl.c +++ b/plugins/gpulib/vout_pl.c @@ -36,8 +36,8 @@ static void check_mode_change(void) { old_status = gpu.status.reg; old_h = gpu.screen.h; - screen_buf = cbs->pl_vout_set_mode(gpu.screen.hres, - gpu.screen.h, gpu.status.rgb24 ? 24 : 16); + screen_buf = cbs->pl_vout_set_mode(gpu.screen.hres, gpu.screen.h, + (gpu.status.rgb24 && !cbs->only_16bpp) ? 24 : 16); } } @@ -60,21 +60,22 @@ static void blit(void) if (gpu.status.rgb24) { -#ifndef MAEMO - dest += (doffs / 8) * 24; - for (; h-- > 0; dest += stride * 3, fb_offs += 1024) - { - fb_offs &= 1024*512-1; - bgr888_to_rgb888(dest, vram + fb_offs, w * 3); + if (cbs->only_16bpp) { + dest += doffs * 2; + for (; h-- > 0; dest += stride * 2, fb_offs += 1024) + { + fb_offs &= 1024*512-1; + bgr888_to_rgb565(dest, vram + fb_offs, w * 3); + } } -#else - dest += doffs * 2; - for (; h-- > 0; dest += stride * 2, fb_offs += 1024) - { - fb_offs &= 1024*512-1; - bgr888_to_rgb565(dest, vram + fb_offs, w * 3); + else { + dest += (doffs / 8) * 24; + for (; h-- > 0; dest += stride * 3, fb_offs += 1024) + { + fb_offs &= 1024*512-1; + bgr888_to_rgb888(dest, vram + fb_offs, w * 3); + } } -#endif } else { -- cgit v1.2.3