aboutsummaryrefslogtreecommitdiff
path: root/plugins/gpulib
diff options
context:
space:
mode:
authornotaz2012-10-29 01:08:35 +0200
committernotaz2012-11-02 03:03:39 +0200
commitfa56d36096cd4ab2b227ce2aa61c8404b8874689 (patch)
tree21fafd8723022995c1ec9e00914cd1478a3d0476 /plugins/gpulib
parentb7569147823a8fc5a9de98e5d491da906e119296 (diff)
downloadpcsx_rearmed-fa56d36096cd4ab2b227ce2aa61c8404b8874689.tar.gz
pcsx_rearmed-fa56d36096cd4ab2b227ce2aa61c8404b8874689.tar.bz2
pcsx_rearmed-fa56d36096cd4ab2b227ce2aa61c8404b8874689.zip
move blit to core, allow filtering while blitting
also adds libpicofe to pull filters from, and filter related UI stuff
Diffstat (limited to 'plugins/gpulib')
-rw-r--r--plugins/gpulib/gpu.h2
-rw-r--r--plugins/gpulib/vout_pl.c91
2 files changed, 27 insertions, 66 deletions
diff --git a/plugins/gpulib/gpu.h b/plugins/gpulib/gpu.h
index ea5051e..d11f991 100644
--- a/plugins/gpulib/gpu.h
+++ b/plugins/gpulib/gpu.h
@@ -89,7 +89,7 @@ struct psx_gpu {
uint32_t pending_fill[3];
} frameskip;
uint16_t *(*get_enhancement_bufer)
- (int *x, int *y, int *w, int *h, int *stride, int *mask);
+ (int *x, int *y, int *w, int *h, int *vram_h);
void *(*mmap)(unsigned int size);
void (*munmap)(void *ptr, unsigned int size);
};
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;
}