aboutsummaryrefslogtreecommitdiff
path: root/plugins/gpulib
diff options
context:
space:
mode:
authornotaz2012-04-29 19:18:49 +0300
committernotaz2012-04-29 19:32:08 +0300
commit4ea7de6a1495abfbc49c54fd2a90e902fdfa13d9 (patch)
treef062e83f543a583e75ca58e88511f79057464a93 /plugins/gpulib
parentb07c18e8645a17be916266820ae564e0d320cc1a (diff)
downloadpcsx_rearmed-4ea7de6a1495abfbc49c54fd2a90e902fdfa13d9.tar.gz
pcsx_rearmed-4ea7de6a1495abfbc49c54fd2a90e902fdfa13d9.tar.bz2
pcsx_rearmed-4ea7de6a1495abfbc49c54fd2a90e902fdfa13d9.zip
gpu plugins: always support 16bpp blit
use this for generic sdl and maemo
Diffstat (limited to 'plugins/gpulib')
-rw-r--r--plugins/gpulib/cspace.c28
-rw-r--r--plugins/gpulib/vout_pl.c31
2 files changed, 41 insertions, 18 deletions
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
{