Path: blob/main/public/webretro/source/patches/retroarch.patch
1224 views
diff --git a/Makefile.common b/Makefile.common1index a18e5838b8..9610e32517 1006442--- a/Makefile.common3+++ b/Makefile.common4@@ -1500,10 +1500,11 @@ ifeq ($(HAVE_GL_CONTEXT), 1)5DEF_FLAGS += $(OPENGLES_CFLAGS)6ifeq ($(HAVE_OPENGLES3), 1)7DEFINES += -DHAVE_OPENGLES38+ OBJ += $(LIBRETRO_COMM_DIR)/glsym/glsym_es3.o9else10DEFINES += -DHAVE_OPENGLES211+ OBJ += $(LIBRETRO_COMM_DIR)/glsym/glsym_es2.o12endif13- OBJ += $(LIBRETRO_COMM_DIR)/glsym/glsym_es2.o14else15DEFINES += -DHAVE_GL_SYNC16OBJ += $(LIBRETRO_COMM_DIR)/glsym/glsym_gl.o17diff --git a/Makefile.emscripten b/Makefile.emscripten18index d6de1b9805..2e1ccca52e 10064419--- a/Makefile.emscripten20+++ b/Makefile.emscripten21@@ -9,11 +9,8 @@ endif22EOPT = USE_ZLIB=1 # Emscripten specific options23EOPTS = $(addprefix -s $(EMPTY), $(EOPT)) # Add '-s ' to each option2425-PTHREAD = 026OS = Emscripten27OBJ :=28-DEFINES := -DRARCH_INTERNAL -DHAVE_MAIN -s USE_PTHREADS=$(PTHREAD)29-DEFINES += -DHAVE_FILTERS_BUILTIN3031HAVE_DSP_FILTER = 132HAVE_VIDEO_FILTER = 133@@ -25,7 +22,6 @@ HAVE_AUDIOMIXER = 134HAVE_VIDEO_LAYOUT = 035HAVE_CC_RESAMPLER = 136HAVE_EGL = 137-HAVE_OPENGLES = 138HAVE_RJPEG = 039HAVE_RPNG = 140HAVE_EMSCRIPTEN = 141@@ -42,42 +38,101 @@ HAVE_STB_FONT = 142HAVE_CONFIGFILE = 143HAVE_CHEATS = 144HAVE_IBXM = 145+HAVE_PATCH = 14647ASYNC ?= 048-ifeq ($(LIBRETRO), mupen64plus)49- ASYNC = 150-endif51-52+PTHREAD ?= 053LTO ?= 054-ifeq ($(LIBRETRO), tyrquake)55- LTO = 056-endif5758-MEMORY ?= 13421772859+DEFINES := -DRARCH_INTERNAL -DHAVE_MAIN60+DEFINES += -DHAVE_FILTERS_BUILTIN -DNO_MISSING_ASSET_WARNING -DNO_AUTO_CANVAS_RESIZE -DWEB_SCALING -DNO_CANVAS_FULLSCREEN -DNO_INITIAL_CANVAS_RESIZE61+62+HAVE_OPENGL = 0 # not supported63+EM_OPENGL ?= 064+HAVE_REGAL ?= 065+66+HAVE_OPENGLES ?= 167+HAVE_OPENGLES3 ?= 068+69+GL_DEBUG ?= 0 # help diagnose GLSL problems (can cause errors in normal operation)70+GENERATE_SOURCEMAP ?= 071+FS_DEBUG = 072+73+# default value: 5242880 (5 MiB)74+STACK_MEMORY ?= 838860875+# default value: 16777216 (16 MiB)76+HEAP_MEMORY ?= 53687091277+78+# 8388608 ----- 8 MiB (Stack: recommended)79+# 16777216 ---- 16 MiB80+# 33554432 ---- 32 MiB81+# 67108864 ---- 64 MiB82+# 134217728 --- 128 MiB83+# 268435456 --- 256 MiB (Heap: recommended) (Stack: recommended for some cores [mupen64plus_next])84+# 536870912 --- 512 MiB (Heap: needed for some cores [mednafen_psx(_hw), mupen64plus_next])85+# 1073741824 -- 1 GiB86+# 1610612736 -- 1.5 GiB87+# 2147483648 -- 2 GiB8889PRECISE_F32 = 19091OBJDIR := obj-emscripten9293-#if you compile with SDL2 flag add this Emscripten flag "-s USE_SDL=2" to LDFLAGS:94+EXPORTED_FUNCTIONS = "['_main', '_malloc', '_cmd_savefiles', '_cmd_save_state', '_cmd_load_state', '_cmd_undo_save_state', '_cmd_undo_load_state', '_cmd_take_screenshot', '_cmd_toggle_menu', '_cmd_reload_config', '_cmd_toggle_grab_mouse', '_cmd_toggle_game_focus', '_cmd_reset', '_cmd_toggle_pause', '_cmd_pause', '_cmd_unpause', '_cmd_set_volume', '_cmd_set_shader', '_cmd_cheat_set_code', '_cmd_cheat_get_code', '_cmd_cheat_toggle_index', '_cmd_cheat_get_code_state', '_cmd_cheat_realloc', '_cmd_cheat_get_size', '_cmd_cheat_apply_cheats']"9596LIBS := -s USE_ZLIB=197-LDFLAGS := -L. --no-heap-copy -s $(LIBS) -s TOTAL_MEMORY=$(MEMORY) -s NO_EXIT_RUNTIME=0 -s FULL_ES2=1 -s "EXTRA_EXPORTED_RUNTIME_METHODS=['callMain']" \98- -s ALLOW_MEMORY_GROWTH=1 -s EXPORTED_FUNCTIONS="['_main', '_malloc', '_cmd_savefiles', '_cmd_save_state', '_cmd_load_state', '_cmd_take_screenshot']" \99+100+ifeq ($(HAVE_SDL2), 1)101+ LIBS += -s USE_SDL=2102+ DEFINES += -DHAVE_SDL2103+endif104+105+LDFLAGS := -L. --no-heap-copy $(LIBS) -s TOTAL_STACK=$(STACK_MEMORY) -s TOTAL_MEMORY=$(HEAP_MEMORY) -s NO_EXIT_RUNTIME=0 -s EXPORTED_RUNTIME_METHODS="['callMain', 'FS']" -s EXPORTED_FUNCTIONS=$(EXPORTED_FUNCTIONS) \106--js-library emscripten/library_rwebaudio.js \107--js-library emscripten/library_rwebcam.js \108--js-library emscripten/library_errno_codes.js109+110+ifeq ($(HAVE_OPENGLES), 1)111+ ifeq ($(HAVE_OPENGLES3), 1)112+ LDFLAGS += -s FULL_ES3=1 -s MIN_WEBGL_VERSION=2 -s MAX_WEBGL_VERSION=2113+ else114+ LDFLAGS += -s FULL_ES2=1115+ endif116+endif117+ifeq ($(EM_OPENGL), 1)118+ DEFINES += -DEM_OPENGL119+ ifeq ($(HAVE_REGAL), 1)120+ LDFLAGS += -s USE_REGAL=1121+ DEFINES += -DHAVE_REGAL122+ else123+ LDFLAGS += -s LEGACY_GL_EMULATION=1 -s GL_UNSAFE_OPTS=0124+ endif125+endif126+127+ifeq ($(GL_DEBUG), 1)128+ LDFLAGS += -s GL_ASSERTIONS=1 -s GL_DEBUG=1129+endif130+131+ifeq ($(FS_DEBUG), 1)132+ LDFLAGS += -s FS_DEBUG=1133+endif134+135ifneq ($(PTHREAD), 0)136- LDFLAGS += -s USE_PTHREADS=$(PTHREAD) -s PTHREAD_POOL_SIZE=2137+ CFLAGS += -pthread138+ CXXFLAGS += -pthread139+ LDFLAGS += -pthread -s PTHREAD_POOL_SIZE=4140+else141+ LDFLAGS += -s ALLOW_MEMORY_GROWTH=1142endif143144ifeq ($(ASYNC), 1)145- LDFLAGS += -s ASYNCIFY=$(ASYNC)146+ LDFLAGS += -s ASYNCIFY=1 -s ASYNCIFY_STACK_SIZE=131072147endif148149-ifeq ($(HAVE_SDL2), 1)150- LIBS += -s USE_SDL=2151- DEFINES += -DHAVE_SDL2152+ifeq ($(GENERATE_SOURCEMAP), 1)153+ CFLAGS += -g4154+ CXXFLAGS += -g4155+ LDFLAGS += -g4 --source-map-base http://localhost:8000/cores/ # -gsource-map156endif157158include Makefile.common159@@ -102,8 +157,7 @@ else160CFLAGS += -O3161endif162163-CFLAGS += -Wall -I. -Ilibretro-common/include -std=gnu99 $(LIBS) \164- -s EXPORTED_FUNCTIONS="['_main', '_malloc', '_cmd_savefiles', '_cmd_save_state', '_cmd_take_screenshot']"165+CFLAGS += -Wall -Wno-unused-command-line-argument -I. -Ilibretro-common/include -std=gnu99 $(LIBS) -s EXPORTED_FUNCTIONS=$(EXPORTED_FUNCTIONS)166167RARCH_OBJ := $(addprefix $(OBJDIR)/,$(OBJ))168169diff --git a/cheat_manager.c b/cheat_manager.c170index 5df70be982..2f11a8f25a 100644171--- a/cheat_manager.c172+++ b/cheat_manager.c173@@ -120,7 +120,7 @@ void cheat_manager_set_code(unsigned i, const char *str)174return;175176if (!string_is_empty(str))177- strcpy(cheat_st->cheats[i].code, str);178+ cheat_st->cheats[i].code = strdup(str);179180cheat_st->cheats[i].state = true;181}182diff --git a/command.h b/command.h183index a007c175c7..5d1255dfc5 100644184--- a/command.h185+++ b/command.h186@@ -205,7 +205,8 @@ enum event_command187CMD_EVENT_CHEAT_INDEX_MINUS,188CMD_EVENT_CHEAT_TOGGLE,189CMD_EVENT_AI_SERVICE_CALL,190- CMD_EVENT_SAVE_FILES191+ CMD_EVENT_SAVE_FILES,192+ CMD_EVENT_RELOAD_CONFIG193};194195typedef struct command command_t;196diff --git a/config.def.h b/config.def.h197index a87fa6f94a..7c0ddac8f7 100644198--- a/config.def.h199+++ b/config.def.h200@@ -1151,6 +1151,9 @@ static const int default_content_favorites_size = 200;201/* Show Menu start-up screen on boot. */202#define DEFAULT_MENU_SHOW_START_SCREEN true203204+/* Working with a limited set of assets */205+#define DEFAULT_MENU_MINIMAL_ASSETS false206+207/* Default scale factor for non-frambuffer-based display208* drivers and display widgets */209#if defined(VITA)210diff --git a/configuration.c b/configuration.c211index fb8e97c196..2afa8f147a 100644212--- a/configuration.c213+++ b/configuration.c214@@ -1654,6 +1654,7 @@ static struct config_bool_setting *populate_settings_bool(215SETTING_BOOL("menu_show_legacy_thumbnail_updater", &settings->bools.menu_show_legacy_thumbnail_updater, true, menu_show_legacy_thumbnail_updater, false);216SETTING_BOOL("filter_by_current_core", &settings->bools.filter_by_current_core, true, DEFAULT_FILTER_BY_CURRENT_CORE, false);217SETTING_BOOL("rgui_show_start_screen", &settings->bools.menu_show_start_screen, false, false /* TODO */, false);218+ SETTING_BOOL("menu_minimal_assets", &settings->bools.menu_minimal_assets, false, false, false);219SETTING_BOOL("menu_navigation_wraparound_enable", &settings->bools.menu_navigation_wraparound_enable, true, true, false);220SETTING_BOOL("menu_navigation_browser_filter_supported_extensions_enable",221&settings->bools.menu_navigation_browser_filter_supported_extensions_enable, true, true, false);222diff --git a/configuration.h b/configuration.h223index d758fe630e..4c20fdb983 100644224--- a/configuration.h225+++ b/configuration.h226@@ -556,6 +556,7 @@ typedef struct settings227bool notification_show_refresh_rate;228bool menu_widget_scale_auto;229bool menu_show_start_screen;230+ bool menu_minimal_assets;231bool menu_pause_libretro;232bool menu_savestate_resume;233bool menu_insert_disk_resume;234diff --git a/dist-scripts/dist-cores.sh b/dist-scripts/dist-cores.sh235index 7beedba2e6..970d648f25 100644236--- a/dist-scripts/dist-cores.sh237+++ b/dist-scripts/dist-cores.sh238@@ -164,6 +164,10 @@ for f in `ls -v *_${platform}.${EXT}`; do239whole_archive=240big_stack=241242+ gles3=0243+ stack_mem=8388608244+ heap_mem=268435456245+246if [ $name = "nxengine" ] ; then247echo "Applying whole archive linking..."248whole_archive="WHOLE_ARCHIVE_LINK=1"249@@ -171,10 +175,31 @@ for f in `ls -v *_${platform}.${EXT}`; do250echo "Applying big stack..."251lto=0252big_stack="BIG_STACK=1"253- elif [ $name = "mupen64plus" ] ; then254+ elif [ $name = "mupen64plus_next" ] ; then255+ gles3=1256+ async=1257+ pthread=0258+ stack_mem=268435456259+ heap_mem=536870912260+ elif [ $name = "parallel_n64" ] ; then261+ gles3=1262async=1263+ elif [ $name = "mednafen_psx" ] ; then264+ heap_mem=536870912265+ elif [ $name = "mednafen_psx_hw" ] ; then266+ gles3=1267+ heap_mem=536870912268elif [ $name = "dosbox" ] ; then269- async=0270+ async=1271+ elif [ $name = "scummvm" ] ; then272+ async=1273+ pthread=0274+ elif [ $name = "melonds" ] ; then275+ pthread=0276+ elif [ $name = "yabause" ] ; then277+ pthread=0278+ elif [ $name = "yabasanshiro" ] ; then279+ pthread=0280fi281echo "-- Building core: $name --"282if [ $PLATFORM = "unix" ]; then283@@ -184,7 +209,11 @@ for f in `ls -v *_${platform}.${EXT}`; do284fi285echo NAME: $name286echo ASYNC: $async287+ echo PTHREAD: $pthread288echo LTO: $lto289+ echo GLES3: $gles3290+ echo STACK_MEMORY: $stack_mem291+ echo HEAP_MEMORY: $heap_mem292293# Do cleanup if this is a big stack core294if [ "$big_stack" = "BIG_STACK=1" ] ; then295@@ -203,8 +232,8 @@ for f in `ls -v *_${platform}.${EXT}`; do296if [ $MAKEFILE_GRIFFIN = "yes" ]; then297make -C ../ -f Makefile.griffin $OPTS platform=${platform} $whole_archive $big_stack -j3 || exit 1298elif [ $PLATFORM = "emscripten" ]; then299- echo "BUILD COMMAND: make -C ../ -f Makefile.emscripten PTHREAD=$pthread ASYNC=$async LTO=$lto -j7 TARGET=${name}_libretro.js"300- make -C ../ -f Makefile.emscripten $OPTS PTHREAD=$pthread ASYNC=$async LTO=$lto -j7 TARGET=${name}_libretro.js || exit 1301+ echo "BUILD COMMAND: make -C ../ -f Makefile.emscripten $OPTS PTHREAD=$pthread ASYNC=$async LTO=$lto HAVE_OPENGLES3=$gles3 STACK_MEMORY=$stack_mem HEAP_MEMORY=$heap_mem -j7 TARGET=${name}_libretro.js"302+ make -C ../ -f Makefile.emscripten $OPTS PTHREAD=$pthread ASYNC=$async LTO=$lto HAVE_OPENGLES3=$gles3 STACK_MEMORY=$stack_mem HEAP_MEMORY=$heap_mem -j7 TARGET=${name}_libretro.js || exit 1303elif [ $PLATFORM = "unix" ]; then304make -C ../ -f Makefile LINK=g++ $whole_archive $big_stack -j3 || exit 1305elif [ $PLATFORM = "ctr" ]; then306@@ -258,7 +287,7 @@ for f in `ls -v *_${platform}.${EXT}`; do307mv -f ../${name}_libretro.js ../pkg/emscripten/${name}_libretro.js308mv -f ../${name}_libretro.wasm ../pkg/emscripten/${name}_libretro.wasm309if [ $pthread != 0 ] ; then310- mv -f ../pthread-main.js ../pkg/emscripten/pthread-main.js311+ mv -f ../${name}_libretro.worker.js ../pkg/emscripten/${name}_libretro.worker.js312fi313fi314315diff --git a/emscripten/library_rwebcam.js b/emscripten/library_rwebcam.js316index 5c0bec5dc3..9b9114d33b 100644317--- a/emscripten/library_rwebcam.js318+++ b/emscripten/library_rwebcam.js319@@ -17,18 +17,13 @@ var LibraryRWebCam = {320RWebCamInit__deps: ['malloc'],321RWebCamInit: function(caps1, caps2, width, height) {322if (!navigator) return 0;323-324- navigator.getMedia = navigator.getUserMedia ||325- navigator.webkitGetUserMedia ||326- navigator.mozGetUserMedia ||327- navigator.msGetUserMedia;328-329- if (!navigator.getMedia) return 0;330+ if (!navigator.mediaDevices.getUserMedia) return 0;331332var c = ++RWC.counter;333334RWC.contexts[c] = [];335RWC.contexts[c].videoElement = document.createElement("video");336+ RWC.contexts[c].videoElement.classList.add("retroarchWebcamVideo");337if (width !== 0 && height !== 0) {338RWC.contexts[c].videoElement.width = width;339RWC.contexts[c].videoElement.height = height;340@@ -37,14 +32,19 @@ var LibraryRWebCam = {341RWC.contexts[c].glTex = caps1 & (1 << RWC.RETRO_CAMERA_BUFFER_OPENGL_TEXTURE);342RWC.contexts[c].rawFb = caps1 & (1 << RWC.RETRO_CAMERA_BUFFER_RAW_FRAMEBUFFER);343344- navigator.getMedia({video: true, audio: false}, function(stream) {345- RWC.contexts[c].videoElement.autoplay = true;346- RWC.contexts[c].videoElement.src = URL.createObjectURL(stream);347- RWC.contexts[c].runMode = 2;348- }, function (err) {349- console.log("webcam request failed", err);350+ if (!window.disableWebCam) {351+ navigator.mediaDevices.getUserMedia({video: true, audio: false}).then(function(stream) {352+ RWC.contexts[c].videoElement.autoplay = true;353+ RWC.contexts[c].videoElement.srcObject = stream;354+ RWC.contexts[c].runMode = 2;355+ }).catch(function (err) {356+ console.log("Webcam request failed", err);357+ RWC.runMode = 0;358+ });359+ } else {360+ console.log("Webcam disabled.");361RWC.runMode = 0;362- });363+ }364365// for getting/storing texture id in GL mode366if (!RWC.tmp) RWC.tmp = _malloc(4);367@@ -53,7 +53,6 @@ var LibraryRWebCam = {368369RWebCamFree: function(data) {370RWC.contexts[data].videoElement.pause();371- URL.revokeObjectURL(RWC.contexts[data].videoElement.src);372RWC.contexts[data].videoElement = null;373RWC.contexts[data] = null;374},375@@ -81,6 +80,7 @@ var LibraryRWebCam = {376}377if (RWC.contexts[data].rawFb) {378RWC.contexts[data].rawFbCanvas = document.createElement("canvas");379+ RWC.contexts[data].rawFbCanvas.classList.add("retroarchWebcamCanvas");380ret = 1;381}382383diff --git a/frontend/drivers/platform_emscripten.c b/frontend/drivers/platform_emscripten.c384index a33cc6bf29..ccd8fe9d80 100644385--- a/frontend/drivers/platform_emscripten.c386+++ b/frontend/drivers/platform_emscripten.c387@@ -46,10 +46,15 @@388#include "../../tasks/tasks_internal.h"389#include "../../file_path_special.h"390#include "../../paths.h"391+#include "../../cheat_manager.h"392393void dummyErrnoCodes(void);394void emscripten_mainloop(void);395396+//// begin exported functions397+398+// saves and states399+400void cmd_savefiles(void)401{402command_event(CMD_EVENT_SAVE_FILES, NULL);403@@ -65,11 +70,111 @@ void cmd_load_state(void)404command_event(CMD_EVENT_LOAD_STATE, NULL);405}406407+void cmd_undo_save_state(void)408+{409+ command_event(CMD_EVENT_UNDO_SAVE_STATE, NULL);410+}411+412+void cmd_undo_load_state(void)413+{414+ command_event(CMD_EVENT_UNDO_LOAD_STATE, NULL);415+}416+417+// misc418+419void cmd_take_screenshot(void)420{421command_event(CMD_EVENT_TAKE_SCREENSHOT, NULL);422}423424+void cmd_toggle_menu(void)425+{426+ command_event(CMD_EVENT_MENU_TOGGLE, NULL);427+}428+429+void cmd_reload_config(void)430+{431+ command_event(CMD_EVENT_RELOAD_CONFIG, NULL);432+}433+434+void cmd_toggle_grab_mouse(void)435+{436+ command_event(CMD_EVENT_GRAB_MOUSE_TOGGLE, NULL);437+}438+439+void cmd_toggle_game_focus(void)440+{441+ command_event(CMD_EVENT_GAME_FOCUS_TOGGLE, NULL);442+}443+444+void cmd_reset(void)445+{446+ command_event(CMD_EVENT_RESET, NULL);447+}448+449+void cmd_toggle_pause(void)450+{451+ command_event(CMD_EVENT_PAUSE_TOGGLE, NULL);452+}453+454+void cmd_pause(void)455+{456+ command_event(CMD_EVENT_PAUSE, NULL);457+}458+459+void cmd_unpause(void)460+{461+ command_event(CMD_EVENT_UNPAUSE, NULL);462+}463+464+void cmd_set_volume(float volume) {465+ // TODO: update retroarch466+}467+468+bool cmd_set_shader(const char *path)469+{470+ return retroarch_set_shader(path);471+}472+473+// cheats474+475+void cmd_cheat_set_code(unsigned index, const char *str)476+{477+ cheat_manager_set_code(index, str);478+}479+480+const char *cmd_cheat_get_code(unsigned index)481+{482+ return cheat_manager_get_code(index);483+}484+485+void cmd_cheat_toggle_index(bool apply_cheats_after_toggle, unsigned index)486+{487+ cheat_manager_toggle_index(apply_cheats_after_toggle, index);488+}489+490+bool cmd_cheat_get_code_state(unsigned index)491+{492+ return cheat_manager_get_code_state(index);493+}494+495+bool cmd_cheat_realloc(unsigned new_size)496+{497+ return cheat_manager_realloc(new_size, CHEAT_HANDLER_TYPE_EMU);498+}499+500+unsigned cmd_cheat_get_size(void)501+{502+ return cheat_manager_get_size();503+}504+505+void cmd_cheat_apply_cheats(void)506+{507+ cheat_manager_apply_cheats();508+}509+510+//// end exported functions511+512static void frontend_emscripten_get_env(int *argc, char *argv[],513void *args, void *params_data)514{515@@ -164,9 +269,10 @@ static void frontend_emscripten_get_env(int *argc, char *argv[],516int main(int argc, char *argv[])517{518dummyErrnoCodes();519-520+#ifndef NO_INITIAL_CANVAS_RESIZE521emscripten_set_canvas_element_size("#canvas", 800, 600);522emscripten_set_element_css_size("#canvas", 800.0, 600.0);523+#endif524emscripten_set_main_loop(emscripten_mainloop, 0, 0);525rarch_main(argc, argv, NULL);526527diff --git a/gfx/drivers_context/emscriptenegl_ctx.c b/gfx/drivers_context/emscriptenegl_ctx.c528index b78d5e296d..8ee63f458e 100644529--- a/gfx/drivers_context/emscriptenegl_ctx.c530+++ b/gfx/drivers_context/emscriptenegl_ctx.c531@@ -51,7 +51,7 @@ typedef struct532static void gfx_ctx_emscripten_swap_interval(void *data, int interval)533{534if (interval == 0)535- emscripten_set_main_loop_timing(EM_TIMING_SETIMMEDIATE, 0);536+ emscripten_set_main_loop_timing(EM_TIMING_RAF, 1);537else538emscripten_set_main_loop_timing(EM_TIMING_RAF, interval);539}540@@ -62,6 +62,7 @@ static void gfx_ctx_emscripten_get_canvas_size(int *width, int *height)541bool is_fullscreen = false;542EMSCRIPTEN_RESULT r = emscripten_get_fullscreen_status(&fullscreen_status);543544+#ifndef NO_CANVAS_FULLSCREEN545if (r == EMSCRIPTEN_RESULT_SUCCESS)546{547if (fullscreen_status.isFullscreen)548@@ -71,6 +72,7 @@ static void gfx_ctx_emscripten_get_canvas_size(int *width, int *height)549*height = fullscreen_status.screenHeight;550}551}552+#endif553554if (!is_fullscreen)555{556@@ -89,7 +91,6 @@ static void gfx_ctx_emscripten_get_canvas_size(int *width, int *height)557static void gfx_ctx_emscripten_check_window(void *data, bool *quit,558bool *resize, unsigned *width, unsigned *height)559{560- EMSCRIPTEN_RESULT r;561int input_width;562int input_height;563emscripten_ctx_data_t *emscripten = (emscripten_ctx_data_t*)data;564@@ -106,10 +107,12 @@ static void gfx_ctx_emscripten_check_window(void *data, bool *quit,565*width = (unsigned)input_width;566*height = (unsigned)input_height;567*resize = false;568-569+#ifndef NO_AUTO_CANVAS_RESIZE570if (input_width != emscripten->fb_width ||571input_height != emscripten->fb_height)572{573+ EMSCRIPTEN_RESULT r;574+575r = emscripten_set_canvas_element_size("#canvas",576input_width, input_height);577578@@ -125,9 +128,16 @@ static void gfx_ctx_emscripten_check_window(void *data, bool *quit,579580*resize = true;581}582+#endif583584+#ifdef WEB_SCALING585+ double dpr = emscripten_get_device_pixel_ratio();586+ emscripten->fb_width = (unsigned)(input_width * dpr);587+ emscripten->fb_height = (unsigned)(input_height * dpr);588+#else589emscripten->fb_width = (unsigned)input_width;590emscripten->fb_height = (unsigned)input_height;591+#endif592*quit = false;593}594595diff --git a/input/drivers/rwebinput_input.c b/input/drivers/rwebinput_input.c596index be4b631bde..94b2e1c67b 100644597--- a/input/drivers/rwebinput_input.c598+++ b/input/drivers/rwebinput_input.c599@@ -24,6 +24,9 @@600#include <encodings/crc32.h>601#include <encodings/utf.h>602603+#ifdef WEB_SCALING604+#include <emscripten/emscripten.h>605+#endif606#include <emscripten/html5.h>607608#include "../input_keymaps.h"609@@ -265,10 +268,18 @@ static EM_BOOL rwebinput_mouse_cb(int event_type,610611uint8_t mask = 1 << mouse_event->button;612613+#ifdef WEB_SCALING614+ double dpr = emscripten_get_device_pixel_ratio();615+ rwebinput->mouse.x = (long)(mouse_event->targetX * dpr);616+ rwebinput->mouse.y = (long)(mouse_event->targetY * dpr);617+ rwebinput->mouse.pending_delta_x += (long)(mouse_event->movementX * dpr);618+ rwebinput->mouse.pending_delta_y += (long)(mouse_event->movementY * dpr);619+#else620rwebinput->mouse.x = mouse_event->targetX;621rwebinput->mouse.y = mouse_event->targetY;622rwebinput->mouse.pending_delta_x += mouse_event->movementX;623rwebinput->mouse.pending_delta_y += mouse_event->movementY;624+#endif625626if (event_type == EMSCRIPTEN_EVENT_MOUSEDOWN)627rwebinput->mouse.buttons |= mask;628@@ -283,8 +294,26 @@ static EM_BOOL rwebinput_wheel_cb(int event_type,629{630rwebinput_input_t *rwebinput = (rwebinput_input_t*)user_data;631632+#ifdef WEB_SCALING633+ double dpr = emscripten_get_device_pixel_ratio();634+ rwebinput->mouse.pending_scroll_x += wheel_event->deltaX * dpr;635+ rwebinput->mouse.pending_scroll_y += wheel_event->deltaY * dpr;636+#else637rwebinput->mouse.pending_scroll_x += wheel_event->deltaX;638rwebinput->mouse.pending_scroll_y += wheel_event->deltaY;639+#endif640+641+ return EM_TRUE;642+}643+644+static EM_BOOL rwebinput_pointerlockchange_cb(int event_type,645+ const EmscriptenPointerlockChangeEvent *pointerlock_change_event, void *user_data)646+{647+ if (!pointerlock_change_event->isActive)648+ {649+ retroarch_game_focus_off();650+ retroarch_grab_mouse_off();651+ }652653return EM_TRUE;654}655@@ -360,6 +389,15 @@ static void *rwebinput_input_init(const char *joypad_driver)656"[EMSCRIPTEN/INPUT] failed to create wheel callback: %d\n", r);657}658659+ r = emscripten_set_pointerlockchange_callback(660+ EMSCRIPTEN_EVENT_TARGET_DOCUMENT, rwebinput, false,661+ rwebinput_pointerlockchange_cb);662+ if (r != EMSCRIPTEN_RESULT_SUCCESS)663+ {664+ RARCH_ERR(665+ "[EMSCRIPTEN/INPUT] failed to create pointerlockchange callback: %d\n", r);666+ }667+668input_keymaps_init_keyboard_lut(rarch_key_map_rwebinput);669670return rwebinput;671@@ -537,7 +575,7 @@ static int16_t rwebinput_input_state(672vp.full_height = 0;673674if (!(video_driver_translate_coord_viewport_wrap(675- &vp, mouse->x, mouse->x,676+ &vp, mouse->x, mouse->y,677&res_x, &res_y, &res_screen_x, &res_screen_y)))678return 0;679680@@ -628,8 +666,10 @@ static void rwebinput_process_keyboard_events(681character = '\t';682683if (translated_keycode != RETROK_UNKNOWN)684+ {685input_keyboard_event(keydown, translated_keycode, character, mod,686RETRO_DEVICE_KEYBOARD);687+ }688689if ( translated_keycode < RETROK_LAST690&& translated_keycode != RETROK_UNKNOWN)691diff --git a/menu/drivers/materialui.c b/menu/drivers/materialui.c692index e591cebd0e..d71581fab9 100644693--- a/menu/drivers/materialui.c694+++ b/menu/drivers/materialui.c695@@ -2294,10 +2294,12 @@ static void materialui_context_reset_textures(materialui_handle_t *mui)696}697698/* Warn user if assets are missing */699+#ifndef NO_MISSING_ASSET_WARNING700if (!has_all_assets)701runloop_msg_queue_push(702msg_hash_to_str(MSG_MISSING_ASSETS), 1, 256, false, NULL,703MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO);704+#endif705}706707static void materialui_draw_icon(708diff --git a/menu/drivers/ozone/ozone.c b/menu/drivers/ozone/ozone.c709index 90b814ed3d..9bd20f4f0b 100644710--- a/menu/drivers/ozone/ozone.c711+++ b/menu/drivers/ozone/ozone.c712@@ -743,6 +743,8 @@ static void *ozone_init(void **userdata, bool video_is_threaded)713ozone->animations.left_thumbnail_alpha = 1.0f;714ozone->force_metadata_display = false;715716+ ozone->minimal_assets = settings->bools.menu_minimal_assets;717+718gfx_thumbnail_set_stream_delay(-1.0f);719gfx_thumbnail_set_fade_duration(-1.0f);720gfx_thumbnail_set_fade_missing(false);721@@ -1244,7 +1246,7 @@ static void ozone_context_reset(void *data, bool is_threaded)722else723{724#endif725- if (!gfx_display_reset_textures_list(filename, ozone->png_path, &ozone->textures[i], TEXTURE_FILTER_MIPMAP_LINEAR, NULL, NULL))726+ if (!gfx_display_reset_textures_list(filename, ozone->png_path, &ozone->textures[i], TEXTURE_FILTER_MIPMAP_LINEAR, NULL, NULL) && !ozone->minimal_assets)727ozone->has_all_assets = false;728#if 0729}730@@ -1263,14 +1265,15 @@ static void ozone_context_reset(void *data, bool is_threaded)731732if (!gfx_display_reset_textures_list(filename, ozone->tab_path, &ozone->tab_textures[i], TEXTURE_FILTER_MIPMAP_LINEAR, NULL, NULL))733{734- ozone->has_all_assets = false;735+ if (!ozone->minimal_assets)736+ ozone->has_all_assets = false;737RARCH_WARN("[OZONE] Asset missing: %s%s%s\n", ozone->tab_path,738PATH_DEFAULT_SLASH(), filename);739}740}741742/* Theme textures */743- if (!ozone_reset_theme_textures(ozone))744+ if (!ozone_reset_theme_textures(ozone) && !ozone->minimal_assets)745ozone->has_all_assets = false;746747/* Icons textures init */748@@ -1278,7 +1281,8 @@ static void ozone_context_reset(void *data, bool is_threaded)749{750if (!gfx_display_reset_textures_list(ozone_entries_icon_texture_path(i), ozone->icons_path, &ozone->icons_textures[i], TEXTURE_FILTER_MIPMAP_LINEAR, NULL, NULL))751{752- ozone->has_all_assets = false;753+ if (!ozone->minimal_assets)754+ ozone->has_all_assets = false;755RARCH_WARN("[OZONE] Asset missing: %s%s%s\n", ozone->icons_path,756PATH_DEFAULT_SLASH(), ozone_entries_icon_texture_path(i));757}758@@ -1307,8 +1311,10 @@ static void ozone_context_reset(void *data, bool is_threaded)759ozone->animations.list_alpha = 1.0f;760761/* Missing assets message */762+#ifndef NO_MISSING_ASSET_WARNING763if (!ozone->has_all_assets)764runloop_msg_queue_push(msg_hash_to_str(MSG_MISSING_ASSETS), 1, 256, false, NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO);765+#endif766767/* Thumbnails */768ozone_update_thumbnail_image(ozone);769diff --git a/menu/drivers/ozone/ozone.h b/menu/drivers/ozone/ozone.h770index 578c26ce1a..2bfd33bf73 100644771--- a/menu/drivers/ozone/ozone.h772+++ b/menu/drivers/ozone/ozone.h773@@ -292,6 +292,8 @@ struct ozone_handle774775bool force_metadata_display;776777+ bool minimal_assets;778+779bool is_db_manager_list;780bool is_file_list;781bool is_quick_menu;782diff --git a/menu/drivers/xmb.c b/menu/drivers/xmb.c783index a5da529592..4e020e6a7c 100644784--- a/menu/drivers/xmb.c785+++ b/menu/drivers/xmb.c786@@ -6050,7 +6050,9 @@ static void xmb_context_reset_textures(787&& !(settings->uints.menu_xmb_theme == XMB_ICON_THEME_CUSTOM)788)789{790+#ifndef NO_MISSING_ASSET_WARNING791runloop_msg_queue_push(msg_hash_to_str(MSG_MISSING_ASSETS), 1, 256, false, NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO);792+#endif793/* Do not draw icons if subsetting is missing */794goto error;795}796diff --git a/retroarch.c b/retroarch.c797index 9d3add82cd..4c0a3b494a 100644798--- a/retroarch.c799+++ b/retroarch.c800@@ -11077,6 +11077,10 @@ static bool command_set_shader(const char *arg)801802return retroarch_apply_shader(type, arg, true);803}804+805+bool retroarch_set_shader(const char *path) {806+ return command_set_shader(path);807+}808#endif809810/* TRANSLATION */811@@ -13395,6 +13399,14 @@ static bool input_driver_ungrab_mouse(struct rarch_state *p_rarch)812return true;813}814815+void retroarch_grab_mouse_off(void)816+{817+ struct rarch_state *p_rarch = &rarch_st;818+819+ if (p_rarch->input_driver_grab_mouse_state)820+ command_event(CMD_EVENT_GRAB_MOUSE_TOGGLE, NULL);821+}822+823static void command_event_reinit(struct rarch_state *p_rarch,824const int flags)825{826@@ -13507,6 +13519,17 @@ static void retroarch_game_focus_free(struct rarch_state *p_rarch)827p_rarch->game_focus_state.core_requested = false;828}829830+void retroarch_game_focus_off(void)831+{832+ struct rarch_state *p_rarch = &rarch_st;833+834+ if (p_rarch->game_focus_state.enabled)835+ {836+ enum input_game_focus_cmd_type game_focus_cmd = GAME_FOCUS_CMD_OFF;837+ command_event(CMD_EVENT_GAME_FOCUS_TOGGLE, &game_focus_cmd);838+ }839+}840+841static void retroarch_system_info_free(struct rarch_state *p_rarch)842{843rarch_system_info_t *sys_info = &p_rarch->runloop_system;844@@ -13576,6 +13599,9 @@ bool command_event(enum event_command cmd, void *data)845846switch (cmd)847{848+ case CMD_EVENT_RELOAD_CONFIG:849+ config_load(&p_rarch->g_extern);850+ break;851case CMD_EVENT_SAVE_FILES:852event_save_files(p_rarch->rarch_use_sram);853break;854@@ -16639,9 +16665,14 @@ static bool dynamic_request_hw_context(enum retro_hw_context_type type,855#endif856case RETRO_HW_CONTEXT_OPENGL:857case RETRO_HW_CONTEXT_OPENGL_CORE:858+#ifdef HAVE_REGAL859+ RARCH_LOG("Requesting OpenGL context (Regal).\n");860+ break;861+#else862RARCH_ERR("Requesting OpenGL context, but RetroArch "863"is compiled against OpenGLES. Cannot use HW context.\n");864return false;865+#endif866867#elif defined(HAVE_OPENGL) || defined(HAVE_OPENGL_CORE)868case RETRO_HW_CONTEXT_OPENGLES2:869diff --git a/retroarch.h b/retroarch.h870index 5e8e7a513f..ff0a1dc3db 100644871--- a/retroarch.h872+++ b/retroarch.h873@@ -396,6 +396,14 @@ void rarch_favorites_init(void);874875void rarch_favorites_deinit(void);876877+void retroarch_grab_mouse_off(void);878+879+void retroarch_game_focus_off(void);880+881+#if defined(HAVE_CG) || defined(HAVE_GLSL) || defined(HAVE_SLANG) || defined(HAVE_HLSL)882+bool retroarch_set_shader(const char *path);883+#endif884+885/* Audio */886887#ifdef HAVE_AUDIOMIXER888889890