Skip to content

Commit ed1810d

Browse files
authoredJan 29, 2025··
Emscripten improvements (#17422)
1 parent 104561e commit ed1810d

26 files changed

+1008
-615
lines changed
 

‎.gitignore

+2
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,8 @@ retroarch.js
196196
retroarch.js.mem
197197
*.bc
198198
*.wasm
199+
*.wasm.map
200+
obj-emscripten/
199201

200202
# only ignore .js files in the repo root
201203
/*.js

‎CHANGES.md

+4
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@
77
- CHEEVOS: Include achievement state in netplay states
88
- CLOUDSYNC: Fix Windows path issues
99
- CLOUDSYNC: Workaround for duplicated requests bug
10+
- EMSCRIPTEN: Scale window to correct size
11+
- EMSCRIPTEN: Additional platform functions
12+
- EMSCRIPTEN/RWEBINPUT: Add touch input support
1013
- GENERAL: Fix save state auto increment
1114
- GENERAL: Fix softpatching with periods/dots in the file name
1215
- GENERAL: Fix compilation with --enable-videocore
@@ -34,6 +37,7 @@
3437
- SAVESTATES: Reset state index when loading new content
3538
- UWP: Fix slang shader compilation
3639
- VIDEO: Enable BFI setting for mobile platforms (mind the warnings)
40+
- VIDEO/OpenGLES: Fix FP/sRGB FBO support
3741
- VIDEO/SHADERS: Allow exact refresh rate sync with shader subframes
3842
- WEBPLAYER: Update core list for 1.20.0
3943

‎Makefile.common

+2-1
Original file line numberDiff line numberDiff line change
@@ -1570,10 +1570,11 @@ ifeq ($(HAVE_GL_CONTEXT), 1)
15701570
DEF_FLAGS += $(OPENGLES_CFLAGS)
15711571
ifeq ($(HAVE_OPENGLES3), 1)
15721572
DEFINES += -DHAVE_OPENGLES3
1573+
OBJ += $(LIBRETRO_COMM_DIR)/glsym/glsym_es3.o
15731574
else
15741575
DEFINES += -DHAVE_OPENGLES2
1576+
OBJ += $(LIBRETRO_COMM_DIR)/glsym/glsym_es2.o
15751577
endif
1576-
OBJ += $(LIBRETRO_COMM_DIR)/glsym/glsym_es2.o
15771578
else
15781579
DEFINES += -DHAVE_GL_SYNC
15791580
OBJ += $(LIBRETRO_COMM_DIR)/glsym/glsym_gl.o

‎Makefile.emscripten

+62-35
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ HAVE_REWIND = 1
2525
HAVE_AUDIOMIXER = 1
2626
HAVE_CC_RESAMPLER = 1
2727
HAVE_EGL = 1
28-
HAVE_OPENGLES = 1
2928
HAVE_RJPEG = 0
3029
HAVE_RPNG = 1
3130
HAVE_EMSCRIPTEN = 1
@@ -58,34 +57,49 @@ HAVE_CHD ?= 0
5857
# You have been warned.
5958
HAVE_RWEBAUDIO = 0
6059

61-
ASYNC ?= 0
62-
ifeq ($(LIBRETRO), mupen64plus)
63-
ASYNC = 1
64-
endif
60+
# help diagnose GL problems (can cause issues in normal operation)
61+
GL_DEBUG ?= 0
6562

66-
LTO ?= 0
67-
ifeq ($(LIBRETRO), tyrquake)
68-
LTO = 0
69-
endif
63+
# enable javascript filesystem tracking
64+
FS_DEBUG = 1
7065

71-
PTHREAD ?= 0
66+
HAVE_OPENGLES ?= 1
67+
HAVE_OPENGLES3 ?= 0
7268

73-
MEMORY ?= 134217728
69+
ASYNC ?= 0
70+
LTO ?= 0
71+
PTHREAD ?= 0
7472

75-
PRECISE_F32 = 1
73+
STACK_SIZE ?= 4194304
74+
INITIAL_HEAP ?= 134217728
75+
76+
# 4194304 ----- 4 MiB (Stack: recommended)
77+
# 8388608 ----- 8 MiB
78+
# 16777216 ---- 16 MiB
79+
# 33554432 ---- 32 MiB
80+
# 67108864 ---- 64 MiB
81+
# 134217728 --- 128 MiB (Heap: recommended) (Stack: recommended for some cores [mupen64plus_next])
82+
# 268435456 --- 256 MiB (Heap: recommended for some cores [mupen64plus_next])
83+
# 536870912 --- 512 MiB (Heap: needed for some cores [mednafen_psx(_hw)])
84+
# 1073741824 -- 1 GiB
85+
# 1610612736 -- 1.5 GiB
86+
# 2147483648 -- 2 GiB
7687

7788
OBJDIR := obj-emscripten
7889

79-
#if you compile with SDL2 flag add this Emscripten flag "-s USE_SDL=2" to LDFLAGS:
90+
EXPORTED_FUNCTIONS = _main,_malloc,_free,_cmd_savefiles,_cmd_save_state,_cmd_load_state,_cmd_undo_save_state,_cmd_undo_load_state,_cmd_take_screenshot,\
91+
_cmd_toggle_menu,_cmd_reload_config,_cmd_toggle_grab_mouse,_cmd_toggle_game_focus,_cmd_reset,_cmd_toggle_pause,_cmd_pause,_cmd_unpause,\
92+
_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,\
93+
_cmd_cheat_get_size,_cmd_cheat_apply_cheats
8094

8195
LIBS := -s USE_ZLIB=1
82-
LDFLAGS := -L. --no-heap-copy -s $(LIBS) -s TOTAL_MEMORY=$(MEMORY) -s NO_EXIT_RUNTIME=0 -s FULL_ES2=1 \
83-
-s "EXPORTED_RUNTIME_METHODS=['callMain', 'FS', 'PATH', 'ERRNO_CODES']" \
84-
-s ALLOW_MEMORY_GROWTH=1 -s "EXPORTED_FUNCTIONS=['_main', '_malloc', '_cmd_savefiles', '_cmd_save_state', '_cmd_load_state', '_cmd_take_screenshot']" \
96+
LDFLAGS := -L. --no-heap-copy -s $(LIBS) -s STACK_SIZE=$(STACK_SIZE) -s INITIAL_MEMORY=$(INITIAL_HEAP) \
97+
-s EXPORTED_RUNTIME_METHODS=callMain,FS,PATH,ERRNO_CODES,stringToNewUTF8,UTF8ToString \
98+
-s ALLOW_MEMORY_GROWTH=1 -s EXPORTED_FUNCTIONS="$(EXPORTED_FUNCTIONS)" \
8599
-s MODULARIZE=1 -s EXPORT_ES6=1 -s EXPORT_NAME="libretro_$(subst -,_,$(LIBRETRO))" \
86-
-s DISABLE_DEPRECATED_FIND_EVENT_TARGET_BEHAVIOR=1 \
87-
--js-library emscripten/library_errno_codes.js \
88-
--js-library emscripten/library_rwebcam.js
100+
--extern-pre-js emscripten/pre.js \
101+
--js-library emscripten/library_rwebcam.js \
102+
--js-library emscripten/library_platform_emscripten.js
89103

90104
ifeq ($(HAVE_RWEBAUDIO), 1)
91105
LDFLAGS += --js-library emscripten/library_rwebaudio.js
@@ -94,11 +108,11 @@ endif
94108
ifeq ($(HAVE_AL), 1)
95109
LDFLAGS += -lopenal
96110
DEFINES += -DHAVE_AL
97-
ASYNC = 1
111+
override ASYNC = 1
98112
endif
99113

100114
ifneq ($(PTHREAD), 0)
101-
LDFLAGS += -s WASM_MEM_MAX=1073741824 -pthread -s PTHREAD_POOL_SIZE=$(PTHREAD)
115+
LDFLAGS += -s MAXIMUM_MEMORY=1073741824 -pthread -s PTHREAD_POOL_SIZE=$(PTHREAD)
102116
CFLAGS += -pthread
103117
HAVE_THREADS=1
104118
else
@@ -108,10 +122,26 @@ endif
108122
ifeq ($(ASYNC), 1)
109123
LDFLAGS += -s ASYNCIFY=$(ASYNC) -s ASYNCIFY_STACK_SIZE=8192
110124
ifeq ($(DEBUG), 1)
111-
LDFLAGS += -s ASYNCIFY_DEBUG=1 # -s ASYNCIFY_ADVISE
125+
LDFLAGS += -s ASYNCIFY_DEBUG=1 # -s ASYNCIFY_ADVISE
112126
endif
113127
endif
114128

129+
ifeq ($(HAVE_OPENGLES), 1)
130+
ifeq ($(HAVE_OPENGLES3), 1)
131+
LDFLAGS += -s FULL_ES3=1 -s MIN_WEBGL_VERSION=2 -s MAX_WEBGL_VERSION=2
132+
else
133+
LDFLAGS += -s FULL_ES2=1
134+
endif
135+
endif
136+
137+
ifeq ($(GL_DEBUG), 1)
138+
LDFLAGS += -s GL_ASSERTIONS=1 -s GL_DEBUG=1
139+
endif
140+
141+
ifeq ($(FS_DEBUG), 1)
142+
LDFLAGS += -s FS_DEBUG=1
143+
endif
144+
115145
ifeq ($(HAVE_SDL2), 1)
116146
LIBS += -s USE_SDL=2
117147
DEFINES += -DHAVE_SDL2
@@ -121,12 +151,14 @@ include Makefile.common
121151

122152
CFLAGS += $(DEF_FLAGS) -Ideps -Ideps/stb
123153

124-
libretro :=
154+
libretro =
155+
libretro_new =
125156

126157
ifeq ($(HAVE_STATIC_DUMMY),1)
127158
DEFINES += -DHAVE_STATIC_DUMMY
128159
else
129-
libretro += libretro_emscripten.bc
160+
libretro = libretro_emscripten.bc
161+
libretro_new = libretro_emscripten.a
130162
endif
131163

132164
ifneq ($(V), 1)
@@ -135,31 +167,26 @@ endif
135167

136168
ifeq ($(DEBUG), 1)
137169
LDFLAGS += -O0 -g -gsource-map -s SAFE_HEAP=1 -s STACK_OVERFLOW_CHECK=2 -s ASSERTIONS=1
138-
CFLAGS += -O0 -g -gsource-map -s SAFE_HEAP=1 -s SAFE_HEAP_LOG=1 -s STACK_OVERFLOW_CHECK=2 -s ASSERTIONS=1
170+
CFLAGS += -O0 -g -gsource-map
139171
else
140-
LDFLAGS += -O3 -s WASM=1
172+
LDFLAGS += -O3
141173
# WARNING: some optimizations can break some cores (ex: LTO breaks tyrquake)
142-
LDFLAGS += -s PRECISE_F32=$(PRECISE_F32)
143174
ifeq ($(LTO), 1)
144-
LDFLAGS += --llvm-lto 3
175+
LDFLAGS += -flto
145176
endif
146177
CFLAGS += -O3
147178
endif
148179

149-
# 128 * 1024, double the usual emscripten stack size
150-
LDFLAGS += -s STACK_SIZE=131072
151-
152-
LDFLAGS += --extern-pre-js emscripten/pre.js
153-
154180
CFLAGS += -Wall -I. -Ilibretro-common/include -Ideps/7zip -std=gnu99
155181

156182
RARCH_OBJ := $(addprefix $(OBJDIR)/,$(OBJ))
157183

158184
all: $(TARGET)
159185

160186
$(TARGET): $(RARCH_OBJ) $(libretro)
161-
@$(if $(Q), $(shell echo echo LD $@),)
162-
$(Q)$(LD) -o $@ $(RARCH_OBJ) $(libretro) $(LIBS) $(LDFLAGS)
187+
@$(if $(libretro), mv -f $(libretro) $(libretro_new),)
188+
@$(if $(Q), $(shell echo echo "LD $@ \<obj\> $(libretro_new) $(LIBS) $(LDFLAGS)"),)
189+
$(Q)$(LD) -o $@ $(RARCH_OBJ) $(libretro_new) $(LIBS) $(LDFLAGS)
163190

164191
$(OBJDIR)/%.o: %.c
165192
@mkdir -p $(dir $@)

‎cheat_manager.c

+5-3
Original file line numberDiff line numberDiff line change
@@ -122,11 +122,13 @@ void cheat_manager_apply_cheats(void)
122122
void cheat_manager_set_code(unsigned i, const char *str)
123123
{
124124
cheat_manager_t *cheat_st = &cheat_manager_state;
125-
if (!cheat_st->cheats)
125+
if (!cheat_st->cheats || string_is_empty(str))
126126
return;
127127

128-
if (!string_is_empty(str))
129-
strcpy(cheat_st->cheats[i].code, str);
128+
if (cheat_st->cheats[i].code)
129+
free(cheat_st->cheats[i].code);
130+
131+
cheat_st->cheats[i].code = strdup(str);
130132

131133
cheat_st->cheats[i].state = true;
132134
}

‎command.h

+1
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,7 @@ enum event_command
260260
CMD_EVENT_PRESENCE_UPDATE,
261261
CMD_EVENT_OVERLAY_NEXT,
262262
CMD_EVENT_OSK_TOGGLE,
263+
CMD_EVENT_RELOAD_CONFIG,
263264
#ifdef HAVE_MICROPHONE
264265
/* Stops all enabled microphones. */
265266
CMD_EVENT_MICROPHONE_STOP,

‎config.def.h

+3
Original file line numberDiff line numberDiff line change
@@ -764,6 +764,9 @@
764764
#define DEFAULT_MENU_TICKER_SPEED 2.0f
765765
#define DEFAULT_MENU_TICKER_SMOOTH true
766766

767+
/* Don't skip rendering assets based on the absence of other assets */
768+
#define DEFAULT_MENU_IGNORE_MISSING_ASSETS false
769+
767770
#if defined(HAVE_THREADS)
768771
#define DEFAULT_MENU_SAVESTATE_RESUME true
769772
#else

‎configuration.c

+1
Original file line numberDiff line numberDiff line change
@@ -1933,6 +1933,7 @@ static struct config_bool_setting *populate_settings_bool(
19331933
SETTING_BOOL("menu_dynamic_wallpaper_enable", &settings->bools.menu_dynamic_wallpaper_enable, true, DEFAULT_MENU_DYNAMIC_WALLPAPER_ENABLE, false);
19341934
SETTING_BOOL("menu_ticker_smooth", &settings->bools.menu_ticker_smooth, true, DEFAULT_MENU_TICKER_SMOOTH, false);
19351935
SETTING_BOOL("menu_scroll_fast", &settings->bools.menu_scroll_fast, true, DEFAULT_MENU_SCROLL_FAST, false);
1936+
SETTING_BOOL("menu_ignore_missing_assets", &settings->bools.menu_ignore_missing_assets, true, DEFAULT_MENU_IGNORE_MISSING_ASSETS, false);
19361937

19371938
SETTING_BOOL("settings_show_drivers", &settings->bools.settings_show_drivers, true, DEFAULT_SETTINGS_SHOW_DRIVERS, false);
19381939
SETTING_BOOL("settings_show_video", &settings->bools.settings_show_video, true, DEFAULT_SETTINGS_SHOW_VIDEO, false);

‎configuration.h

+1
Original file line numberDiff line numberDiff line change
@@ -832,6 +832,7 @@ typedef struct settings
832832
bool menu_disable_left_analog;
833833
bool menu_disable_right_analog;
834834
bool menu_ticker_smooth;
835+
bool menu_ignore_missing_assets;
835836
bool settings_show_drivers;
836837
bool settings_show_video;
837838
bool settings_show_audio;

‎dist-scripts/dist-cores.sh

+38-12
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ mkdir -p ../pkg/${platform}/build/rom
6161
# Emscripten
6262
elif [ $PLATFORM = "emscripten" ] ; then
6363
platform=emscripten
64+
# todo: change this to a
6465
EXT=bc
6566

6667
if [ -z "$EMSCRIPTEN" ] ; then
@@ -199,26 +200,42 @@ for f in `ls -v *_${platform}.${EXT}`; do
199200

200201
echo Buildbot: building ${name} for ${platform}
201202
name=`echo "$f" | sed "s/\(_libretro_${platform}\|\).${EXT}$//"`
202-
async=0
203-
pthread=${pthread:-0}
204203
lto=0
205204
whole_archive=
206205
big_stack=
207206

208-
if [ $PLATFORM = "emscripten" ]; then
209-
async=1 #emscripten needs async to sleep
210-
fi
211207
if [ $name = "nxengine" ] ; then
212208
echo "Applying whole archive linking..."
213209
whole_archive="WHOLE_ARCHIVE_LINK=1"
214210
elif [ $name = "tyrquake" ] ; then
215211
echo "Applying big stack..."
216212
lto=0
217213
big_stack="BIG_STACK=1"
218-
elif [ $name = "mupen64plus" ] ; then
219-
async=1
220-
elif [ $name = "dosbox" ] ; then
214+
fi
215+
if [ $PLATFORM = "emscripten" ]; then
221216
async=0
217+
pthread=${pthread:-0}
218+
gles3=0
219+
stack_mem=4194304
220+
heap_mem=134217728
221+
if [ $name = "mupen64plus_next" ] ; then
222+
gles3=1
223+
async=1
224+
stack_mem=134217728
225+
heap_mem=268435456
226+
elif [ $name = "parallel_n64" ] ; then
227+
gles3=1
228+
async=1
229+
elif [ $name = "mednafen_psx" ] ; then
230+
heap_mem=536870912
231+
elif [ $name = "mednafen_psx_hw" ] ; then
232+
gles3=1
233+
heap_mem=536870912
234+
elif [ $name = "dosbox" ] ; then
235+
async=1
236+
elif [ $name = "scummvm" ] ; then
237+
async=1
238+
fi
222239
fi
223240
echo "-- Building core: $name --"
224241
if [ $PLATFORM = "unix" ]; then
@@ -227,15 +244,21 @@ for f in `ls -v *_${platform}.${EXT}`; do
227244
cp -f "$f" ../libretro_${platform}.${EXT}
228245
fi
229246
echo NAME: $name
230-
echo ASYNC: $async
231247
echo LTO: $lto
248+
if [ $PLATFORM = "emscripten" ]; then
249+
echo ASYNC: $async
250+
echo PTHREAD: $pthread
251+
echo GLES3: $gles3
252+
echo STACK_MEMORY: $stack_mem
253+
echo HEAP_MEMORY: $heap_mem
254+
fi
232255

233256
# Do cleanup if this is a big stack core
234257
if [ "$big_stack" = "BIG_STACK=1" ] ; then
235258
if [ $MAKEFILE_GRIFFIN = "yes" ]; then
236259
make -C ../ -f Makefile.griffin platform=${platform} clean || exit 1
237260
elif [ $PLATFORM = "emscripten" ]; then
238-
make -C ../ -f Makefile.emscripten PTHREAD=$pthread ASYNC=$async LTO=$lto -j7 clean || exit 1
261+
make -C ../ -f Makefile.emscripten PTHREAD=$pthread ASYNC=$async LTO=$lto HAVE_OPENGLES3=$gles3 -j7 clean || exit 1
239262
elif [ $PLATFORM = "unix" ]; then
240263
make -C ../ -f Makefile LINK=g++ LTO=$lto -j7 clean || exit 1
241264
else
@@ -247,8 +270,8 @@ for f in `ls -v *_${platform}.${EXT}`; do
247270
if [ $MAKEFILE_GRIFFIN = "yes" ]; then
248271
make -C ../ -f Makefile.griffin $OPTS platform=${platform} $whole_archive $big_stack -j3 || exit 1
249272
elif [ $PLATFORM = "emscripten" ]; then
250-
echo "BUILD COMMAND: make -C ../ -f Makefile.emscripten PTHREAD=$pthread ASYNC=$async LTO=$lto -j7 LIBRETRO=${name} TARGET=${name}_libretro.js"
251-
make -C ../ -f Makefile.emscripten $OPTS PTHREAD=$pthread ASYNC=$async LTO=$lto -j7 LIBRETRO=${name} TARGET=${name}_libretro.js || exit 1
273+
echo "BUILD COMMAND: make -C ../ -f Makefile.emscripten PTHREAD=$pthread ASYNC=$async LTO=$lto HAVE_OPENGLES3=$gles3 STACK_SIZE=$stack_mem INITIAL_HEAP=$heap_mem -j7 LIBRETRO=${name} TARGET=${name}_libretro.js"
274+
make -C ../ -f Makefile.emscripten $OPTS PTHREAD=$pthread ASYNC=$async LTO=$lto HAVE_OPENGLES3=$gles3 STACK_SIZE=$stack_mem INITIAL_HEAP=$heap_mem -j7 LIBRETRO=${name} TARGET=${name}_libretro.js || exit 1
252275
elif [ $PLATFORM = "unix" ]; then
253276
make -C ../ -f Makefile LINK=g++ $whole_archive $big_stack -j3 || exit 1
254277
elif [ $PLATFORM = "ctr" ]; then
@@ -318,6 +341,9 @@ for f in `ls -v *_${platform}.${EXT}`; do
318341
if [ $pthread != 0 ] ; then
319342
mv -f ../${name}_libretro.worker.js ../pkg/emscripten/${name}_libretro.worker.js
320343
fi
344+
if [ -f ../${name}_libretro.wasm.map ] ; then
345+
mv -f ../${name}_libretro.wasm.map ../pkg/emscripten/${name}_libretro.wasm.map
346+
fi
321347
fi
322348

323349
# Do manual executable step

‎emscripten/library_errno_codes.js

-15
This file was deleted.

0 commit comments

Comments
 (0)
Please sign in to comment.