add some plugin control from the menu, include spunull
[pcsx_rearmed.git] / frontend / plugin_lib.c
index e2a0d58..0ca45ce 100644 (file)
 #include <stdlib.h>
 #include <string.h>
 #include <stdarg.h>
+#include <sys/time.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
 
+#include "plugin_lib.h"
 #include "linux/fbdev.h"
 #include "common/fonts.h"
 #include "common/input.h"
 #include "omap.h"
+#include "menu.h"
+#include "pcnt.h"
 #include "../libpcsxcore/new_dynarec/new_dynarec.h"
 
 void *pl_fbdev_buf;
 int keystate;
-static int pl_fbdev_w;
+static int pl_fbdev_w, pl_fbdev_h, pl_fbdev_bpp;
+static int flip_cnt, flips_per_sec, tick_per_sec;
+extern float fps_cur; // XXX
 
-int pl_fbdev_init(void)
+static int get_cpu_ticks(void)
 {
-       pl_fbdev_buf = vout_fbdev_flip(layer_fb);
-       return 0;
+       static unsigned long last_utime;
+       static int fd;
+       unsigned long utime, ret;
+       char buf[128];
+
+       if (fd == 0)
+               fd = open("/proc/self/stat", O_RDONLY);
+       lseek(fd, 0, SEEK_SET);
+       buf[0] = 0;
+       read(fd, buf, sizeof(buf));
+       buf[sizeof(buf) - 1] = 0;
+
+       sscanf(buf, "%*d %*s %*c %*d %*d %*d %*d %*d %*u %*u %*u %*u %*u %lu", &utime);
+       ret = utime - last_utime;
+       last_utime = utime;
+       return ret;
+}
+
+static void print_fps(void)
+{
+       if (pl_fbdev_bpp == 16)
+               pl_text_out16(2, pl_fbdev_h - 10, "%2d %4.1f", flips_per_sec, fps_cur);
+}
+
+static void print_cpu_usage(void)
+{
+       if (pl_fbdev_bpp == 16)
+               pl_text_out16(pl_fbdev_w - 28, pl_fbdev_h - 10, "%3d", tick_per_sec);
 }
 
 int pl_fbdev_set_mode(int w, int h, int bpp)
 {
-       int ret;
+       void *ret;
+
+       if (w == pl_fbdev_w && h == pl_fbdev_h && bpp == pl_fbdev_bpp)
+               return 0;
 
        pl_fbdev_w = w;
-       printf("set mode %dx%d@%d\n", w, h, bpp);
+       pl_fbdev_h = h;
+       pl_fbdev_bpp = bpp;
+
+       vout_fbdev_clear(layer_fb);
        ret = vout_fbdev_resize(layer_fb, w, h, bpp, 0, 0, 0, 0, 3);
-       if (ret)
+       if (ret == NULL)
                fprintf(stderr, "failed to set mode\n");
-       return ret;
+       else
+               pl_fbdev_buf = ret;
+
+       menu_notify_mode_change(w, h, bpp);
+
+       return (ret != NULL) ? 0 : -1;
 }
 
-void *pl_fbdev_flip(void)
+void pl_fbdev_flip(void)
+{
+       flip_cnt++;
+       if (g_opts & OPT_SHOWFPS)
+               print_fps();
+       if (g_opts & OPT_SHOWCPU)
+               print_cpu_usage();
+
+       // let's flip now
+       pl_fbdev_buf = vout_fbdev_flip(layer_fb);
+}
+
+int pl_fbdev_open(void)
+{
+       pl_fbdev_buf = vout_fbdev_flip(layer_fb);
+       omap_enable_layer(1);
+       return 0;
+}
+
+void pl_fbdev_close(void)
+{
+       omap_enable_layer(0);
+}
+
+static void update_input(void)
 {
-       /* doing input here because the pad is polled
-        * thousands of times for some reason */
        int actions[IN_BINDTYPE_COUNT] = { 0, };
 
        in_update(actions);
        if (actions[IN_BINDTYPE_EMU] & PEV_MENU)
                stop = 1;
        keystate = actions[IN_BINDTYPE_PLAYER12];
-
-       // let's flip now
-       pl_fbdev_buf = vout_fbdev_flip(layer_fb);
-       return pl_fbdev_buf;
 }
 
-void pl_fbdev_finish(void)
+/* called on every vsync */
+void pl_frame_limit(void)
 {
+       extern void CheckFrameRate(void);
+       static int oldsec;
+       struct timeval tv;
+
+       /* doing input here because the pad is polled
+        * thousands of times per frame for some reason */
+       update_input();
+
+       pcnt_end(PCNT_ALL);
+       gettimeofday(&tv, 0);
+
+       if (tv.tv_sec != oldsec) {
+               flips_per_sec = flip_cnt;
+               flip_cnt = 0;
+               oldsec = tv.tv_sec;
+               if (g_opts & OPT_SHOWCPU)
+                       tick_per_sec = get_cpu_ticks();
+       }
+#ifdef PCNT
+       static int ya_vsync_count;
+       if (++ya_vsync_count == PCNT_FRAMES) {
+               pcnt_print(fps_cur);
+               ya_vsync_count = 0;
+       }
+#endif
+
+       CheckFrameRate();
+
+       pcnt_start(PCNT_ALL);
 }
 
 static void pl_text_out16_(int x, int y, const char *text)