From 0b02eb7712f1272fa7f38b0af41968b53af3b5a8 Mon Sep 17 00:00:00 2001 From: notaz Date: Mon, 13 Aug 2012 00:02:23 +0300 Subject: add support for software-enhanced rendering --- plugins/gpulib/vout_pl.c | 43 +++++++++++++++++++++++++++++++++---------- 1 file changed, 33 insertions(+), 10 deletions(-) (limited to 'plugins/gpulib/vout_pl.c') diff --git a/plugins/gpulib/vout_pl.c b/plugins/gpulib/vout_pl.c index 0bd1ecf..47c28f3 100644 --- a/plugins/gpulib/vout_pl.c +++ b/plugins/gpulib/vout_pl.c @@ -31,13 +31,25 @@ static void check_mode_change(void) { static uint32_t old_status; static int old_h; + int w = gpu.screen.hres; + int h = gpu.screen.h; + + gpu.state.enhancement_active = + gpu.enhancement_bufer != NULL && gpu.state.enhancement_enable + && w <= 512 && h <= 256 && !gpu.status.rgb24; + + if (gpu.state.enhancement_active) { + w *= 2; + h *= 2; + } // width|rgb24 change? - if ((gpu.status.reg ^ old_status) & ((7<<16)|(1<<21)) || gpu.screen.h != old_h) + if ((gpu.status.reg ^ old_status) & ((7<<16)|(1<<21)) || h != old_h) { old_status = gpu.status.reg; - old_h = gpu.screen.h; - screen_buf = cbs->pl_vout_set_mode(gpu.screen.hres, gpu.screen.h, + old_h = h; + + screen_buf = cbs->pl_vout_set_mode(w, h, (gpu.status.rgb24 && !cbs->only_16bpp) ? 24 : 16); } } @@ -50,6 +62,8 @@ static void blit(void) int h = gpu.screen.h; uint16_t *vram = gpu.vram; int stride = gpu.screen.hres; + int vram_stride = 1024; + int vram_mask = 1024 * 512 - 1; int fb_offs, doffs; uint8_t *dest; @@ -57,7 +71,16 @@ static void blit(void) if (dest == NULL) return; - fb_offs = y * 1024 + x; + if (gpu.state.enhancement_active) { + vram = gpu.enhancement_bufer; + x *= 2; + y *= 2; + w *= 2; + h *= 2; + stride *= 2; + vram_mask = 1024 * 1024 - 1; + } + fb_offs = y * vram_stride + x; // only do centering, at least for now doffs = (stride - w) / 2 & ~1; @@ -66,17 +89,17 @@ static void blit(void) { if (cbs->only_16bpp) { dest += doffs * 2; - for (; h-- > 0; dest += stride * 2, fb_offs += 1024) + for (; h-- > 0; dest += stride * 2, fb_offs += vram_stride) { - fb_offs &= 1024*512-1; + fb_offs &= vram_mask; bgr888_to_rgb565(dest, vram + fb_offs, w * 3); } } else { dest += (doffs / 8) * 24; - for (; h-- > 0; dest += stride * 3, fb_offs += 1024) + for (; h-- > 0; dest += stride * 3, fb_offs += vram_stride) { - fb_offs &= 1024*512-1; + fb_offs &= vram_mask; bgr888_to_rgb888(dest, vram + fb_offs, w * 3); } } @@ -84,9 +107,9 @@ static void blit(void) else { dest += doffs * 2; - for (; h-- > 0; dest += stride * 2, fb_offs += 1024) + for (; h-- > 0; dest += stride * 2, fb_offs += vram_stride) { - fb_offs &= 1024*512-1; + fb_offs &= vram_mask; bgr555_to_rgb565(dest, vram + fb_offs, w * 2); } } -- cgit v1.2.3 From f1359c5758c2e745b1cbec63e21445fa65f7cafe Mon Sep 17 00:00:00 2001 From: notaz Date: Mon, 13 Aug 2012 02:53:21 +0300 Subject: psx_gpu: switch enhancement to 2048 width otherwise games that position framebuffers horizontally corrupt the display. --- plugins/gpulib/vout_pl.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'plugins/gpulib/vout_pl.c') diff --git a/plugins/gpulib/vout_pl.c b/plugins/gpulib/vout_pl.c index 47c28f3..5131034 100644 --- a/plugins/gpulib/vout_pl.c +++ b/plugins/gpulib/vout_pl.c @@ -78,7 +78,8 @@ static void blit(void) w *= 2; h *= 2; stride *= 2; - vram_mask = 1024 * 1024 - 1; + vram_stride = 2048; + vram_mask = 2048 * 1024 - 1; } fb_offs = y * vram_stride + x; -- cgit v1.2.3 From e929dec505f8d3692248fe0d42c84a37c994ad39 Mon Sep 17 00:00:00 2001 From: notaz Date: Sat, 18 Aug 2012 02:37:49 +0300 Subject: psx_gpu: switch to 1024 width again. --- plugins/gpulib/vout_pl.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) (limited to 'plugins/gpulib/vout_pl.c') diff --git a/plugins/gpulib/vout_pl.c b/plugins/gpulib/vout_pl.c index 5131034..cbd8034 100644 --- a/plugins/gpulib/vout_pl.c +++ b/plugins/gpulib/vout_pl.c @@ -68,18 +68,19 @@ static void blit(void) uint8_t *dest; dest = (uint8_t *)screen_buf; - if (dest == NULL) + if (dest == NULL || w == 0 || stride == 0) return; if (gpu.state.enhancement_active) { - vram = gpu.enhancement_bufer; + // this layout is gpu_neon specific.. + vram = gpu.enhancement_bufer + + (x + 8) / stride * 1024 * 1024; x *= 2; y *= 2; w *= 2; h *= 2; stride *= 2; - vram_stride = 2048; - vram_mask = 2048 * 1024 - 1; + vram_mask = 1024 * 1024 - 1; } fb_offs = y * vram_stride + x; -- cgit v1.2.3 From 50f9355a2338111d940ed408f52fe1defe4df23e Mon Sep 17 00:00:00 2001 From: notaz Date: Sun, 19 Aug 2012 00:37:50 +0300 Subject: psx_gpu: start handling vram loads/moves for enhancement --- plugins/gpulib/vout_pl.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'plugins/gpulib/vout_pl.c') diff --git a/plugins/gpulib/vout_pl.c b/plugins/gpulib/vout_pl.c index cbd8034..5c74914 100644 --- a/plugins/gpulib/vout_pl.c +++ b/plugins/gpulib/vout_pl.c @@ -77,8 +77,8 @@ static void blit(void) (x + 8) / stride * 1024 * 1024; x *= 2; y *= 2; - w *= 2; - h *= 2; + w = (w - 2) * 2; + h = (h * 2) - 1; stride *= 2; vram_mask = 1024 * 1024 - 1; } -- cgit v1.2.3 From 06bc35c833797ce9f6f3287abf954f037bb12319 Mon Sep 17 00:00:00 2001 From: notaz Date: Mon, 27 Aug 2012 02:04:01 +0300 Subject: various enhancement tweaks --- plugins/gpulib/vout_pl.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'plugins/gpulib/vout_pl.c') diff --git a/plugins/gpulib/vout_pl.c b/plugins/gpulib/vout_pl.c index 5c74914..2116422 100644 --- a/plugins/gpulib/vout_pl.c +++ b/plugins/gpulib/vout_pl.c @@ -77,8 +77,8 @@ static void blit(void) (x + 8) / stride * 1024 * 1024; x *= 2; y *= 2; - w = (w - 2) * 2; - h = (h * 2) - 1; + w = w * 2; + h = h * 2; stride *= 2; vram_mask = 1024 * 1024 - 1; } @@ -130,6 +130,7 @@ void vout_update(void) void vout_blank(void) { + gpu.state.enhancement_active = 0; check_mode_change(); if (cbs->pl_vout_raw_flip == NULL) { int bytespp = gpu.status.rgb24 ? 3 : 2; -- cgit v1.2.3 From 7956599fa5f666016f71870d9889748c97839041 Mon Sep 17 00:00:00 2001 From: notaz Date: Mon, 22 Oct 2012 01:42:56 +0300 Subject: psx_gpu: select buffers differently this handles weird drawing areas better --- plugins/gpulib/vout_pl.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) (limited to 'plugins/gpulib/vout_pl.c') diff --git a/plugins/gpulib/vout_pl.c b/plugins/gpulib/vout_pl.c index 2116422..6e2764c 100644 --- a/plugins/gpulib/vout_pl.c +++ b/plugins/gpulib/vout_pl.c @@ -130,11 +130,15 @@ void vout_update(void) void vout_blank(void) { - gpu.state.enhancement_active = 0; - check_mode_change(); if (cbs->pl_vout_raw_flip == NULL) { + int w = gpu.screen.hres; + int h = gpu.screen.h; int bytespp = gpu.status.rgb24 ? 3 : 2; - memset(screen_buf, 0, gpu.screen.hres * gpu.screen.h * bytespp); + if (gpu.state.enhancement_active) { + w *= 2; + h *= 2; + } + memset(screen_buf, 0, w * h * bytespp); screen_buf = cbs->pl_vout_flip(); } } -- cgit v1.2.3 From a8be0debff95f9b56af7c4c19eaacee782a09e28 Mon Sep 17 00:00:00 2001 From: notaz Date: Tue, 23 Oct 2012 00:34:30 +0300 Subject: gpu: move enhacement logic out of vout_pl --- plugins/gpulib/vout_pl.c | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) (limited to 'plugins/gpulib/vout_pl.c') diff --git a/plugins/gpulib/vout_pl.c b/plugins/gpulib/vout_pl.c index 6e2764c..9a84432 100644 --- a/plugins/gpulib/vout_pl.c +++ b/plugins/gpulib/vout_pl.c @@ -35,7 +35,7 @@ static void check_mode_change(void) int h = gpu.screen.h; gpu.state.enhancement_active = - gpu.enhancement_bufer != NULL && gpu.state.enhancement_enable + gpu.get_enhancement_bufer != NULL && gpu.state.enhancement_enable && w <= 512 && h <= 256 && !gpu.status.rgb24; if (gpu.state.enhancement_active) { @@ -71,17 +71,9 @@ static void blit(void) if (dest == NULL || w == 0 || stride == 0) return; - if (gpu.state.enhancement_active) { - // this layout is gpu_neon specific.. - vram = gpu.enhancement_bufer + - (x + 8) / stride * 1024 * 1024; - x *= 2; - y *= 2; - w = w * 2; - h = h * 2; - stride *= 2; - vram_mask = 1024 * 1024 - 1; - } + if (gpu.state.enhancement_active) + vram = gpu.get_enhancement_bufer(&x, &y, &w, &h, &stride, &vram_mask); + fb_offs = y * vram_stride + x; // only do centering, at least for now -- cgit v1.2.3 From fa56d36096cd4ab2b227ce2aa61c8404b8874689 Mon Sep 17 00:00:00 2001 From: notaz Date: Mon, 29 Oct 2012 01:08:35 +0200 Subject: move blit to core, allow filtering while blitting also adds libpicofe to pull filters from, and filter related UI stuff --- plugins/gpulib/vout_pl.c | 91 ++++++++++++++---------------------------------- 1 file changed, 26 insertions(+), 65 deletions(-) (limited to 'plugins/gpulib/vout_pl.c') diff --git a/plugins/gpulib/vout_pl.c b/plugins/gpulib/vout_pl.c index 9a84432..11307e2 100644 --- a/plugins/gpulib/vout_pl.c +++ b/plugins/gpulib/vout_pl.c @@ -15,7 +15,6 @@ #include "../../frontend/plugin_lib.h" static const struct rearmed_cbs *cbs; -static void *screen_buf; int vout_init(void) { @@ -27,7 +26,7 @@ int vout_finish(void) return 0; } -static void check_mode_change(void) +static void check_mode_change(int force) { static uint32_t old_status; static int old_h; @@ -44,95 +43,57 @@ static void check_mode_change(void) } // width|rgb24 change? - if ((gpu.status.reg ^ old_status) & ((7<<16)|(1<<21)) || h != old_h) + if (force || (gpu.status.reg ^ old_status) & ((7<<16)|(1<<21)) || h != old_h) { old_status = gpu.status.reg; old_h = h; - screen_buf = cbs->pl_vout_set_mode(w, h, + cbs->pl_vout_set_mode(w, h, (gpu.status.rgb24 && !cbs->only_16bpp) ? 24 : 16); } } -static void blit(void) +void vout_update(void) { int x = gpu.screen.x & ~1; // alignment needed by blitter int y = gpu.screen.y; int w = gpu.screen.w; int h = gpu.screen.h; uint16_t *vram = gpu.vram; - int stride = gpu.screen.hres; - int vram_stride = 1024; - int vram_mask = 1024 * 512 - 1; - int fb_offs, doffs; - uint8_t *dest; - - dest = (uint8_t *)screen_buf; - if (dest == NULL || w == 0 || stride == 0) + int vram_h = 512; + + if (w == 0 || h == 0) return; + check_mode_change(0); if (gpu.state.enhancement_active) - vram = gpu.get_enhancement_bufer(&x, &y, &w, &h, &stride, &vram_mask); - - fb_offs = y * vram_stride + x; + vram = gpu.get_enhancement_bufer(&x, &y, &w, &h, &vram_h); - // only do centering, at least for now - doffs = (stride - w) / 2 & ~1; - - if (gpu.status.rgb24) - { - if (cbs->only_16bpp) { - dest += doffs * 2; - for (; h-- > 0; dest += stride * 2, fb_offs += vram_stride) - { - fb_offs &= vram_mask; - bgr888_to_rgb565(dest, vram + fb_offs, w * 3); - } - } - else { - dest += (doffs / 8) * 24; - for (; h-- > 0; dest += stride * 3, fb_offs += vram_stride) - { - fb_offs &= vram_mask; - bgr888_to_rgb888(dest, vram + fb_offs, w * 3); - } - } - } - else - { - dest += doffs * 2; - for (; h-- > 0; dest += stride * 2, fb_offs += vram_stride) - { - fb_offs &= vram_mask; - bgr555_to_rgb565(dest, vram + fb_offs, w * 2); + if (y + h > vram_h) { + if (y + h - vram_h > h / 2) { + // wrap + y = 0; + h -= vram_h - y; } + else + // clip + h = vram_h - y; } - screen_buf = cbs->pl_vout_flip(); -} + vram += y * 1024 + x; -void vout_update(void) -{ - check_mode_change(); - if (cbs->pl_vout_raw_flip) - cbs->pl_vout_raw_flip(gpu.screen.x, gpu.screen.y); - else - blit(); + cbs->pl_vout_flip(vram, 1024, gpu.status.rgb24, w, h); } void vout_blank(void) { - if (cbs->pl_vout_raw_flip == NULL) { - int w = gpu.screen.hres; - int h = gpu.screen.h; - int bytespp = gpu.status.rgb24 ? 3 : 2; - if (gpu.state.enhancement_active) { - w *= 2; - h *= 2; - } - memset(screen_buf, 0, w * h * bytespp); - screen_buf = cbs->pl_vout_flip(); + int w = gpu.screen.hres; + int h = gpu.screen.h; + if (gpu.state.enhancement_active) { + w *= 2; + h *= 2; } + cbs->pl_vout_flip(NULL, 1024, gpu.status.rgb24, w, h); } long GPUopen(void **unused) @@ -141,7 +102,7 @@ long GPUopen(void **unused) gpu.frameskip.frame_ready = 1; cbs->pl_vout_open(); - screen_buf = cbs->pl_vout_flip(); + check_mode_change(1); return 0; } -- cgit v1.2.3 From c65553d0cafc353daad3fdcc0aab63bb8427a809 Mon Sep 17 00:00:00 2001 From: notaz Date: Tue, 13 Nov 2012 02:28:41 +0200 Subject: fix some random corner cases --- plugins/gpulib/vout_pl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'plugins/gpulib/vout_pl.c') diff --git a/plugins/gpulib/vout_pl.c b/plugins/gpulib/vout_pl.c index 11307e2..7b229db 100644 --- a/plugins/gpulib/vout_pl.c +++ b/plugins/gpulib/vout_pl.c @@ -72,8 +72,8 @@ void vout_update(void) if (y + h > vram_h) { if (y + h - vram_h > h / 2) { // wrap - y = 0; h -= vram_h - y; + y = 0; } else // clip -- cgit v1.2.3 From e4c83ca67cf7ad13db3995909605ce01ff915824 Mon Sep 17 00:00:00 2001 From: notaz Date: Tue, 13 Nov 2012 19:19:36 +0200 Subject: fix gun handling in enhancement mode --- plugins/gpulib/vout_pl.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) (limited to 'plugins/gpulib/vout_pl.c') diff --git a/plugins/gpulib/vout_pl.c b/plugins/gpulib/vout_pl.c index 7b229db..a49371a 100644 --- a/plugins/gpulib/vout_pl.c +++ b/plugins/gpulib/vout_pl.c @@ -32,14 +32,16 @@ static void check_mode_change(int force) static int old_h; int w = gpu.screen.hres; int h = gpu.screen.h; + int w_out = w; + int h_out = h; gpu.state.enhancement_active = gpu.get_enhancement_bufer != NULL && gpu.state.enhancement_enable && w <= 512 && h <= 256 && !gpu.status.rgb24; if (gpu.state.enhancement_active) { - w *= 2; - h *= 2; + w_out *= 2; + h_out *= 2; } // width|rgb24 change? @@ -48,7 +50,7 @@ static void check_mode_change(int force) old_status = gpu.status.reg; old_h = h; - cbs->pl_vout_set_mode(w, h, + cbs->pl_vout_set_mode(w_out, h_out, w, h, (gpu.status.rgb24 && !cbs->only_16bpp) ? 24 : 16); } } -- cgit v1.2.3 From f5cc003a66b845bdedae42d323b93ea816cfacdc Mon Sep 17 00:00:00 2001 From: notaz Date: Fri, 23 Nov 2012 11:44:54 +0200 Subject: gpulib: check mode change on blank --- plugins/gpulib/vout_pl.c | 1 + 1 file changed, 1 insertion(+) (limited to 'plugins/gpulib/vout_pl.c') diff --git a/plugins/gpulib/vout_pl.c b/plugins/gpulib/vout_pl.c index a49371a..49f53d6 100644 --- a/plugins/gpulib/vout_pl.c +++ b/plugins/gpulib/vout_pl.c @@ -95,6 +95,7 @@ void vout_blank(void) w *= 2; h *= 2; } + check_mode_change(0); cbs->pl_vout_flip(NULL, 1024, gpu.status.rgb24, w, h); } -- cgit v1.2.3