From 23e4719638c679033b0f6fba77104b1dc55c6072 Mon Sep 17 00:00:00 2001 From: kub Date: Sun, 19 Jun 2022 22:46:50 +0200 Subject: [PATCH] generic ui, add basic GLES support --- Makefile | 10 ++++++++-- configure | 9 +++++++++ platform/common/menu_pico.c | 40 +++++++++++++++++++++++-------------- platform/common/plat_sdl.c | 11 +++++----- platform/gp2x/menu.c | 1 + platform/libpicofe | 2 +- platform/linux/emu.c | 7 +++++-- 7 files changed, 54 insertions(+), 26 deletions(-) diff --git a/Makefile b/Makefile index 9d0c986a..d34fdbca 100644 --- a/Makefile +++ b/Makefile @@ -159,11 +159,14 @@ OBJS += platform/linux/emu.o platform/linux/blit.o # FIXME OBJS += platform/common/plat_sdl.o platform/common/input_sdlkbd.o OBJS += platform/libpicofe/plat_sdl.o platform/libpicofe/in_sdl.o OBJS += platform/libpicofe/plat_dummy.o platform/libpicofe/linux/plat.o -OBJS += platform/libpicofe/gl.o -OBJS += platform/libpicofe/gl_platform.o USE_FRONTEND = 1 endif ifeq "$(PLATFORM)" "generic" +#ifeq (y,$(shell echo "\#include " | $(CC) -E -xc - >/dev/null 2>&1 && echo y)) +ifeq "$(HAVE_GLES)" "1" +CFLAGS += -DHAVE_GLES -DSDL_REDRAW_EVT +LDFLAGS += -lEGL -lGLESv1_CM +endif CFLAGS += -DSDL_OVERLAY_2X -DSDL_BUFFER_3X OBJS += platform/linux/emu.o platform/linux/blit.o # FIXME ifeq "$(use_inputmap)" "1" @@ -254,6 +257,9 @@ OBJS += platform/common/main.o platform/common/emu.o platform/common/upscale.o \ # libpicofe OBJS += platform/libpicofe/input.o platform/libpicofe/readpng.o \ platform/libpicofe/fonts.o +ifneq (,$(filter %HAVE_GLES, $(CFLAGS))) +OBJS += platform/libpicofe/gl.o platform/libpicofe/gl_platform.o +endif # libpicofe - sound OBJS += platform/libpicofe/sndout.o diff --git a/configure b/configure index c67b9a0c..a710718c 100755 --- a/configure +++ b/configure @@ -50,6 +50,7 @@ have_arm_oabi="" have_arm_neon="" have_libavcodec="" have_libchdr="" +have_gles="no" need_sdl="no" need_zlib="no" @@ -74,9 +75,11 @@ set_platform() case "$platform" in rpi1) MFLAGS="mcpu=arm1176jzf-s -mfpu=vfp" + have_gles="yes" ;; rpi2) MFLAGS="mcpu=cortex-a7 -mfpu=neon" + have_gles="yes" ;; generic) ;; @@ -155,6 +158,8 @@ for opt do ;; --with-libavcodec=*) have_libavcodec="$optarg" ;; + --with-sdl-gles=*) have_gles="$optarg" + ;; *) echo "ERROR: unknown option $opt"; show_help="yes" ;; esac @@ -168,6 +173,7 @@ if [ "$show_help" = "yes" ]; then echo " --sound-drivers=LIST sound output drivers [guessed]" echo " available: $sound_driver_list" echo " --with-libavcodec=yes|no use libavcodec for mp3 decoding" + echo " --with-sdl-gles=yes|no enable GLES usage for SDL" echo "influential environment variables:" echo " CROSS_COMPILE CC CXX AS STRIP CFLAGS ASFLAGS LDFLAGS LDLIBS" exit 1 @@ -447,6 +453,9 @@ echo >> $config_mak echo "ARCH = $ARCH" >> $config_mak echo "PLATFORM = $platform" >> $config_mak echo "SOUND_DRIVERS = $sound_drivers" >> $config_mak +if [ "$have_gles" = "yes" ]; then + echo "HAVE_GLES = 1" >> $config_mak +fi if [ "$have_libavcodec" = "yes" ]; then echo "HAVE_LIBAVCODEC = 1" >> $config_mak fi diff --git a/platform/common/menu_pico.c b/platform/common/menu_pico.c index 4515bd28..a72953f1 100644 --- a/platform/common/menu_pico.c +++ b/platform/common/menu_pico.c @@ -69,6 +69,7 @@ static unsigned short fname2color(const char *fname) #include static const char *men_dummy[] = { NULL }; +static int menu_w, menu_h; /* platform specific options and handlers */ #if defined(__GP2X__) @@ -147,7 +148,17 @@ static void copy_bg(int dir) static void menu_enter(int is_rom_loaded) { - if (is_rom_loaded) + plat_video_menu_enter(is_rom_loaded); + menu_w = menu_h = 0; +} + +static void menu_draw_prep(void) +{ + if (menu_w == g_menuscreen_w && menu_h == g_menuscreen_h) + return; + menu_w = g_menuscreen_w, menu_h = g_menuscreen_h; + + if (PicoGameLoaded) { make_bg(0, 0); } @@ -159,12 +170,11 @@ static void menu_enter(int is_rom_loaded) strcpy(buff + pos, "background.png"); // should really only happen once, on startup.. + memset(g_menubg_ptr, 0, g_menuscreen_w * g_menuscreen_h * 2); if (readpng(g_menubg_ptr, buff, READPNG_BG, g_menuscreen_w, g_menuscreen_h) < 0) memset(g_menubg_ptr, 0, g_menuscreen_w * g_menuscreen_h * 2); } - - plat_video_menu_enter(is_rom_loaded); } static void draw_savestate_bg(int slot) @@ -436,7 +446,7 @@ static int menu_loop_keyconfig(int id, int keys) static int sel = 0; me_enable(e_menu_keyconfig, MA_OPT_SAVECFG_GAME, PicoGameLoaded); - me_loop(e_menu_keyconfig, &sel); + me_loop_d(e_menu_keyconfig, &sel, menu_draw_prep, NULL); PicoSetInputDevice(0, currentConfig.input_dev0); PicoSetInputDevice(1, currentConfig.input_dev1); @@ -461,7 +471,7 @@ static int menu_loop_md_options(int id, int keys) static int sel = 0; me_enable(e_menu_md_options, MA_OPT_RENDERER, renderer_names[0] != NULL); - me_loop(e_menu_md_options, &sel); + me_loop_d(e_menu_md_options, &sel, menu_draw_prep, NULL); return 0; } @@ -489,7 +499,7 @@ static menu_entry e_menu_cd_options[] = static int menu_loop_cd_options(int id, int keys) { static int sel = 0; - me_loop(e_menu_cd_options, &sel); + me_loop_d(e_menu_cd_options, &sel, menu_draw_prep, NULL); return 0; } @@ -548,7 +558,7 @@ static int menu_loop_32x_options(int id, int keys) static int sel = 0; me_enable(e_menu_32x_options, MA_32XOPT_RENDERER, renderer_names32x[0] != NULL); - me_loop(e_menu_32x_options, &sel); + me_loop_d(e_menu_32x_options, &sel, menu_draw_prep, NULL); Pico32xSetClocks(currentConfig.msh2_khz * 1000, currentConfig.msh2_khz * 1000); @@ -580,7 +590,7 @@ static int menu_loop_sms_options(int id, int keys) { static int sel = 0; - me_loop(e_menu_sms_options, &sel); + me_loop_d(e_menu_sms_options, &sel, menu_draw_prep, NULL); return 0; } @@ -612,7 +622,7 @@ static int menu_loop_adv_options(int id, int keys) { static int sel = 0; - me_loop(e_menu_adv_options, &sel); + me_loop_d(e_menu_adv_options, &sel, menu_draw_prep, NULL); PicoIn.overclockM68k = currentConfig.overclock_68k; // int vs short return 0; @@ -701,7 +711,7 @@ static int menu_loop_snd_options(int id, int keys) if (PicoIn.sndRate > 52000 && PicoIn.sndRate < 54000) PicoIn.sndRate = 53000; - me_loop(e_menu_snd_options, &sel); + me_loop_d(e_menu_snd_options, &sel, menu_draw_prep, NULL); return 0; } @@ -739,7 +749,7 @@ static int menu_loop_gfx_options(int id, int keys) { static int sel = 0; - me_loop(e_menu_gfx_options, &sel); + me_loop_d(e_menu_gfx_options, &sel, menu_draw_prep, NULL); return 0; } @@ -762,7 +772,7 @@ static int menu_loop_ui_options(int id, int keys) { static int sel = 0; - me_loop(e_menu_ui_options, &sel); + me_loop_d(e_menu_ui_options, &sel, menu_draw_prep, NULL); return 0; } @@ -916,7 +926,7 @@ static int menu_loop_options(int id, int keys) me_enable(e_menu_options, MA_OPT_SAVECFG_GAME, PicoGameLoaded); me_enable(e_menu_options, MA_OPT_LOADCFG, config_slot != config_slot_current); - me_loop(e_menu_options, &sel); + me_loop_d(e_menu_options, &sel, menu_draw_prep, NULL); return 0; } @@ -1265,7 +1275,7 @@ void menu_loop(void) menu_enter(PicoGameLoaded); in_set_config_int(0, IN_CFG_BLOCKING, 1); - me_loop_d(e_menu_main, &sel, NULL, menu_main_draw_status); + me_loop_d(e_menu_main, &sel, menu_draw_prep, menu_main_draw_status); if (PicoGameLoaded) { if (engineState == PGS_Menu) @@ -1318,7 +1328,7 @@ int menu_loop_tray(void) menu_enter(PicoGameLoaded); in_set_config_int(0, IN_CFG_BLOCKING, 1); - me_loop(e_menu_tray, &sel); + me_loop_d(e_menu_tray, &sel, menu_draw_prep, NULL); if (engineState != PGS_RestartRun) { engineState = PGS_RestartRun; diff --git a/platform/common/plat_sdl.c b/platform/common/plat_sdl.c index 98c0a55f..cb02919b 100644 --- a/platform/common/plat_sdl.c +++ b/platform/common/plat_sdl.c @@ -234,12 +234,11 @@ void plat_video_menu_enter(int is_rom_loaded) { if (SDL_MUSTLOCK(plat_sdl_screen)) SDL_UnlockSurface(plat_sdl_screen); - plat_sdl_change_video_mode(g_menuscreen_w, g_menuscreen_h, 1); - resize_buffers(); } void plat_video_menu_begin(void) { + plat_sdl_change_video_mode(g_menuscreen_w, g_menuscreen_h, 1); resize_buffers(); if (plat_sdl_overlay || plat_sdl_gl_active) { g_menuscreen_pp = g_menuscreen_w; @@ -318,10 +317,10 @@ void plat_early_init(void) static void plat_sdl_resize(int w, int h) { // take over new settings - g_menuscreen_h = (plat_sdl_screen->h < 480 ? plat_sdl_screen->h : 480); - if (!plat_sdl_overlay && !plat_sdl_gl_active) - g_menuscreen_h = plat_sdl_screen->h; - g_menuscreen_w = g_menuscreen_h * plat_sdl_screen->w/plat_sdl_screen->h; + g_menuscreen_h = plat_sdl_screen->h; + g_menuscreen_w = plat_sdl_screen->w; + resize_buffers(); + rendstatus_old = -1; } static void plat_sdl_quit(void) diff --git a/platform/gp2x/menu.c b/platform/gp2x/menu.c index 97456c08..fc89014d 100644 --- a/platform/gp2x/menu.c +++ b/platform/gp2x/menu.c @@ -18,6 +18,7 @@ const char *men_scaling_opts[] = { "OFF", "software", "hardware", NULL }; static menu_entry e_menu_adv_options[]; static menu_entry e_menu_gfx_options[]; +static menu_entry e_menu_sms_options[]; static menu_entry e_menu_options[]; static menu_entry e_menu_keyconfig[]; diff --git a/platform/libpicofe b/platform/libpicofe index e3ea3015..f5b32cc3 160000 --- a/platform/libpicofe +++ b/platform/libpicofe @@ -1 +1 @@ -Subproject commit e3ea3015f042cb3a1615dc3038b524ce0a063722 +Subproject commit f5b32cc30c98b1772cdfd4ed1ff5476dced770cc diff --git a/platform/linux/emu.c b/platform/linux/emu.c index ec72c31a..0a05cdd8 100644 --- a/platform/linux/emu.c +++ b/platform/linux/emu.c @@ -303,7 +303,8 @@ void pemu_forced_frame(int no_scale, int do_emu) emu_cmn_forced_frame(no_scale, do_emu, screen_buffer(g_screen_ptr)); render_bg = 0; - g_menubg_src_ptr = g_screen_ptr; + g_menubg_src_ptr = realloc(g_menubg_src_ptr, g_screen_height * g_screen_ppitch * 2); + memcpy(g_menubg_src_ptr, g_screen_ptr, g_screen_height * g_screen_ppitch * 2); currentConfig.scaling = hs, currentConfig.vscaling = vs; } @@ -365,6 +366,7 @@ void emu_video_mode_change(int start_line, int line_count, int start_col, int co out_y = start_line; out_x = start_col; out_h = line_count; out_w = col_count; + plat_video_loop_prepare(); // recalculates g_screen_w/h PicoDrawSetCallbacks(NULL, NULL); // center output in screen screen_w = g_screen_width, screen_x = (screen_w - out_w)/2; @@ -402,7 +404,6 @@ void emu_video_mode_change(int start_line, int line_count, int start_col, int co } plat_video_set_size(screen_w, screen_h); - plat_video_set_buffer(g_screen_ptr); if (screen_w < g_screen_width) screen_x = (g_screen_width - screen_w)/2; @@ -413,6 +414,8 @@ void emu_video_mode_change(int start_line, int line_count, int start_col, int co screen_y += (224 - out_h)/2; } + plat_video_set_buffer(g_screen_ptr); + // create a backing buffer for emulating the bad GG lcd display if (currentConfig.ghosting && out_h == 144) { int h = currentConfig.vscaling == EOPT_SCALE_SW ? 240:out_h; -- 2.39.2