From: notaz Date: Thu, 11 Aug 2011 15:26:28 +0000 (+0300) Subject: frontend: refactor plugin_lib for maemo X-Git-Tag: r9~18 X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=76f7048eff4f5357df048268e40b5bc6b9387fe5;p=pcsx_rearmed.git frontend: refactor plugin_lib for maemo should give them proper frame limiter, frameskip and also lightgun support, maybe. --- diff --git a/Makefile b/Makefile index b95f7f21..7e3d0973 100644 --- a/Makefile +++ b/Makefile @@ -92,14 +92,16 @@ OBJS += plugins/dfinput/main.o plugins/dfinput/pad.o plugins/dfinput/guncon.o # gui OBJS += frontend/main.o frontend/plugin.o +OBJS += frontend/plugin_lib.o frontend/common/readpng.o +OBJS += frontend/common/fonts.o frontend/linux/plat.o ifeq "$(USE_GTK)" "1" OBJS += maemo/hildon.o maemo/main.o maemo/%.o: maemo/%.c else -OBJS += frontend/plugin_lib.o frontend/menu.o +frontend/%.o: CFLAGS += -DVOUT_FBDEV +OBJS += frontend/menu.o OBJS += frontend/linux/fbdev.o frontend/linux/in_evdev.o -OBJS += frontend/linux/plat.o frontend/linux/oshide.o -OBJS += frontend/common/fonts.o frontend/common/input.o frontend/common/readpng.o +OBJS += frontend/common/input.o frontend/linux/oshide.o ifeq "$(ARCH)" "arm" OBJS += frontend/plat_omap.o OBJS += frontend/pandora.o diff --git a/frontend/menu.c b/frontend/menu.c index 8b51c061..f07c7375 100644 --- a/frontend/menu.c +++ b/frontend/menu.c @@ -158,13 +158,8 @@ static void menu_sync_config(void) allow_abs_only_old = in_evdev_allow_abs_only; } - pl_frame_interval = Config.PsxType ? 20000 : 16667; - // used by P.E.Op.S. frameskip code - pl_rearmed_cbs.gpu_peops.fFrameRateHz = Config.PsxType ? 50.0f : 59.94f; - pl_rearmed_cbs.gpu_peops.dwFrameRateTicks = - (100000*100 / (unsigned long)(pl_rearmed_cbs.gpu_peops.fFrameRateHz*100)); - iVolume = 768 + 128 * volume_boost; + pl_timing_prepare(Config.PsxType); } static void menu_set_defconfig(void) @@ -1494,7 +1489,7 @@ static int reset_game(void) static int reload_plugins(const char *cdimg) { - pl_fbdev_buf = NULL; + pl_vout_buf = NULL; ClosePlugins(); @@ -1958,13 +1953,13 @@ static void menu_leave_emu(void) } memcpy(g_menubg_ptr, g_menubg_src_ptr, g_menuscreen_w * g_menuscreen_h * 2); - if (pl_fbdev_buf != NULL && ready_to_go && last_psx_bpp == 16) { + if (pl_vout_buf != NULL && ready_to_go && last_psx_bpp == 16) { int x = max(0, g_menuscreen_w - last_psx_w); int y = max(0, g_menuscreen_h / 2 - last_psx_h / 2); int w = min(g_menuscreen_w, last_psx_w); int h = min(g_menuscreen_h, last_psx_h); u16 *d = (u16 *)g_menubg_ptr + g_menuscreen_w * y + x; - u16 *s = pl_fbdev_buf; + u16 *s = pl_vout_buf; for (; h > 0; h--, d += g_menuscreen_w, s += last_psx_w) menu_darken_bg(d, s, w, 0); diff --git a/frontend/plugin_lib.c b/frontend/plugin_lib.c index bde4f9c1..da25c6e1 100644 --- a/frontend/plugin_lib.c +++ b/frontend/plugin_lib.c @@ -29,16 +29,15 @@ #include "../libpcsxcore/new_dynarec/new_dynarec.h" #include "../libpcsxcore/psemu_plugin_defs.h" -void *pl_fbdev_buf; -int pl_frame_interval; int in_type1, in_type2; int in_a1[2] = { 127, 127 }, in_a2[2] = { 127, 127 }; int in_keystate, in_state_gun; static void *ts; -static int pl_fbdev_w, pl_fbdev_h, pl_fbdev_bpp; +void *pl_vout_buf; +static int pl_vout_w, pl_vout_h, pl_vout_bpp; static int flip_cnt, vsync_cnt, flips_per_sec, tick_per_sec; static float vsps_cur; -static int vsync_usec_time; +static int frame_interval, frame_interval1024, vsync_usec_time; static __attribute__((noinline)) int get_cpu_ticks(void) @@ -63,20 +62,20 @@ static __attribute__((noinline)) int get_cpu_ticks(void) static void print_hud(void) { - if (pl_fbdev_bpp == 16) - pl_text_out16(2, pl_fbdev_h - 10, "%s", hud_msg); + if (pl_vout_bpp == 16) + pl_text_out16(2, pl_vout_h - 10, "%s", hud_msg); } static void print_fps(void) { - if (pl_fbdev_bpp == 16) - pl_text_out16(2, pl_fbdev_h - 10, "%2d %4.1f", flips_per_sec, vsps_cur); + if (pl_vout_bpp == 16) + pl_text_out16(2, pl_vout_h - 10, "%2d %4.1f", flips_per_sec, vsps_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); + if (pl_vout_bpp == 16) + pl_text_out16(pl_vout_w - 28, pl_vout_h - 10, "%3d", tick_per_sec); } // draw 192x8 status of 24 sound channels @@ -86,12 +85,12 @@ static __attribute__((noinline)) void draw_active_chans(void) int live_chans, fmod_chans, noise_chans; static const unsigned short colors[2] = { 0x1fe3, 0x0700 }; - unsigned short *dest = (unsigned short *)pl_fbdev_buf + - pl_fbdev_w * (pl_fbdev_h - 10) + pl_fbdev_w / 2 - 192/2; + unsigned short *dest = (unsigned short *)pl_vout_buf + + pl_vout_w * (pl_vout_h - 10) + pl_vout_w / 2 - 192/2; unsigned short *d, p; int c, x, y; - if (pl_fbdev_bpp != 16) + if (pl_vout_bpp != 16) return; spu_get_debug_info(&live_chans, &fmod_chans, &noise_chans); @@ -102,40 +101,41 @@ static __attribute__((noinline)) void draw_active_chans(void) (fmod_chans & (1<= pl_frame_interval) - vsync_usec_time -= pl_frame_interval; + while (vsync_usec_time >= frame_interval) + vsync_usec_time -= frame_interval; return 0; } -void pl_fbdev_close(void) +static void pl_vout_close(void) { omap_enable_layer(0); } void *pl_prepare_screenshot(int *w, int *h, int *bpp) { - *w = pl_fbdev_w; - *h = pl_fbdev_h; - *bpp = pl_fbdev_bpp; + *w = pl_vout_w; + *h = pl_vout_h; + *bpp = pl_vout_bpp; - return pl_fbdev_buf; + return pl_vout_buf; } static void update_input(void) { +#ifndef MAEMO int actions[IN_BINDTYPE_COUNT] = { 0, }; unsigned int emu_act; @@ -205,7 +217,7 @@ static void update_input(void) emu_set_action(emu_act); in_keystate = actions[IN_BINDTYPE_PLAYER12]; - +#endif #ifdef X11 extern int x11_update_keys(unsigned int *action); in_keystate |= x11_update_keys(&emu_act); @@ -218,22 +230,14 @@ void pl_update_gun(int *xn, int *xres, int *y, int *in) if (ts) pl_gun_ts_update(ts, xn, y, in); - *xres = pl_fbdev_w; - *y = *y * pl_fbdev_h >> 10; + *xres = pl_vout_w; + *y = *y * pl_vout_h >> 10; } #define MAX_LAG_FRAMES 3 #define tvdiff(tv, tv_old) \ ((tv.tv_sec - tv_old.tv_sec) * 1000000 + tv.tv_usec - tv_old.tv_usec) -// assumes us < 1000000 -#define tvadd(tv, us) { \ - tv.tv_usec += us; \ - if (tv.tv_usec >= 1000000) { \ - tv.tv_usec -= 1000000; \ - tv.tv_sec++; \ - } \ -} /* called on every vsync */ void pl_frame_limit(void) @@ -278,27 +282,33 @@ void pl_frame_limit(void) } #endif - tvadd(tv_expect, pl_frame_interval); - diff = tvdiff(tv_expect, now); - if (diff > MAX_LAG_FRAMES * pl_frame_interval || diff < -MAX_LAG_FRAMES * pl_frame_interval) { - //printf("pl_frame_limit reset, diff=%d, iv %d\n", diff, pl_frame_interval); + // tv_expect uses usec*1024 units instead of usecs for better accuracy + tv_expect.tv_usec += frame_interval1024; + if (tv_expect.tv_usec >= (1000000 << 10)) { + tv_expect.tv_usec -= (1000000 << 10); + tv_expect.tv_sec++; + } + diff = (tv_expect.tv_sec - now.tv_sec) * 1000000 + (tv_expect.tv_usec >> 10) - now.tv_usec; + + if (diff > MAX_LAG_FRAMES * frame_interval || diff < -MAX_LAG_FRAMES * frame_interval) { + //printf("pl_frame_limit reset, diff=%d, iv %d\n", diff, frame_interval); tv_expect = now; diff = 0; // try to align with vsync usadj = vsync_usec_time; - while (usadj < tv_expect.tv_usec - pl_frame_interval) - usadj += pl_frame_interval; - tv_expect.tv_usec = usadj; + while (usadj < tv_expect.tv_usec - frame_interval) + usadj += frame_interval; + tv_expect.tv_usec = usadj << 10; } - if (!(g_opts & OPT_NO_FRAMELIM) && diff > pl_frame_interval) { + if (!(g_opts & OPT_NO_FRAMELIM) && diff > frame_interval) { // yay for working usleep on pandora! - //printf("usleep %d\n", diff - pl_frame_interval / 2); - usleep(diff - pl_frame_interval / 2); + //printf("usleep %d\n", diff - frame_interval / 2); + usleep(diff - frame_interval / 2); } if (pl_rearmed_cbs.frameskip) { - if (diff < -pl_frame_interval) + if (diff < -frame_interval) pl_rearmed_cbs.fskip_advice = 1; else if (diff >= 0) pl_rearmed_cbs.fskip_advice = 0; @@ -307,10 +317,23 @@ void pl_frame_limit(void) pcnt_start(PCNT_ALL); } +void pl_timing_prepare(int is_pal) +{ + pl_rearmed_cbs.fskip_advice = 0; + + frame_interval = is_pal ? 20000 : 16667; + frame_interval1024 = is_pal ? 20000*1024 : 17066667; + + // used by P.E.Op.S. frameskip code + pl_rearmed_cbs.gpu_peops.fFrameRateHz = is_pal ? 50.0f : 59.94f; + pl_rearmed_cbs.gpu_peops.dwFrameRateTicks = + (100000*100 / (unsigned long)(pl_rearmed_cbs.gpu_peops.fFrameRateHz*100)); +} + static void pl_text_out16_(int x, int y, const char *text) { - int i, l, len = strlen(text), w = pl_fbdev_w; - unsigned short *screen = (unsigned short *)pl_fbdev_buf + x + y * w; + int i, l, len = strlen(text), w = pl_vout_w; + unsigned short *screen = (unsigned short *)pl_vout_buf + x + y * w; unsigned short val = 0xffff; for (i = 0; i < len; i++, screen += 8) @@ -353,10 +376,10 @@ static void pl_get_layer_pos(int *x, int *y, int *w, int *h) struct rearmed_cbs pl_rearmed_cbs = { pl_get_layer_pos, - pl_fbdev_open, - pl_fbdev_set_mode, - pl_fbdev_flip, - pl_fbdev_close, + pl_vout_open, + pl_vout_set_mode, + pl_vout_flip, + pl_vout_close, }; /* watchdog */ diff --git a/frontend/plugin_lib.h b/frontend/plugin_lib.h index 759e1257..6cb1ecdb 100644 --- a/frontend/plugin_lib.h +++ b/frontend/plugin_lib.h @@ -21,26 +21,24 @@ extern int in_type1, in_type2; extern int in_keystate, in_state_gun, in_a1[2], in_a2[2]; void in_update_analogs(void); -extern void *pl_fbdev_buf; - -int pl_fbdev_open(void); -void *pl_fbdev_set_mode(int w, int h, int bpp); -void *pl_fbdev_flip(void); -void pl_fbdev_close(void); +extern void *pl_vout_buf; void pl_text_out16(int x, int y, const char *texto, ...); void pl_start_watchdog(void); void *pl_prepare_screenshot(int *w, int *h, int *bpp); void pl_init(void); +void pl_timing_prepare(int is_pal); +void pl_frame_limit(void); + void pl_update_gun(int *xn, int *xres, int *y, int *in); struct rearmed_cbs { void (*pl_get_layer_pos)(int *x, int *y, int *w, int *h); - int (*pl_fbdev_open)(void); - void *(*pl_fbdev_set_mode)(int w, int h, int bpp); - void *(*pl_fbdev_flip)(void); - void (*pl_fbdev_close)(void); + int (*pl_vout_open)(void); + void *(*pl_vout_set_mode)(int w, int h, int bpp); + void *(*pl_vout_flip)(void); + void (*pl_vout_close)(void); // gpu options int frameskip; int fskip_advice; @@ -54,8 +52,6 @@ struct rearmed_cbs { extern struct rearmed_cbs pl_rearmed_cbs; -extern int pl_frame_interval; - #ifndef ARRAY_SIZE #define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0])) #endif diff --git a/maemo/hildon.c b/maemo/hildon.c index 6c59b6ff..ba035d17 100644 --- a/maemo/hildon.c +++ b/maemo/hildon.c @@ -13,14 +13,14 @@ #define D_WIDTH 640 #define D_HEIGHT 480 +int g_layer_x = (X_RES - D_WIDTH) / 2; +int g_layer_y = (Y_RES - D_HEIGHT) / 2; +int g_layer_w = D_WIDTH, g_layer_h = D_HEIGHT; + static GdkImage *image; static HildonAnimationActor *actor; static GtkWidget *window, *drawing; -void *pl_fbdev_buf; -int in_type1 = PSE_PAD_TYPE_STANDARD, in_type2 = PSE_PAD_TYPE_STANDARD; -int in_keystate, in_a1[2], in_a2[2]; - static int keymap[65536]; // map psx4m compatible keymap to PSX keys @@ -157,15 +157,15 @@ void menu_loop(void) { } -void *pl_fbdev_set_mode(int w, int h, int bpp) +void *hildon_set_mode(int w, int h) { if (w <= 0 || h <= 0) - return pl_fbdev_buf; + return pl_vout_buf; if (image) gdk_image_destroy(image); image = gdk_image_new( GDK_IMAGE_FASTEST, gdk_visual_get_system(), w, h ); - pl_fbdev_buf = (void *) image->mem; + pl_vout_buf = (void *) image->mem; gtk_image_set_from_image (GTK_IMAGE(drawing), image, NULL); @@ -175,60 +175,26 @@ void *pl_fbdev_set_mode(int w, int h, int bpp) (gdouble)D_HEIGHT / (gdouble)h ); - return pl_fbdev_buf; + return pl_vout_buf; } -void *pl_fbdev_flip(void) +void *hildon_flip(void) { gtk_widget_queue_draw (drawing); - return pl_fbdev_buf; -} - -void pl_frame_limit(void) -{ - extern void CheckFrameRate(void); - //CheckFrameRate(); /* process GTK+ events */ while (gtk_events_pending()) gtk_main_iteration(); -} -void pl_fbdev_close(void) -{ + return pl_vout_buf; } -int pl_fbdev_open(void) +int omap_enable_layer(int enabled) { return 0; } -static void pl_get_layer_pos(int *x, int *y, int *w, int *h) -{ - *x = 0; - *y = 0; - *w = 800; - *h = 640; -} - -void *pl_prepare_screenshot(int *w, int *h, int *bpp) -{ - return NULL; -} - -int writepng() +void menu_notify_mode_change(int w, int h, int bpp) { - return -1; } -extern int UseFrameSkip; // hmh - -const struct rearmed_cbs pl_rearmed_cbs = { - pl_get_layer_pos, - pl_fbdev_open, - pl_fbdev_set_mode, - pl_fbdev_flip, - pl_fbdev_close, - &UseFrameSkip, -}; - diff --git a/maemo/main.c b/maemo/main.c index f797c122..388e07cc 100644 --- a/maemo/main.c +++ b/maemo/main.c @@ -11,25 +11,20 @@ #include #include "main.h" +#include "menu.h" #include "plugin.h" +#include "plugin_lib.h" #include "../libpcsxcore/misc.h" #include "../libpcsxcore/new_dynarec/new_dynarec.h" -// from softgpu plugin -extern int iUseDither; -extern int UseFrameSkip; -extern int UseFrameLimit; -extern uint32_t dwActFixes; -extern float fFrameRateHz; -extern int dwFrameRateTicks; - // sound plugin extern int iUseReverb; extern int iUseInterpolation; -extern int iXAPitch; extern int iSPUIRQWait; extern int iUseTimer; +int g_opts = OPT_SHOWFPS; + enum sched_action emu_action; void do_emu_action(void); @@ -80,25 +75,22 @@ int maemo_main(int argc, char **argv) cdfile = isofilename; } - else if (!strcmp(argv[i],"-frameskip")){ - - int tv_reg=atol(argv[++i]); - if (tv_reg>0){ - UseFrameSkip=1; - fFrameRateHz = (tv_reg==1)?50.0f: 59.94f; - dwFrameRateTicks = (100000*100 / (unsigned long)(fFrameRateHz*100)); - } + else if (!strcmp(argv[i],"-frameskip")) { + + int tv_reg = atol(argv[++i]); + if (tv_reg > 0) + pl_rearmed_cbs.frameskip = 1; } - else if (!strcmp(argv[i],"-sputhreaded")){ + else if (!strcmp(argv[i],"-sputhreaded")) { iUseTimer=1; } - else if (!strcmp(argv[i],"-nosound")){ - strcpy(Config.Spu, "spunull.so"); + else if (!strcmp(argv[i],"-nosound")) { + strcpy(Config.Spu, "spunull.so"); } else if(!strcmp(argv[i], "-bdir")) sprintf(Config.BiosDir, "%s", argv[++i]); else if(!strcmp(argv[i], "-bios")) sprintf(Config.Bios, "%s", argv[++i]); else if (!strcmp(argv[i],"-gles")){ - strcpy(Config.Gpu, "gpuGLES.so"); + strcpy(Config.Gpu, "gpuGLES.so"); } else if (!strcmp(argv[i], "-cdda")) Config.Cdda = 1; else if (!strcmp(argv[i], "-xa")) Config.Xa = 1; @@ -136,6 +128,15 @@ int maemo_main(int argc, char **argv) } } + pl_rearmed_cbs.gpu_peops.dwActFixes = 1<<7; + iUseReverb = 2; + iUseInterpolation = 1; + iSPUIRQWait = 1; + iUseTimer = 2; + + in_type1 = PSE_PAD_TYPE_STANDARD; + in_type2 = PSE_PAD_TYPE_STANDARD; + hildon_init(&argc, &argv); if (cdfile) @@ -144,6 +145,8 @@ int maemo_main(int argc, char **argv) if (SysInit() == -1) return 1; + pl_init(); + if (LoadPlugins() == -1) { SysMessage("Failed loading plugins!"); return 1; @@ -185,6 +188,8 @@ int maemo_main(int argc, char **argv) return 0; } + pl_timing_prepare(Config.PsxType); + while (1) { stop = 0; diff --git a/plugins/dfxvideo/draw_fb.c b/plugins/dfxvideo/draw_fb.c index a3f50e82..f40063e6 100644 --- a/plugins/dfxvideo/draw_fb.c +++ b/plugins/dfxvideo/draw_fb.c @@ -1,5 +1,5 @@ /* - * (C) notaz, 2010 + * (C) notaz, 2010-2011 * * This work is licensed under the terms of the GNU GPLv2 or later. * See the COPYING file in the top-level directory. @@ -19,7 +19,7 @@ BOOL bCheckMask = FALSE; unsigned short sSetMask; unsigned long lSetMask; -static void blit(void) +static void blit(void *vout_buf) { int px = PSXDisplay.DisplayPosition.x & ~1; // XXX: align needed by bgr*_to_... int py = PSXDisplay.DisplayPosition.y; @@ -27,7 +27,7 @@ static void blit(void) int h = PreviousPSXDisplay.DisplayMode.y; int pitch = PreviousPSXDisplay.DisplayMode.x; unsigned short *srcs = psxVuw + py * 1024 + px; - unsigned char *dest = pl_fbdev_buf; + unsigned char *dest = vout_buf; if (w <= 0) return; @@ -64,6 +64,7 @@ static void blit(void) void DoBufferSwap(void) { static int fbw, fbh, fb24bpp; + static void *vout_buf; if (PreviousPSXDisplay.DisplayMode.x == 0 || PreviousPSXDisplay.DisplayMode.y == 0) return; @@ -75,14 +76,14 @@ void DoBufferSwap(void) fbw = PreviousPSXDisplay.DisplayMode.x; fbh = PreviousPSXDisplay.DisplayMode.y; fb24bpp = PSXDisplay.RGB24; - pl_fbdev_set_mode(fbw, fbh, fb24bpp ? 24 : 16); + vout_buf = rcbs->pl_vout_set_mode(fbw, fbh, fb24bpp ? 24 : 16); } pcnt_start(PCNT_BLIT); - blit(); + blit(vout_buf); pcnt_end(PCNT_BLIT); - pl_fbdev_flip(); + vout_buf = rcbs->pl_vout_flip(); } void DoClearScreenBuffer(void) @@ -91,7 +92,7 @@ void DoClearScreenBuffer(void) unsigned long ulInitDisplay(void) { - if (pl_fbdev_open() != 0) + if (rcbs->pl_vout_open() != 0) return 0; return 1; /* ok */ @@ -99,5 +100,5 @@ unsigned long ulInitDisplay(void) void CloseDisplay(void) { - pl_fbdev_close(); + rcbs->pl_vout_close(); } diff --git a/plugins/dfxvideo/gpu.c b/plugins/dfxvideo/gpu.c index a2b4f921..6af6447d 100644 --- a/plugins/dfxvideo/gpu.c +++ b/plugins/dfxvideo/gpu.c @@ -1139,6 +1139,8 @@ void CALLBACK GPUvBlank(int val) // rearmed thing #include "../../frontend/plugin_lib.h" +const struct rearmed_cbs *rcbs; + void GPUrearmedCallbacks(const struct rearmed_cbs *cbs) { // sync config @@ -1150,4 +1152,5 @@ void GPUrearmedCallbacks(const struct rearmed_cbs *cbs) skip_advice = &cbs->fskip_advice; fps_skip = 100.0f; + rcbs = cbs; } diff --git a/plugins/dfxvideo/gpu.h b/plugins/dfxvideo/gpu.h index 6ac6d3e9..9ee5f3e6 100644 --- a/plugins/dfxvideo/gpu.h +++ b/plugins/dfxvideo/gpu.h @@ -314,4 +314,7 @@ void DoClearFrontBuffer(void); unsigned long ulInitDisplay(void); void CloseDisplay(void); +struct rearmed_cbs; +extern const struct rearmed_cbs *rcbs; + #endif diff --git a/plugins/gpu_unai/gpu.cpp b/plugins/gpu_unai/gpu.cpp index 9b0a0dc4..35158143 100644 --- a/plugins/gpu_unai/gpu.cpp +++ b/plugins/gpu_unai/gpu.cpp @@ -901,7 +901,7 @@ static void blit(void) old_res_horz = w0; old_res_vert = h1; old_rgb24 = (s16)isRGB24; - screen_buf = cbs->pl_fbdev_set_mode(w0, h1, isRGB24 ? 24 : 16); + screen_buf = cbs->pl_vout_set_mode(w0, h1, isRGB24 ? 24 : 16); } dest = (u8 *)screen_buf; @@ -927,7 +927,7 @@ static void blit(void) } } - screen_buf = cbs->pl_fbdev_flip(); + screen_buf = cbs->pl_vout_flip(); } void GPU_updateLace(void) @@ -951,14 +951,14 @@ void GPU_updateLace(void) long GPUopen(unsigned long *, char *, char *) { - cbs->pl_fbdev_open(); - screen_buf = cbs->pl_fbdev_flip(); + cbs->pl_vout_open(); + screen_buf = cbs->pl_vout_flip(); return 0; } long GPUclose(void) { - cbs->pl_fbdev_close(); + cbs->pl_vout_close(); return 0; }