gpulib: pass gpu to vout funcs
authornotaz <notasas@gmail.com>
Tue, 27 Jan 2026 01:22:02 +0000 (03:22 +0200)
committernotaz <notasas@gmail.com>
Tue, 27 Jan 2026 14:09:48 +0000 (16:09 +0200)
plugins/gpulib/gpu.c
plugins/gpulib/gpu.h
plugins/gpulib/vout_pl.c

index 49de055..3285c6c 100644 (file)
@@ -1105,7 +1105,7 @@ void GPUupdateLace(void)
 #ifndef RAW_FB_DISPLAY
   if (gpu.status & PSX_GPU_STATUS_BLANKING) {
     if (!gpu.state.blanked) {
-      vout_blank();
+      vout_blank(&gpu);
       gpu.state.blanked = 1;
       gpu.state.fb_dirty_display_area = 1;
     }
@@ -1127,7 +1127,7 @@ void GPUupdateLace(void)
   else
     renderer_flush_queues();
 
-  updated = vout_update();
+  updated = vout_update(&gpu, gpu.screen.src_x, gpu.screen.src_y);
   if (gpu.state.enhancement_active && !gpu.state.enhancement_was_active) {
     gpu_async_sync(&gpu);
     renderer_update_caches(0, 0, 1024, 512, 1);
index a3d73da..66d2e39 100644 (file)
@@ -153,8 +153,8 @@ void renderer_notify_screen_change(const struct psx_gpu_screen *screen);
 
 int  vout_init(void);
 int  vout_finish(void);
-int  vout_update(void);
-void vout_blank(void);
+int  vout_update(struct psx_gpu *gpu, int src_x, int src_y);
+void vout_blank(struct psx_gpu *gpu);
 void vout_set_config(const struct rearmed_cbs *config);
 
 // helpers
index 1baf943..90c44cb 100644 (file)
@@ -25,56 +25,54 @@ int vout_finish(void)
   return 0;
 }
 
-static void check_mode_change(int force)
+static void check_mode_change(struct psx_gpu *gpu, int force)
 {
-  int w = gpu.screen.hres;
-  int h = gpu.screen.vres;
+  int w = gpu->screen.hres;
+  int h = gpu->screen.vres;
   int w_out, h_out, bpp = 16;
 
-  if (gpu.state.screen_centering_type == C_BORDERLESS)
-    h = gpu.screen.h;
+  if (gpu->state.screen_centering_type == C_BORDERLESS)
+    h = gpu->screen.h;
   w_out = w, h_out = h;
 #ifdef RAW_FB_DISPLAY
   w = w_out = (gpu.status & PSX_GPU_STATUS_RGB24) ? 2048/3 : 1024;
   h = h_out = 512;
 #endif
-  gpu.state.enhancement_active =
-    gpu.get_enhancement_bufer != NULL && gpu.state.enhancement_enable
-    && w <= 512 && h <= 256 && !(gpu.status & PSX_GPU_STATUS_RGB24);
+  gpu->state.enhancement_active =
+    gpu->get_enhancement_bufer != NULL && gpu->state.enhancement_enable
+    && w <= 512 && h <= 256 && !(gpu->status & PSX_GPU_STATUS_RGB24);
 
-  if (gpu.state.enhancement_active) {
+  if (gpu->state.enhancement_active) {
     w_out *= 2;
     h_out *= 2;
   }
-  if (gpu.status & PSX_GPU_STATUS_RGB24) {
+  if (gpu->status & PSX_GPU_STATUS_RGB24) {
     // some asm relies on this alignment
     w_out = (w_out + 7) & ~7;
     bpp = 24;
   }
 
   // width|rgb24 change?
-  if (force || (gpu.status ^ gpu.state.status_vo_old) & ((7<<16)|(1<<21))
-      || w_out != gpu.state.w_out_old || h_out != gpu.state.h_out_old)
+  if (force || (gpu->status ^ gpu->state.status_vo_old) & ((7<<16)|(1<<21))
+      || w_out != gpu->state.w_out_old || h_out != gpu->state.h_out_old)
   {
-    gpu.state.status_vo_old = gpu.status;
-    gpu.state.w_out_old = w_out;
-    gpu.state.h_out_old = h_out;
+    gpu->state.status_vo_old = gpu->status;
+    gpu->state.w_out_old = w_out;
+    gpu->state.h_out_old = h_out;
 
     if (w_out != 0 && h_out != 0)
       cbs->pl_vout_set_mode(w_out, h_out, w, h, bpp);
   }
 }
 
-int vout_update(void)
+int vout_update(struct psx_gpu *gpu, int src_x, int src_y)
 {
-  int bpp = (gpu.status & PSX_GPU_STATUS_RGB24) ? 24 : 16;
-  uint8_t *vram = (uint8_t *)gpu.vram;
-  int src_x = gpu.screen.src_x;
-  int src_y = gpu.screen.src_y;
-  int x = gpu.screen.x;
-  int y = gpu.screen.y;
-  int w = gpu.screen.w;
-  int h = gpu.screen.h;
+  int bpp = (gpu->status & PSX_GPU_STATUS_RGB24) ? 24 : 16;
+  uint8_t *vram = (uint8_t *)gpu->vram;
+  int x = gpu->screen.x;
+  int y = gpu->screen.y;
+  int w = gpu->screen.w;
+  int h = gpu->screen.h;
   int vram_h = 512;
   int src_x2 = 0;
   int offset;
@@ -89,11 +87,11 @@ int vout_update(void)
   if (w <= 0 || h <= 0)
     return 0;
 
-  check_mode_change(0);
-  if (gpu.state.enhancement_active) {
-    if (!gpu.state.enhancement_was_active)
+  check_mode_change(gpu, 0);
+  if (gpu->state.enhancement_active) {
+    if (!gpu->state.enhancement_was_active)
       return 0; // buffer not ready yet
-    vram = gpu.get_enhancement_bufer(&src_x, &src_y, &w, &h, &vram_h);
+    vram = gpu->get_enhancement_bufer(&src_x, &src_y, &w, &h, &vram_h);
     if (vram == NULL)
       return 0;
     x *= 2; y *= 2;
@@ -112,29 +110,29 @@ int vout_update(void)
   }
 
   // gpu_unai skips drawing odd lines
-  if (h > 256 && gpu.state.downscale_enable && (src_y & 1))
+  if (h > 256 && gpu->state.downscale_enable && (src_y & 1))
     src_y++;
 
   offset = (src_y * 1024 + src_x) * 2;
   offset += src_x2 * bpp / 8;
 
-  cbs->pl_vout_flip(vram, offset, !!(gpu.status & PSX_GPU_STATUS_RGB24),
-      x, y, w, h, gpu.state.dims_changed);
-  gpu.state.dims_changed = 0;
+  cbs->pl_vout_flip(vram, offset, !!(gpu->status & PSX_GPU_STATUS_RGB24),
+      x, y, w, h, gpu->state.dims_changed);
+  gpu->state.dims_changed = 0;
   return 1;
 }
 
-void vout_blank(void)
+void vout_blank(struct psx_gpu *gpu)
 {
-  int w = gpu.screen.hres;
-  int h = gpu.screen.vres;
+  int w = gpu->screen.hres;
+  int h = gpu->screen.vres;
 
-  check_mode_change(0);
-  if (gpu.state.enhancement_active) {
+  check_mode_change(gpu, 0);
+  if (gpu->state.enhancement_active) {
     w *= 2;
     h *= 2;
   }
-  cbs->pl_vout_flip(NULL, 0, !!(gpu.status & PSX_GPU_STATUS_RGB24), 0, 0, w, h, 0);
+  cbs->pl_vout_flip(NULL, 0, !!(gpu->status & PSX_GPU_STATUS_RGB24), 0, 0, w, h, 0);
 }
 
 long GPUopen(unsigned long *disp, char *cap, char *cfg)
@@ -143,8 +141,8 @@ long GPUopen(unsigned long *disp, char *cap, char *cfg)
   gpu.frameskip.frame_ready = 1;
 
   cbs->pl_vout_open();
-  check_mode_change(1);
-  vout_update();
+  check_mode_change(&gpu, 1);
+  vout_update(&gpu, gpu.screen.src_x, gpu.screen.src_y);
   return 0;
 }