From fbea85d1bdc2be854fd6c9aaf150128716b992a7 Mon Sep 17 00:00:00 2001 From: "Joseph C. Osborn" Date: Tue, 12 Sep 2023 14:45:22 -0700 Subject: [PATCH 1/9] Increase emscripten stack size and decrease path size to fix emscripten builds broken since de45fc2 --- Makefile.emscripten | 7 +++++-- libretro-common/include/retro_miscellaneous.h | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/Makefile.emscripten b/Makefile.emscripten index fa5d5b88e70..261294ae9be 100644 --- a/Makefile.emscripten +++ b/Makefile.emscripten @@ -127,8 +127,8 @@ ifneq ($(V), 1) endif ifeq ($(DEBUG), 1) - LDFLAGS += -O0 -g - CFLAGS += -O0 -g + LDFLAGS += -O3 -g -gsource-map -s SAFE_HEAP=1 -s SAFE_HEAP_LOG=1 -s STACK_OVERFLOW_CHECK=2 -s ASSERTIONS=1 + CFLAGS += -O3 -g -gsource-map -s SAFE_HEAP=1 -s SAFE_HEAP_LOG=1 -s STACK_OVERFLOW_CHECK=2 -s ASSERTIONS=1 else LDFLAGS += -O3 -s WASM=1 # WARNING: some optimizations can break some cores (ex: LTO breaks tyrquake) @@ -139,6 +139,9 @@ else CFLAGS += -O3 endif +# 128 * 1024, double the usual emscripten stack size +LDFLAGS += -s STACK_SIZE=131072 + CFLAGS += -Wall -I. -Ilibretro-common/include -std=gnu99 $(LIBS) #\ # -s EXPORTED_FUNCTIONS="['_main', '_malloc', '_cmd_savefiles', '_cmd_save_state', '_cmd_take_screenshot']" diff --git a/libretro-common/include/retro_miscellaneous.h b/libretro-common/include/retro_miscellaneous.h index 953ab186001..a42ed176b68 100644 --- a/libretro-common/include/retro_miscellaneous.h +++ b/libretro-common/include/retro_miscellaneous.h @@ -90,7 +90,7 @@ static INLINE bool bits_any_different(uint32_t *a, uint32_t *b, uint32_t count) } #ifndef PATH_MAX_LENGTH -#if defined(_XBOX1) || defined(_3DS) || defined(PSP) || defined(PS2) || defined(GEKKO)|| defined(WIIU) || defined(__PSL1GHT__) || defined(__PS3__) +#if defined(_XBOX1) || defined(_3DS) || defined(PSP) || defined(PS2) || defined(GEKKO)|| defined(WIIU) || defined(__PSL1GHT__) || defined(__PS3__) || defined(HAVE_EMSCRIPTEN) #define PATH_MAX_LENGTH 512 #else #define PATH_MAX_LENGTH 4096 From 28454e7d937614a323c0f3d2743b2dc79b4a7be1 Mon Sep 17 00:00:00 2001 From: "Joseph C. Osborn" Date: Mon, 11 Sep 2023 09:35:06 -0700 Subject: [PATCH 2/9] use modularize flags for better-behaved javascript output --- Makefile.emscripten | 1 + pkg/emscripten/libretro/libretro.js | 143 +++++++++++++++------------- 2 files changed, 79 insertions(+), 65 deletions(-) diff --git a/Makefile.emscripten b/Makefile.emscripten index 261294ae9be..f2e3cd72f5b 100644 --- a/Makefile.emscripten +++ b/Makefile.emscripten @@ -80,6 +80,7 @@ OBJDIR := obj-emscripten LIBS := -s USE_ZLIB=1 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']" \ -s ALLOW_MEMORY_GROWTH=1 -s EXPORTED_FUNCTIONS="['_main', '_malloc', '_cmd_savefiles', '_cmd_save_state', '_cmd_load_state', '_cmd_take_screenshot']" \ + -s MODULARIZE=1 -s EXPORT_ES6=1 -s EXPORT_NAME=$LIBRETRO \ --js-library emscripten/library_errno_codes.js \ --js-library emscripten/library_rwebcam.js diff --git a/pkg/emscripten/libretro/libretro.js b/pkg/emscripten/libretro/libretro.js index 48a3e233c83..4977a79bb0c 100644 --- a/pkg/emscripten/libretro/libretro.js +++ b/pkg/emscripten/libretro/libretro.js @@ -7,6 +7,69 @@ var BrowserFS = BrowserFS; var afs; var initializationCount = 0; +var Module = { + noInitialRun: true, + arguments: ["-v", "--menu"], + + encoder: new TextEncoder(), + message_queue:[], + message_out:[], + message_accum:"", + + retroArchSend: function(msg) { + let bytes = this.encoder.encode(msg+"\n"); + this.message_queue.push([bytes,0]); + }, + retroArchRecv: function() { + let out = this.message_out.shift(); + if(out == null && this.message_accum != "") { + out = this.message_accum; + this.message_accum = ""; + } + return out; + }, + preRun: [ + function(module) { + function stdin() { + // Return ASCII code of character, or null if no input + while(module.message_queue.length > 0){ + var msg = module.message_queue[0][0]; + var index = module.message_queue[0][1]; + if(index >= msg.length) { + module.message_queue.shift(); + } else { + module.message_queue[0][1] = index+1; + // assumption: msg is a uint8array + return msg[index]; + } + } + return null; + } + module.FS.init(stdin); + } + ], + postRun: [], + onRuntimeInitialized: function(module) + { + appInitialized(); + }, + print: function(module, text) + { + console.log(text); + }, + printErr: function(module, text) + { + console.log(text); + }, + canvas: document.getElementById('canvas'), + totalDependencies: 0, + monitorRunDependencies: function(left) + { + this.totalDependencies = Math.max(this.totalDependencies, left); + } +}; + + function cleanupStorage() { localStorage.clear(); @@ -120,7 +183,7 @@ function setupFileSystem(backend) mfs.mount('/home/web_user/retroarch/userdata/content/downloads', xfs2); BrowserFS.initialize(mfs); var BFS = new BrowserFS.EmscriptenFS(); - FS.mount(BFS, {root: '/home'}, '/home'); + Module.FS.mount(BFS, {root: '/home'}, '/home'); console.log("WEBPLAYER: " + backend + " filesystem initialization successful"); } @@ -149,10 +212,10 @@ function startRetroArch() document.getElementById("btnRom").disabled = false; document.getElementById("btnMenu").disabled = false; document.getElementById("btnFullscreen").disabled = false; - + Module['callMain'](Module['arguments']); Module['resumeMainLoop'](); - document.getElementById('canvas').focus(); + document.getElementById('canvas').focus(); } function selectFiles(files) @@ -184,66 +247,13 @@ function selectFiles(files) function uploadData(data,name) { var dataView = new Uint8Array(data); - FS.createDataFile('/', name, dataView, true, false); - - var data = FS.readFile(name,{ encoding: 'binary' }); - FS.writeFile('/home/web_user/retroarch/userdata/content/' + name, data ,{ encoding: 'binary' }); - FS.unlink(name); -} - -var encoder = new TextEncoder(); -var message_queue = []; + Module.FS.createDataFile('/', name, dataView, true, false); -function retroArchSend(msg) { - var bytes = encoder.encode(msg+"\n"); - message_queue.push([bytes,0]); + var data = Module.FS.readFile(name,{ encoding: 'binary' }); + Module.FS.writeFile('/home/web_user/retroarch/userdata/content/' + name, data ,{ encoding: 'binary' }); + Module.FS.unlink(name); } -var Module = -{ - noInitialRun: true, - arguments: ["-v", "--menu"], - preRun: [ - function() { - function stdin() { - // Return ASCII code of character, or null if no input - while(message_queue.length > 0){ - var msg = message_queue[0][0]; - var index = message_queue[0][1]; - if(index >= msg.length) { - message_queue.shift(); - } else { - message_queue[0][1] = index+1; - // assumption: msg is a uint8array - return msg[index]; - } - } - return null; - } - FS.init(stdin); - } - ], - postRun: [], - onRuntimeInitialized: function() - { - appInitialized(); - }, - print: function(text) - { - console.log(text); - }, - printErr: function(text) - { - console.log(text); - }, - canvas: document.getElementById('canvas'), - totalDependencies: 0, - monitorRunDependencies: function(left) - { - this.totalDependencies = Math.max(this.totalDependencies, left); - } -}; - function switchCore(corename) { localStorage.setItem("core", corename); } @@ -324,11 +334,14 @@ $(function() { // Load the Core's related JavaScript. $.getScript(core + '_libretro.js', function () { - $('#icnRun').removeClass('fa-spinner').removeClass('fa-spin'); - $('#icnRun').addClass('fa-play'); - $('#lblDrop').removeClass('active'); - $('#lblLocal').addClass('active'); - idbfsInit(); + window[core](Module).then(mod => { + Module = mod; + $('#icnRun').removeClass('fa-spinner').removeClass('fa-spin'); + $('#icnRun').addClass('fa-play'); + $('#lblDrop').removeClass('active'); + $('#lblLocal').addClass('active'); + idbfsInit(); + }) }); }); From c96603155a74208d1f53dc5284dcd3a944b0ef48 Mon Sep 17 00:00:00 2001 From: "Joseph C. Osborn" Date: Mon, 11 Sep 2023 10:58:45 -0700 Subject: [PATCH 3/9] makefile and loader changes --- Makefile.emscripten | 8 +- dist-scripts/dist-cores.sh | 4 +- pkg/emscripten/libretro/libretro.js | 133 ++++++++++++++++------------ 3 files changed, 84 insertions(+), 61 deletions(-) diff --git a/Makefile.emscripten b/Makefile.emscripten index f2e3cd72f5b..ab1fdd1ddb5 100644 --- a/Makefile.emscripten +++ b/Makefile.emscripten @@ -2,6 +2,7 @@ HAVE_STATIC_DUMMY ?= 0 ifeq ($(TARGET),) ifeq ($(LIBRETRO),) TARGET := retroarch.js +LIBRETRO = dummy else TARGET := $(LIBRETRO)_libretro.js endif @@ -78,9 +79,10 @@ OBJDIR := obj-emscripten #if you compile with SDL2 flag add this Emscripten flag "-s USE_SDL=2" to LDFLAGS: LIBS := -s USE_ZLIB=1 -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']" \ - -s ALLOW_MEMORY_GROWTH=1 -s EXPORTED_FUNCTIONS="['_main', '_malloc', '_cmd_savefiles', '_cmd_save_state', '_cmd_load_state', '_cmd_take_screenshot']" \ - -s MODULARIZE=1 -s EXPORT_ES6=1 -s EXPORT_NAME=$LIBRETRO \ +LDFLAGS := -L. --no-heap-copy -s $(LIBS) -s TOTAL_MEMORY=$(MEMORY) -s NO_EXIT_RUNTIME=0 -s FULL_ES2=1 \ + -s "EXPORTED_RUNTIME_METHODS=['callMain', 'FS', 'PATH', 'ERRNO_CODES']" \ + -s ALLOW_MEMORY_GROWTH=1 -s "EXPORTED_FUNCTIONS=['_main', '_malloc', '_cmd_savefiles', '_cmd_save_state', '_cmd_load_state', '_cmd_take_screenshot']" \ + -s MODULARIZE=1 -s EXPORT_ES6=1 -s EXPORT_NAME="$(LIBRETRO)" \ --js-library emscripten/library_errno_codes.js \ --js-library emscripten/library_rwebcam.js diff --git a/dist-scripts/dist-cores.sh b/dist-scripts/dist-cores.sh index 13f603c9b0a..5c4c675e4c9 100755 --- a/dist-scripts/dist-cores.sh +++ b/dist-scripts/dist-cores.sh @@ -247,8 +247,8 @@ for f in `ls -v *_${platform}.${EXT}`; do if [ $MAKEFILE_GRIFFIN = "yes" ]; then make -C ../ -f Makefile.griffin $OPTS platform=${platform} $whole_archive $big_stack -j3 || exit 1 elif [ $PLATFORM = "emscripten" ]; then - echo "BUILD COMMAND: make -C ../ -f Makefile.emscripten PTHREAD=$pthread ASYNC=$async LTO=$lto -j7 TARGET=${name}_libretro.js" - make -C ../ -f Makefile.emscripten $OPTS PTHREAD=$pthread ASYNC=$async LTO=$lto -j7 TARGET=${name}_libretro.js || exit 1 + echo "BUILD COMMAND: make -C ../ -f Makefile.emscripten PTHREAD=$pthread ASYNC=$async LTO=$lto -j7 LIBRETRO=${name} TARGET=${name}_libretro.js" + make -C ../ -f Makefile.emscripten $OPTS PTHREAD=$pthread ASYNC=$async LTO=$lto -j7 LIBRETRO=${name} TARGET=${name}_libretro.js || exit 1 elif [ $PLATFORM = "unix" ]; then make -C ../ -f Makefile LINK=g++ $whole_archive $big_stack -j3 || exit 1 elif [ $PLATFORM = "ctr" ]; then diff --git a/pkg/emscripten/libretro/libretro.js b/pkg/emscripten/libretro/libretro.js index 4977a79bb0c..1164bb6e371 100644 --- a/pkg/emscripten/libretro/libretro.js +++ b/pkg/emscripten/libretro/libretro.js @@ -45,19 +45,38 @@ var Module = { } return null; } - module.FS.init(stdin); + function stdout(c) { + if(c == null) { + // flush + if(module.message_accum != "") { + module.message_out.push(module.message_accum); + module.message_accum = ""; + } + } else { + let s = String.fromCharCode(c); + if(s == "\n") { + if(module.message_accum != "") { + module.message_out.push(module.message_accum); + module.message_accum = ""; + } + } else { + module.message_accum = module.message_accum+s; + } + } + } + module.FS.init(stdin, stdout); } ], postRun: [], - onRuntimeInitialized: function(module) + onRuntimeInitialized: function() { appInitialized(); }, - print: function(module, text) + print: function(text) { console.log(text); }, - printErr: function(module, text) + printErr: function(text) { console.log(text); }, @@ -182,7 +201,7 @@ function setupFileSystem(backend) mfs.mount('/home/web_user/retroarch/bundle', xfs1); mfs.mount('/home/web_user/retroarch/userdata/content/downloads', xfs2); BrowserFS.initialize(mfs); - var BFS = new BrowserFS.EmscriptenFS(); + var BFS = new BrowserFS.EmscriptenFS(Module.FS, Module.PATH, Module.ERRNO_CODES); Module.FS.mount(BFS, {root: '/home'}, '/home'); console.log("WEBPLAYER: " + backend + " filesystem initialization successful"); } @@ -212,12 +231,13 @@ function startRetroArch() document.getElementById("btnRom").disabled = false; document.getElementById("btnMenu").disabled = false; document.getElementById("btnFullscreen").disabled = false; - - Module['callMain'](Module['arguments']); - Module['resumeMainLoop'](); - document.getElementById('canvas').focus(); -} + setTimeout(() => { + Module['callMain'](Module['arguments']); + Module['resumeMainLoop'](); + document.getElementById('canvas').focus(); + }, 0); +} function selectFiles(files) { $('#btnAdd').addClass('disabled'); @@ -283,77 +303,78 @@ $(function() { /** * Attempt to disable some default browser keys. */ - var keys = { - 9: "tab", - 13: "enter", - 16: "shift", - 18: "alt", - 27: "esc", - 33: "rePag", - 34: "avPag", - 35: "end", - 36: "home", - 37: "left", - 38: "up", - 39: "right", - 40: "down", - 112: "F1", - 113: "F2", - 114: "F3", - 115: "F4", - 116: "F5", - 117: "F6", - 118: "F7", - 119: "F8", - 120: "F9", - 121: "F10", - 122: "F11", - 123: "F12" - }; - window.addEventListener('keydown', function (e) { - if (keys[e.which]) { - e.preventDefault(); - } - }); + var keys = { + 9: "tab", + 13: "enter", + 16: "shift", + 18: "alt", + 27: "esc", + 33: "rePag", + 34: "avPag", + 35: "end", + 36: "home", + 37: "left", + 38: "up", + 39: "right", + 40: "down", + 112: "F1", + 113: "F2", + 114: "F3", + 115: "F4", + 116: "F5", + 117: "F6", + 118: "F7", + 119: "F8", + 120: "F9", + 121: "F10", + 122: "F11", + 123: "F12" + }; + window.addEventListener('keydown', function (e) { + if (keys[e.which]) { + e.preventDefault(); + } + }); // Switch the core when selecting one. $('#core-selector a').click(function () { var coreChoice = $(this).data('core'); switchCore(coreChoice); }); - // Find which core to load. var core = localStorage.getItem("core", core); if (!core) { core = 'gambatte'; } + loadCore(core); +}); + +function loadCore(core) { // Make the core the selected core in the UI. var coreTitle = $('#core-selector a[data-core="' + core + '"]').addClass('active').text(); $('#dropdownMenu1').text(coreTitle); // Load the Core's related JavaScript. - $.getScript(core + '_libretro.js', function () - { - window[core](Module).then(mod => { + import("./"+core+"_libretro.js").then(script => { + script.default(Module).then(mod => { Module = mod; $('#icnRun').removeClass('fa-spinner').removeClass('fa-spin'); $('#icnRun').addClass('fa-play'); $('#lblDrop').removeClass('active'); $('#lblLocal').addClass('active'); idbfsInit(); - }) - }); - }); + }).catch(err => { console.error("Couldn't instantiate module",err); throw err; }); + }).catch(err => { console.error("Couldn't load script",err); throw err; }); +} function keyPress(k) { + function kp(k, event) { + var oEvent = new KeyboardEvent(event, { code: k }); + + document.dispatchEvent(oEvent); + document.getElementById('canvas').focus(); + } kp(k, "keydown"); setTimeout(function(){kp(k, "keyup")}, 50); } - -kp = function(k, event) { - var oEvent = new KeyboardEvent(event, { code: k }); - - document.dispatchEvent(oEvent); - document.getElementById('canvas').focus(); -} From 868900716295708291ee49555c31f5b31c0da698 Mon Sep 17 00:00:00 2001 From: "Joseph C. Osborn" Date: Mon, 11 Sep 2023 13:42:02 -0700 Subject: [PATCH 4/9] use specialHTMLTargets to support modular access to canvas --- frontend/drivers/platform_emscripten.c | 8 ++++++-- gfx/drivers_context/emscriptenegl_ctx.c | 8 ++++---- input/drivers/rwebinput_input.c | 8 ++++---- pkg/emscripten/libretro/libretro.js | 8 +++----- 4 files changed, 17 insertions(+), 15 deletions(-) diff --git a/frontend/drivers/platform_emscripten.c b/frontend/drivers/platform_emscripten.c index c842a49854a..3856bdf08b4 100644 --- a/frontend/drivers/platform_emscripten.c +++ b/frontend/drivers/platform_emscripten.c @@ -160,8 +160,12 @@ int main(int argc, char *argv[]) { dummyErrnoCodes(); - emscripten_set_canvas_element_size("#canvas", 800, 600); - emscripten_set_element_css_size("#canvas", 800.0, 600.0); + EM_ASM({ + specialHTMLTargets["!canvas"] = Module.canvas; + }); + + emscripten_set_canvas_element_size("!canvas", 800, 600); + emscripten_set_element_css_size("!canvas", 800.0, 600.0); emscripten_set_main_loop(emscripten_mainloop, 0, 0); rarch_main(argc, argv, NULL); diff --git a/gfx/drivers_context/emscriptenegl_ctx.c b/gfx/drivers_context/emscriptenegl_ctx.c index 44805130857..2082aef98e7 100644 --- a/gfx/drivers_context/emscriptenegl_ctx.c +++ b/gfx/drivers_context/emscriptenegl_ctx.c @@ -70,7 +70,7 @@ static void gfx_ctx_emscripten_get_canvas_size(int *width, int *height) if (!is_fullscreen) { - r = emscripten_get_canvas_element_size("#canvas", width, height); + r = emscripten_get_canvas_element_size("!canvas", width, height); if (r != EMSCRIPTEN_RESULT_SUCCESS) { @@ -105,14 +105,14 @@ static void gfx_ctx_emscripten_check_window(void *data, bool *quit, if ( (input_width != emscripten->fb_width) || (input_height != emscripten->fb_height)) { - r = emscripten_set_canvas_element_size("#canvas", + r = emscripten_set_canvas_element_size("!canvas", input_width, input_height); if (r != EMSCRIPTEN_RESULT_SUCCESS) RARCH_ERR("[EMSCRIPTEN/EGL]: error resizing canvas: %d\n", r); /* fix Module.requestFullscreen messing with the canvas size */ - r = emscripten_set_element_css_size("#canvas", + r = emscripten_set_element_css_size("!canvas", (double)input_width, (double)input_height); if (r != EMSCRIPTEN_RESULT_SUCCESS) @@ -194,7 +194,7 @@ static void *gfx_ctx_emscripten_init(void *video_driver) * be grabbed? */ if ( (emscripten->initial_width == 0) || (emscripten->initial_height == 0)) - emscripten_get_canvas_element_size("#canvas", + emscripten_get_canvas_element_size("!canvas", &emscripten->initial_width, &emscripten->initial_height); diff --git a/input/drivers/rwebinput_input.c b/input/drivers/rwebinput_input.c index 729793d62f4..8da630c6f2f 100644 --- a/input/drivers/rwebinput_input.c +++ b/input/drivers/rwebinput_input.c @@ -317,7 +317,7 @@ static void *rwebinput_input_init(const char *joypad_driver) "[EMSCRIPTEN/INPUT] failed to create keypress callback: %d\n", r); } - r = emscripten_set_mousedown_callback("#canvas", rwebinput, false, + r = emscripten_set_mousedown_callback("!canvas", rwebinput, false, rwebinput_mouse_cb); if (r != EMSCRIPTEN_RESULT_SUCCESS) { @@ -325,7 +325,7 @@ static void *rwebinput_input_init(const char *joypad_driver) "[EMSCRIPTEN/INPUT] failed to create mousedown callback: %d\n", r); } - r = emscripten_set_mouseup_callback("#canvas", rwebinput, false, + r = emscripten_set_mouseup_callback("!canvas", rwebinput, false, rwebinput_mouse_cb); if (r != EMSCRIPTEN_RESULT_SUCCESS) { @@ -333,7 +333,7 @@ static void *rwebinput_input_init(const char *joypad_driver) "[EMSCRIPTEN/INPUT] failed to create mouseup callback: %d\n", r); } - r = emscripten_set_mousemove_callback("#canvas", rwebinput, false, + r = emscripten_set_mousemove_callback("!canvas", rwebinput, false, rwebinput_mouse_cb); if (r != EMSCRIPTEN_RESULT_SUCCESS) { @@ -651,7 +651,7 @@ static void rwebinput_input_poll(void *data) static void rwebinput_grab_mouse(void *data, bool state) { if (state) - emscripten_request_pointerlock("#canvas", EM_TRUE); + emscripten_request_pointerlock("!canvas", EM_TRUE); else emscripten_exit_pointerlock(); } diff --git a/pkg/emscripten/libretro/libretro.js b/pkg/emscripten/libretro/libretro.js index 1164bb6e371..b22df4f3483 100644 --- a/pkg/emscripten/libretro/libretro.js +++ b/pkg/emscripten/libretro/libretro.js @@ -232,11 +232,9 @@ function startRetroArch() document.getElementById("btnMenu").disabled = false; document.getElementById("btnFullscreen").disabled = false; - setTimeout(() => { - Module['callMain'](Module['arguments']); - Module['resumeMainLoop'](); - document.getElementById('canvas').focus(); - }, 0); + Module['callMain'](Module['arguments']); + Module['resumeMainLoop'](); + Module['canvas'].focus(); } function selectFiles(files) { From 935547679252aa118b94dc0c85846aaba21c4b3d Mon Sep 17 00:00:00 2001 From: "Joseph C. Osborn" Date: Wed, 13 Sep 2023 15:26:22 -0700 Subject: [PATCH 5/9] bind key events to canvas, not document This way focus means focus and we can have multiple RA instances in one page. --- Makefile.emscripten | 1 + input/drivers/rwebinput_input.c | 8 ++++---- pkg/emscripten/libretro/libretro.js | 11 ++++++----- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/Makefile.emscripten b/Makefile.emscripten index ab1fdd1ddb5..87056b7459b 100644 --- a/Makefile.emscripten +++ b/Makefile.emscripten @@ -83,6 +83,7 @@ LDFLAGS := -L. --no-heap-copy -s $(LIBS) -s TOTAL_MEMORY=$(MEMORY) -s NO_EXIT_RU -s "EXPORTED_RUNTIME_METHODS=['callMain', 'FS', 'PATH', 'ERRNO_CODES']" \ -s ALLOW_MEMORY_GROWTH=1 -s "EXPORTED_FUNCTIONS=['_main', '_malloc', '_cmd_savefiles', '_cmd_save_state', '_cmd_load_state', '_cmd_take_screenshot']" \ -s MODULARIZE=1 -s EXPORT_ES6=1 -s EXPORT_NAME="$(LIBRETRO)" \ + -s DISABLE_DEPRECATED_FIND_EVENT_TARGET_BEHAVIOR=1 \ --js-library emscripten/library_errno_codes.js \ --js-library emscripten/library_rwebcam.js diff --git a/input/drivers/rwebinput_input.c b/input/drivers/rwebinput_input.c index 8da630c6f2f..0cc23fc7476 100644 --- a/input/drivers/rwebinput_input.c +++ b/input/drivers/rwebinput_input.c @@ -291,7 +291,7 @@ static void *rwebinput_input_init(const char *joypad_driver) rwebinput_generate_lut(); r = emscripten_set_keydown_callback( - EMSCRIPTEN_EVENT_TARGET_DOCUMENT, rwebinput, false, + "!canvas", rwebinput, false, rwebinput_keyboard_cb); if (r != EMSCRIPTEN_RESULT_SUCCESS) { @@ -300,7 +300,7 @@ static void *rwebinput_input_init(const char *joypad_driver) } r = emscripten_set_keyup_callback( - EMSCRIPTEN_EVENT_TARGET_DOCUMENT, rwebinput, false, + "!canvas", rwebinput, false, rwebinput_keyboard_cb); if (r != EMSCRIPTEN_RESULT_SUCCESS) { @@ -309,7 +309,7 @@ static void *rwebinput_input_init(const char *joypad_driver) } r = emscripten_set_keypress_callback( - EMSCRIPTEN_EVENT_TARGET_DOCUMENT, rwebinput, false, + "!canvas", rwebinput, false, rwebinput_keyboard_cb); if (r != EMSCRIPTEN_RESULT_SUCCESS) { @@ -342,7 +342,7 @@ static void *rwebinput_input_init(const char *joypad_driver) } r = emscripten_set_wheel_callback( - EMSCRIPTEN_EVENT_TARGET_DOCUMENT, rwebinput, false, + "!canvas", rwebinput, false, rwebinput_wheel_cb); if (r != EMSCRIPTEN_RESULT_SUCCESS) { diff --git a/pkg/emscripten/libretro/libretro.js b/pkg/emscripten/libretro/libretro.js index b22df4f3483..2e7815b887a 100644 --- a/pkg/emscripten/libretro/libretro.js +++ b/pkg/emscripten/libretro/libretro.js @@ -80,7 +80,7 @@ var Module = { { console.log(text); }, - canvas: document.getElementById('canvas'), + canvas: document.getElementById("canvas"), totalDependencies: 0, monitorRunDependencies: function(left) { @@ -232,6 +232,8 @@ function startRetroArch() document.getElementById("btnMenu").disabled = false; document.getElementById("btnFullscreen").disabled = false; + Module["canvas"] = document.getElementById("canvas"); + Module["canvas"].addEventListener("click", () => Module["canvas"].focus()); Module['callMain'](Module['arguments']); Module['resumeMainLoop'](); Module['canvas'].focus(); @@ -286,7 +288,7 @@ function switchStorage(backend) { // When the browser has loaded everything. $(function() { - // Enable all available ToolTips. + // Enable all available ToolTips. $('.tooltip-enable').tooltip({ placement: 'right' }); @@ -351,10 +353,9 @@ function loadCore(core) { // Make the core the selected core in the UI. var coreTitle = $('#core-selector a[data-core="' + core + '"]').addClass('active').text(); $('#dropdownMenu1').text(coreTitle); - // Load the Core's related JavaScript. - import("./"+core+"_libretro.js").then(script => { - script.default(Module).then(mod => { + import("./"+core+"_libretro.js").then(script => { + script.default(Module).then(mod => { Module = mod; $('#icnRun').removeClass('fa-spinner').removeClass('fa-spin'); $('#icnRun').addClass('fa-play'); From 6d29c10930f26b96abe2924af5a23504f65840c5 Mon Sep 17 00:00:00 2001 From: "Joseph C. Osborn" Date: Thu, 28 Sep 2023 12:12:09 -0700 Subject: [PATCH 6/9] Work around an emscripten bug in strict mode --- Makefile.emscripten | 3 ++- emscripten/pre.js | 2 ++ pkg/emscripten/libretro/libretro.js | 3 ++- 3 files changed, 6 insertions(+), 2 deletions(-) create mode 100644 emscripten/pre.js diff --git a/Makefile.emscripten b/Makefile.emscripten index 87056b7459b..6a6e3d8536b 100644 --- a/Makefile.emscripten +++ b/Makefile.emscripten @@ -49,7 +49,6 @@ HAVE_7ZIP = 1 HAVE_BSV_MOVIE = 1 HAVE_AL = 1 - # WARNING -- READ BEFORE ENABLING # The rwebaudio driver is known to have several audio bugs, such as # minor crackling, or the entire page freezing/crashing. @@ -146,6 +145,8 @@ endif # 128 * 1024, double the usual emscripten stack size LDFLAGS += -s STACK_SIZE=131072 +LDFLAGS += --extern-pre-js emscripten/pre.js + CFLAGS += -Wall -I. -Ilibretro-common/include -std=gnu99 $(LIBS) #\ # -s EXPORTED_FUNCTIONS="['_main', '_malloc', '_cmd_savefiles', '_cmd_save_state', '_cmd_take_screenshot']" diff --git a/emscripten/pre.js b/emscripten/pre.js new file mode 100644 index 00000000000..ae4d12534ff --- /dev/null +++ b/emscripten/pre.js @@ -0,0 +1,2 @@ +// To work around a bug in emscripten's polyfills for setImmediate in strict mode +var setImmediate; diff --git a/pkg/emscripten/libretro/libretro.js b/pkg/emscripten/libretro/libretro.js index 2e7815b887a..b1cf0971195 100644 --- a/pkg/emscripten/libretro/libretro.js +++ b/pkg/emscripten/libretro/libretro.js @@ -6,6 +6,7 @@ var BrowserFS = BrowserFS; var afs; var initializationCount = 0; +var setImmediate; var Module = { noInitialRun: true, @@ -15,7 +16,7 @@ var Module = { message_queue:[], message_out:[], message_accum:"", - + retroArchSend: function(msg) { let bytes = this.encoder.encode(msg+"\n"); this.message_queue.push([bytes,0]); From c4267d9fa8b98e96c69e70a5d127da34e58c9426 Mon Sep 17 00:00:00 2001 From: Rob Loach Date: Sat, 30 Sep 2023 00:57:59 -0400 Subject: [PATCH 7/9] (Emscripten) Use console.error() for error messages --- pkg/emscripten/libretro/libretro.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/emscripten/libretro/libretro.js b/pkg/emscripten/libretro/libretro.js index b1cf0971195..00eeaab0c17 100644 --- a/pkg/emscripten/libretro/libretro.js +++ b/pkg/emscripten/libretro/libretro.js @@ -79,7 +79,7 @@ var Module = { }, printErr: function(text) { - console.log(text); + console.error(text); }, canvas: document.getElementById("canvas"), totalDependencies: 0, From 47a062ba55819fda1aa1afaa0f7727816e57443d Mon Sep 17 00:00:00 2001 From: "Joseph C. Osborn" Date: Thu, 2 Nov 2023 11:10:39 -0700 Subject: [PATCH 8/9] increase asyncify stack size --- Makefile.emscripten | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/Makefile.emscripten b/Makefile.emscripten index 6a6e3d8536b..2f29989433e 100644 --- a/Makefile.emscripten +++ b/Makefile.emscripten @@ -105,7 +105,10 @@ else endif ifeq ($(ASYNC), 1) - LDFLAGS += -s ASYNCIFY=$(ASYNC) + LDFLAGS += -s ASYNCIFY=$(ASYNC) -s ASYNCIFY_STACK_SIZE=8192 + ifeq ($(DEBUG), 1) + LDFLAGS += -s ASYNCIFY_DEBUG=1 # -s ASYNCIFY_ADVISE + endif endif ifeq ($(HAVE_SDL2), 1) @@ -130,8 +133,8 @@ ifneq ($(V), 1) endif ifeq ($(DEBUG), 1) - LDFLAGS += -O3 -g -gsource-map -s SAFE_HEAP=1 -s SAFE_HEAP_LOG=1 -s STACK_OVERFLOW_CHECK=2 -s ASSERTIONS=1 - CFLAGS += -O3 -g -gsource-map -s SAFE_HEAP=1 -s SAFE_HEAP_LOG=1 -s STACK_OVERFLOW_CHECK=2 -s ASSERTIONS=1 + LDFLAGS += -O0 -g -gsource-map -s SAFE_HEAP=1 -s STACK_OVERFLOW_CHECK=2 -s ASSERTIONS=1 + CFLAGS += -O0 -g -gsource-map -s SAFE_HEAP=1 -s SAFE_HEAP_LOG=1 -s STACK_OVERFLOW_CHECK=2 -s ASSERTIONS=1 else LDFLAGS += -O3 -s WASM=1 # WARNING: some optimizations can break some cores (ex: LTO breaks tyrquake) From 428055c3a7b59023ea582beb12dcb8e8d84d9b3f Mon Sep 17 00:00:00 2001 From: "Joseph C. Osborn" Date: Thu, 2 Nov 2023 12:22:19 -0700 Subject: [PATCH 9/9] Fix `-lm` flag-related compile warnings in emscripten --- Makefile.emscripten | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile.emscripten b/Makefile.emscripten index 2f29989433e..af1c122f7ad 100644 --- a/Makefile.emscripten +++ b/Makefile.emscripten @@ -150,7 +150,7 @@ LDFLAGS += -s STACK_SIZE=131072 LDFLAGS += --extern-pre-js emscripten/pre.js -CFLAGS += -Wall -I. -Ilibretro-common/include -std=gnu99 $(LIBS) #\ +CFLAGS += -Wall -I. -Ilibretro-common/include -std=gnu99 #\ # -s EXPORTED_FUNCTIONS="['_main', '_malloc', '_cmd_savefiles', '_cmd_save_state', '_cmd_take_screenshot']" RARCH_OBJ := $(addprefix $(OBJDIR)/,$(OBJ))