Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
titaniumnetwork-dev
GitHub Repository: titaniumnetwork-dev/Ludicrous
Path: blob/main/public/webretro/source/patches/retroarch.patch
1224 views
1
diff --git a/Makefile.common b/Makefile.common
2
index a18e5838b8..9610e32517 100644
3
--- a/Makefile.common
4
+++ b/Makefile.common
5
@@ -1500,10 +1500,11 @@ ifeq ($(HAVE_GL_CONTEXT), 1)
6
DEF_FLAGS += $(OPENGLES_CFLAGS)
7
ifeq ($(HAVE_OPENGLES3), 1)
8
DEFINES += -DHAVE_OPENGLES3
9
+ OBJ += $(LIBRETRO_COMM_DIR)/glsym/glsym_es3.o
10
else
11
DEFINES += -DHAVE_OPENGLES2
12
+ OBJ += $(LIBRETRO_COMM_DIR)/glsym/glsym_es2.o
13
endif
14
- OBJ += $(LIBRETRO_COMM_DIR)/glsym/glsym_es2.o
15
else
16
DEFINES += -DHAVE_GL_SYNC
17
OBJ += $(LIBRETRO_COMM_DIR)/glsym/glsym_gl.o
18
diff --git a/Makefile.emscripten b/Makefile.emscripten
19
index d6de1b9805..2e1ccca52e 100644
20
--- a/Makefile.emscripten
21
+++ b/Makefile.emscripten
22
@@ -9,11 +9,8 @@ endif
23
EOPT = USE_ZLIB=1 # Emscripten specific options
24
EOPTS = $(addprefix -s $(EMPTY), $(EOPT)) # Add '-s ' to each option
25
26
-PTHREAD = 0
27
OS = Emscripten
28
OBJ :=
29
-DEFINES := -DRARCH_INTERNAL -DHAVE_MAIN -s USE_PTHREADS=$(PTHREAD)
30
-DEFINES += -DHAVE_FILTERS_BUILTIN
31
32
HAVE_DSP_FILTER = 1
33
HAVE_VIDEO_FILTER = 1
34
@@ -25,7 +22,6 @@ HAVE_AUDIOMIXER = 1
35
HAVE_VIDEO_LAYOUT = 0
36
HAVE_CC_RESAMPLER = 1
37
HAVE_EGL = 1
38
-HAVE_OPENGLES = 1
39
HAVE_RJPEG = 0
40
HAVE_RPNG = 1
41
HAVE_EMSCRIPTEN = 1
42
@@ -42,42 +38,101 @@ HAVE_STB_FONT = 1
43
HAVE_CONFIGFILE = 1
44
HAVE_CHEATS = 1
45
HAVE_IBXM = 1
46
+HAVE_PATCH = 1
47
48
ASYNC ?= 0
49
-ifeq ($(LIBRETRO), mupen64plus)
50
- ASYNC = 1
51
-endif
52
-
53
+PTHREAD ?= 0
54
LTO ?= 0
55
-ifeq ($(LIBRETRO), tyrquake)
56
- LTO = 0
57
-endif
58
59
-MEMORY ?= 134217728
60
+DEFINES := -DRARCH_INTERNAL -DHAVE_MAIN
61
+DEFINES += -DHAVE_FILTERS_BUILTIN -DNO_MISSING_ASSET_WARNING -DNO_AUTO_CANVAS_RESIZE -DWEB_SCALING -DNO_CANVAS_FULLSCREEN -DNO_INITIAL_CANVAS_RESIZE
62
+
63
+HAVE_OPENGL = 0 # not supported
64
+EM_OPENGL ?= 0
65
+HAVE_REGAL ?= 0
66
+
67
+HAVE_OPENGLES ?= 1
68
+HAVE_OPENGLES3 ?= 0
69
+
70
+GL_DEBUG ?= 0 # help diagnose GLSL problems (can cause errors in normal operation)
71
+GENERATE_SOURCEMAP ?= 0
72
+FS_DEBUG = 0
73
+
74
+# default value: 5242880 (5 MiB)
75
+STACK_MEMORY ?= 8388608
76
+# default value: 16777216 (16 MiB)
77
+HEAP_MEMORY ?= 536870912
78
+
79
+# 8388608 ----- 8 MiB (Stack: recommended)
80
+# 16777216 ---- 16 MiB
81
+# 33554432 ---- 32 MiB
82
+# 67108864 ---- 64 MiB
83
+# 134217728 --- 128 MiB
84
+# 268435456 --- 256 MiB (Heap: recommended) (Stack: recommended for some cores [mupen64plus_next])
85
+# 536870912 --- 512 MiB (Heap: needed for some cores [mednafen_psx(_hw), mupen64plus_next])
86
+# 1073741824 -- 1 GiB
87
+# 1610612736 -- 1.5 GiB
88
+# 2147483648 -- 2 GiB
89
90
PRECISE_F32 = 1
91
92
OBJDIR := obj-emscripten
93
94
-#if you compile with SDL2 flag add this Emscripten flag "-s USE_SDL=2" to LDFLAGS:
95
+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']"
96
97
LIBS := -s USE_ZLIB=1
98
-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']" \
99
- -s ALLOW_MEMORY_GROWTH=1 -s EXPORTED_FUNCTIONS="['_main', '_malloc', '_cmd_savefiles', '_cmd_save_state', '_cmd_load_state', '_cmd_take_screenshot']" \
100
+
101
+ifeq ($(HAVE_SDL2), 1)
102
+ LIBS += -s USE_SDL=2
103
+ DEFINES += -DHAVE_SDL2
104
+endif
105
+
106
+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) \
107
--js-library emscripten/library_rwebaudio.js \
108
--js-library emscripten/library_rwebcam.js \
109
--js-library emscripten/library_errno_codes.js
110
+
111
+ifeq ($(HAVE_OPENGLES), 1)
112
+ ifeq ($(HAVE_OPENGLES3), 1)
113
+ LDFLAGS += -s FULL_ES3=1 -s MIN_WEBGL_VERSION=2 -s MAX_WEBGL_VERSION=2
114
+ else
115
+ LDFLAGS += -s FULL_ES2=1
116
+ endif
117
+endif
118
+ifeq ($(EM_OPENGL), 1)
119
+ DEFINES += -DEM_OPENGL
120
+ ifeq ($(HAVE_REGAL), 1)
121
+ LDFLAGS += -s USE_REGAL=1
122
+ DEFINES += -DHAVE_REGAL
123
+ else
124
+ LDFLAGS += -s LEGACY_GL_EMULATION=1 -s GL_UNSAFE_OPTS=0
125
+ endif
126
+endif
127
+
128
+ifeq ($(GL_DEBUG), 1)
129
+ LDFLAGS += -s GL_ASSERTIONS=1 -s GL_DEBUG=1
130
+endif
131
+
132
+ifeq ($(FS_DEBUG), 1)
133
+ LDFLAGS += -s FS_DEBUG=1
134
+endif
135
+
136
ifneq ($(PTHREAD), 0)
137
- LDFLAGS += -s USE_PTHREADS=$(PTHREAD) -s PTHREAD_POOL_SIZE=2
138
+ CFLAGS += -pthread
139
+ CXXFLAGS += -pthread
140
+ LDFLAGS += -pthread -s PTHREAD_POOL_SIZE=4
141
+else
142
+ LDFLAGS += -s ALLOW_MEMORY_GROWTH=1
143
endif
144
145
ifeq ($(ASYNC), 1)
146
- LDFLAGS += -s ASYNCIFY=$(ASYNC)
147
+ LDFLAGS += -s ASYNCIFY=1 -s ASYNCIFY_STACK_SIZE=131072
148
endif
149
150
-ifeq ($(HAVE_SDL2), 1)
151
- LIBS += -s USE_SDL=2
152
- DEFINES += -DHAVE_SDL2
153
+ifeq ($(GENERATE_SOURCEMAP), 1)
154
+ CFLAGS += -g4
155
+ CXXFLAGS += -g4
156
+ LDFLAGS += -g4 --source-map-base http://localhost:8000/cores/ # -gsource-map
157
endif
158
159
include Makefile.common
160
@@ -102,8 +157,7 @@ else
161
CFLAGS += -O3
162
endif
163
164
-CFLAGS += -Wall -I. -Ilibretro-common/include -std=gnu99 $(LIBS) \
165
- -s EXPORTED_FUNCTIONS="['_main', '_malloc', '_cmd_savefiles', '_cmd_save_state', '_cmd_take_screenshot']"
166
+CFLAGS += -Wall -Wno-unused-command-line-argument -I. -Ilibretro-common/include -std=gnu99 $(LIBS) -s EXPORTED_FUNCTIONS=$(EXPORTED_FUNCTIONS)
167
168
RARCH_OBJ := $(addprefix $(OBJDIR)/,$(OBJ))
169
170
diff --git a/cheat_manager.c b/cheat_manager.c
171
index 5df70be982..2f11a8f25a 100644
172
--- a/cheat_manager.c
173
+++ b/cheat_manager.c
174
@@ -120,7 +120,7 @@ void cheat_manager_set_code(unsigned i, const char *str)
175
return;
176
177
if (!string_is_empty(str))
178
- strcpy(cheat_st->cheats[i].code, str);
179
+ cheat_st->cheats[i].code = strdup(str);
180
181
cheat_st->cheats[i].state = true;
182
}
183
diff --git a/command.h b/command.h
184
index a007c175c7..5d1255dfc5 100644
185
--- a/command.h
186
+++ b/command.h
187
@@ -205,7 +205,8 @@ enum event_command
188
CMD_EVENT_CHEAT_INDEX_MINUS,
189
CMD_EVENT_CHEAT_TOGGLE,
190
CMD_EVENT_AI_SERVICE_CALL,
191
- CMD_EVENT_SAVE_FILES
192
+ CMD_EVENT_SAVE_FILES,
193
+ CMD_EVENT_RELOAD_CONFIG
194
};
195
196
typedef struct command command_t;
197
diff --git a/config.def.h b/config.def.h
198
index a87fa6f94a..7c0ddac8f7 100644
199
--- a/config.def.h
200
+++ b/config.def.h
201
@@ -1151,6 +1151,9 @@ static const int default_content_favorites_size = 200;
202
/* Show Menu start-up screen on boot. */
203
#define DEFAULT_MENU_SHOW_START_SCREEN true
204
205
+/* Working with a limited set of assets */
206
+#define DEFAULT_MENU_MINIMAL_ASSETS false
207
+
208
/* Default scale factor for non-frambuffer-based display
209
* drivers and display widgets */
210
#if defined(VITA)
211
diff --git a/configuration.c b/configuration.c
212
index fb8e97c196..2afa8f147a 100644
213
--- a/configuration.c
214
+++ b/configuration.c
215
@@ -1654,6 +1654,7 @@ static struct config_bool_setting *populate_settings_bool(
216
SETTING_BOOL("menu_show_legacy_thumbnail_updater", &settings->bools.menu_show_legacy_thumbnail_updater, true, menu_show_legacy_thumbnail_updater, false);
217
SETTING_BOOL("filter_by_current_core", &settings->bools.filter_by_current_core, true, DEFAULT_FILTER_BY_CURRENT_CORE, false);
218
SETTING_BOOL("rgui_show_start_screen", &settings->bools.menu_show_start_screen, false, false /* TODO */, false);
219
+ SETTING_BOOL("menu_minimal_assets", &settings->bools.menu_minimal_assets, false, false, false);
220
SETTING_BOOL("menu_navigation_wraparound_enable", &settings->bools.menu_navigation_wraparound_enable, true, true, false);
221
SETTING_BOOL("menu_navigation_browser_filter_supported_extensions_enable",
222
&settings->bools.menu_navigation_browser_filter_supported_extensions_enable, true, true, false);
223
diff --git a/configuration.h b/configuration.h
224
index d758fe630e..4c20fdb983 100644
225
--- a/configuration.h
226
+++ b/configuration.h
227
@@ -556,6 +556,7 @@ typedef struct settings
228
bool notification_show_refresh_rate;
229
bool menu_widget_scale_auto;
230
bool menu_show_start_screen;
231
+ bool menu_minimal_assets;
232
bool menu_pause_libretro;
233
bool menu_savestate_resume;
234
bool menu_insert_disk_resume;
235
diff --git a/dist-scripts/dist-cores.sh b/dist-scripts/dist-cores.sh
236
index 7beedba2e6..970d648f25 100644
237
--- a/dist-scripts/dist-cores.sh
238
+++ b/dist-scripts/dist-cores.sh
239
@@ -164,6 +164,10 @@ for f in `ls -v *_${platform}.${EXT}`; do
240
whole_archive=
241
big_stack=
242
243
+ gles3=0
244
+ stack_mem=8388608
245
+ heap_mem=268435456
246
+
247
if [ $name = "nxengine" ] ; then
248
echo "Applying whole archive linking..."
249
whole_archive="WHOLE_ARCHIVE_LINK=1"
250
@@ -171,10 +175,31 @@ for f in `ls -v *_${platform}.${EXT}`; do
251
echo "Applying big stack..."
252
lto=0
253
big_stack="BIG_STACK=1"
254
- elif [ $name = "mupen64plus" ] ; then
255
+ elif [ $name = "mupen64plus_next" ] ; then
256
+ gles3=1
257
+ async=1
258
+ pthread=0
259
+ stack_mem=268435456
260
+ heap_mem=536870912
261
+ elif [ $name = "parallel_n64" ] ; then
262
+ gles3=1
263
async=1
264
+ elif [ $name = "mednafen_psx" ] ; then
265
+ heap_mem=536870912
266
+ elif [ $name = "mednafen_psx_hw" ] ; then
267
+ gles3=1
268
+ heap_mem=536870912
269
elif [ $name = "dosbox" ] ; then
270
- async=0
271
+ async=1
272
+ elif [ $name = "scummvm" ] ; then
273
+ async=1
274
+ pthread=0
275
+ elif [ $name = "melonds" ] ; then
276
+ pthread=0
277
+ elif [ $name = "yabause" ] ; then
278
+ pthread=0
279
+ elif [ $name = "yabasanshiro" ] ; then
280
+ pthread=0
281
fi
282
echo "-- Building core: $name --"
283
if [ $PLATFORM = "unix" ]; then
284
@@ -184,7 +209,11 @@ for f in `ls -v *_${platform}.${EXT}`; do
285
fi
286
echo NAME: $name
287
echo ASYNC: $async
288
+ echo PTHREAD: $pthread
289
echo LTO: $lto
290
+ echo GLES3: $gles3
291
+ echo STACK_MEMORY: $stack_mem
292
+ echo HEAP_MEMORY: $heap_mem
293
294
# Do cleanup if this is a big stack core
295
if [ "$big_stack" = "BIG_STACK=1" ] ; then
296
@@ -203,8 +232,8 @@ for f in `ls -v *_${platform}.${EXT}`; do
297
if [ $MAKEFILE_GRIFFIN = "yes" ]; then
298
make -C ../ -f Makefile.griffin $OPTS platform=${platform} $whole_archive $big_stack -j3 || exit 1
299
elif [ $PLATFORM = "emscripten" ]; then
300
- echo "BUILD COMMAND: make -C ../ -f Makefile.emscripten PTHREAD=$pthread ASYNC=$async LTO=$lto -j7 TARGET=${name}_libretro.js"
301
- make -C ../ -f Makefile.emscripten $OPTS PTHREAD=$pthread ASYNC=$async LTO=$lto -j7 TARGET=${name}_libretro.js || exit 1
302
+ 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"
303
+ 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 1
304
elif [ $PLATFORM = "unix" ]; then
305
make -C ../ -f Makefile LINK=g++ $whole_archive $big_stack -j3 || exit 1
306
elif [ $PLATFORM = "ctr" ]; then
307
@@ -258,7 +287,7 @@ for f in `ls -v *_${platform}.${EXT}`; do
308
mv -f ../${name}_libretro.js ../pkg/emscripten/${name}_libretro.js
309
mv -f ../${name}_libretro.wasm ../pkg/emscripten/${name}_libretro.wasm
310
if [ $pthread != 0 ] ; then
311
- mv -f ../pthread-main.js ../pkg/emscripten/pthread-main.js
312
+ mv -f ../${name}_libretro.worker.js ../pkg/emscripten/${name}_libretro.worker.js
313
fi
314
fi
315
316
diff --git a/emscripten/library_rwebcam.js b/emscripten/library_rwebcam.js
317
index 5c0bec5dc3..9b9114d33b 100644
318
--- a/emscripten/library_rwebcam.js
319
+++ b/emscripten/library_rwebcam.js
320
@@ -17,18 +17,13 @@ var LibraryRWebCam = {
321
RWebCamInit__deps: ['malloc'],
322
RWebCamInit: function(caps1, caps2, width, height) {
323
if (!navigator) return 0;
324
-
325
- navigator.getMedia = navigator.getUserMedia ||
326
- navigator.webkitGetUserMedia ||
327
- navigator.mozGetUserMedia ||
328
- navigator.msGetUserMedia;
329
-
330
- if (!navigator.getMedia) return 0;
331
+ if (!navigator.mediaDevices.getUserMedia) return 0;
332
333
var c = ++RWC.counter;
334
335
RWC.contexts[c] = [];
336
RWC.contexts[c].videoElement = document.createElement("video");
337
+ RWC.contexts[c].videoElement.classList.add("retroarchWebcamVideo");
338
if (width !== 0 && height !== 0) {
339
RWC.contexts[c].videoElement.width = width;
340
RWC.contexts[c].videoElement.height = height;
341
@@ -37,14 +32,19 @@ var LibraryRWebCam = {
342
RWC.contexts[c].glTex = caps1 & (1 << RWC.RETRO_CAMERA_BUFFER_OPENGL_TEXTURE);
343
RWC.contexts[c].rawFb = caps1 & (1 << RWC.RETRO_CAMERA_BUFFER_RAW_FRAMEBUFFER);
344
345
- navigator.getMedia({video: true, audio: false}, function(stream) {
346
- RWC.contexts[c].videoElement.autoplay = true;
347
- RWC.contexts[c].videoElement.src = URL.createObjectURL(stream);
348
- RWC.contexts[c].runMode = 2;
349
- }, function (err) {
350
- console.log("webcam request failed", err);
351
+ if (!window.disableWebCam) {
352
+ navigator.mediaDevices.getUserMedia({video: true, audio: false}).then(function(stream) {
353
+ RWC.contexts[c].videoElement.autoplay = true;
354
+ RWC.contexts[c].videoElement.srcObject = stream;
355
+ RWC.contexts[c].runMode = 2;
356
+ }).catch(function (err) {
357
+ console.log("Webcam request failed", err);
358
+ RWC.runMode = 0;
359
+ });
360
+ } else {
361
+ console.log("Webcam disabled.");
362
RWC.runMode = 0;
363
- });
364
+ }
365
366
// for getting/storing texture id in GL mode
367
if (!RWC.tmp) RWC.tmp = _malloc(4);
368
@@ -53,7 +53,6 @@ var LibraryRWebCam = {
369
370
RWebCamFree: function(data) {
371
RWC.contexts[data].videoElement.pause();
372
- URL.revokeObjectURL(RWC.contexts[data].videoElement.src);
373
RWC.contexts[data].videoElement = null;
374
RWC.contexts[data] = null;
375
},
376
@@ -81,6 +80,7 @@ var LibraryRWebCam = {
377
}
378
if (RWC.contexts[data].rawFb) {
379
RWC.contexts[data].rawFbCanvas = document.createElement("canvas");
380
+ RWC.contexts[data].rawFbCanvas.classList.add("retroarchWebcamCanvas");
381
ret = 1;
382
}
383
384
diff --git a/frontend/drivers/platform_emscripten.c b/frontend/drivers/platform_emscripten.c
385
index a33cc6bf29..ccd8fe9d80 100644
386
--- a/frontend/drivers/platform_emscripten.c
387
+++ b/frontend/drivers/platform_emscripten.c
388
@@ -46,10 +46,15 @@
389
#include "../../tasks/tasks_internal.h"
390
#include "../../file_path_special.h"
391
#include "../../paths.h"
392
+#include "../../cheat_manager.h"
393
394
void dummyErrnoCodes(void);
395
void emscripten_mainloop(void);
396
397
+//// begin exported functions
398
+
399
+// saves and states
400
+
401
void cmd_savefiles(void)
402
{
403
command_event(CMD_EVENT_SAVE_FILES, NULL);
404
@@ -65,11 +70,111 @@ void cmd_load_state(void)
405
command_event(CMD_EVENT_LOAD_STATE, NULL);
406
}
407
408
+void cmd_undo_save_state(void)
409
+{
410
+ command_event(CMD_EVENT_UNDO_SAVE_STATE, NULL);
411
+}
412
+
413
+void cmd_undo_load_state(void)
414
+{
415
+ command_event(CMD_EVENT_UNDO_LOAD_STATE, NULL);
416
+}
417
+
418
+// misc
419
+
420
void cmd_take_screenshot(void)
421
{
422
command_event(CMD_EVENT_TAKE_SCREENSHOT, NULL);
423
}
424
425
+void cmd_toggle_menu(void)
426
+{
427
+ command_event(CMD_EVENT_MENU_TOGGLE, NULL);
428
+}
429
+
430
+void cmd_reload_config(void)
431
+{
432
+ command_event(CMD_EVENT_RELOAD_CONFIG, NULL);
433
+}
434
+
435
+void cmd_toggle_grab_mouse(void)
436
+{
437
+ command_event(CMD_EVENT_GRAB_MOUSE_TOGGLE, NULL);
438
+}
439
+
440
+void cmd_toggle_game_focus(void)
441
+{
442
+ command_event(CMD_EVENT_GAME_FOCUS_TOGGLE, NULL);
443
+}
444
+
445
+void cmd_reset(void)
446
+{
447
+ command_event(CMD_EVENT_RESET, NULL);
448
+}
449
+
450
+void cmd_toggle_pause(void)
451
+{
452
+ command_event(CMD_EVENT_PAUSE_TOGGLE, NULL);
453
+}
454
+
455
+void cmd_pause(void)
456
+{
457
+ command_event(CMD_EVENT_PAUSE, NULL);
458
+}
459
+
460
+void cmd_unpause(void)
461
+{
462
+ command_event(CMD_EVENT_UNPAUSE, NULL);
463
+}
464
+
465
+void cmd_set_volume(float volume) {
466
+ // TODO: update retroarch
467
+}
468
+
469
+bool cmd_set_shader(const char *path)
470
+{
471
+ return retroarch_set_shader(path);
472
+}
473
+
474
+// cheats
475
+
476
+void cmd_cheat_set_code(unsigned index, const char *str)
477
+{
478
+ cheat_manager_set_code(index, str);
479
+}
480
+
481
+const char *cmd_cheat_get_code(unsigned index)
482
+{
483
+ return cheat_manager_get_code(index);
484
+}
485
+
486
+void cmd_cheat_toggle_index(bool apply_cheats_after_toggle, unsigned index)
487
+{
488
+ cheat_manager_toggle_index(apply_cheats_after_toggle, index);
489
+}
490
+
491
+bool cmd_cheat_get_code_state(unsigned index)
492
+{
493
+ return cheat_manager_get_code_state(index);
494
+}
495
+
496
+bool cmd_cheat_realloc(unsigned new_size)
497
+{
498
+ return cheat_manager_realloc(new_size, CHEAT_HANDLER_TYPE_EMU);
499
+}
500
+
501
+unsigned cmd_cheat_get_size(void)
502
+{
503
+ return cheat_manager_get_size();
504
+}
505
+
506
+void cmd_cheat_apply_cheats(void)
507
+{
508
+ cheat_manager_apply_cheats();
509
+}
510
+
511
+//// end exported functions
512
+
513
static void frontend_emscripten_get_env(int *argc, char *argv[],
514
void *args, void *params_data)
515
{
516
@@ -164,9 +269,10 @@ static void frontend_emscripten_get_env(int *argc, char *argv[],
517
int main(int argc, char *argv[])
518
{
519
dummyErrnoCodes();
520
-
521
+#ifndef NO_INITIAL_CANVAS_RESIZE
522
emscripten_set_canvas_element_size("#canvas", 800, 600);
523
emscripten_set_element_css_size("#canvas", 800.0, 600.0);
524
+#endif
525
emscripten_set_main_loop(emscripten_mainloop, 0, 0);
526
rarch_main(argc, argv, NULL);
527
528
diff --git a/gfx/drivers_context/emscriptenegl_ctx.c b/gfx/drivers_context/emscriptenegl_ctx.c
529
index b78d5e296d..8ee63f458e 100644
530
--- a/gfx/drivers_context/emscriptenegl_ctx.c
531
+++ b/gfx/drivers_context/emscriptenegl_ctx.c
532
@@ -51,7 +51,7 @@ typedef struct
533
static void gfx_ctx_emscripten_swap_interval(void *data, int interval)
534
{
535
if (interval == 0)
536
- emscripten_set_main_loop_timing(EM_TIMING_SETIMMEDIATE, 0);
537
+ emscripten_set_main_loop_timing(EM_TIMING_RAF, 1);
538
else
539
emscripten_set_main_loop_timing(EM_TIMING_RAF, interval);
540
}
541
@@ -62,6 +62,7 @@ static void gfx_ctx_emscripten_get_canvas_size(int *width, int *height)
542
bool is_fullscreen = false;
543
EMSCRIPTEN_RESULT r = emscripten_get_fullscreen_status(&fullscreen_status);
544
545
+#ifndef NO_CANVAS_FULLSCREEN
546
if (r == EMSCRIPTEN_RESULT_SUCCESS)
547
{
548
if (fullscreen_status.isFullscreen)
549
@@ -71,6 +72,7 @@ static void gfx_ctx_emscripten_get_canvas_size(int *width, int *height)
550
*height = fullscreen_status.screenHeight;
551
}
552
}
553
+#endif
554
555
if (!is_fullscreen)
556
{
557
@@ -89,7 +91,6 @@ static void gfx_ctx_emscripten_get_canvas_size(int *width, int *height)
558
static void gfx_ctx_emscripten_check_window(void *data, bool *quit,
559
bool *resize, unsigned *width, unsigned *height)
560
{
561
- EMSCRIPTEN_RESULT r;
562
int input_width;
563
int input_height;
564
emscripten_ctx_data_t *emscripten = (emscripten_ctx_data_t*)data;
565
@@ -106,10 +107,12 @@ static void gfx_ctx_emscripten_check_window(void *data, bool *quit,
566
*width = (unsigned)input_width;
567
*height = (unsigned)input_height;
568
*resize = false;
569
-
570
+#ifndef NO_AUTO_CANVAS_RESIZE
571
if (input_width != emscripten->fb_width ||
572
input_height != emscripten->fb_height)
573
{
574
+ EMSCRIPTEN_RESULT r;
575
+
576
r = emscripten_set_canvas_element_size("#canvas",
577
input_width, input_height);
578
579
@@ -125,9 +128,16 @@ static void gfx_ctx_emscripten_check_window(void *data, bool *quit,
580
581
*resize = true;
582
}
583
+#endif
584
585
+#ifdef WEB_SCALING
586
+ double dpr = emscripten_get_device_pixel_ratio();
587
+ emscripten->fb_width = (unsigned)(input_width * dpr);
588
+ emscripten->fb_height = (unsigned)(input_height * dpr);
589
+#else
590
emscripten->fb_width = (unsigned)input_width;
591
emscripten->fb_height = (unsigned)input_height;
592
+#endif
593
*quit = false;
594
}
595
596
diff --git a/input/drivers/rwebinput_input.c b/input/drivers/rwebinput_input.c
597
index be4b631bde..94b2e1c67b 100644
598
--- a/input/drivers/rwebinput_input.c
599
+++ b/input/drivers/rwebinput_input.c
600
@@ -24,6 +24,9 @@
601
#include <encodings/crc32.h>
602
#include <encodings/utf.h>
603
604
+#ifdef WEB_SCALING
605
+#include <emscripten/emscripten.h>
606
+#endif
607
#include <emscripten/html5.h>
608
609
#include "../input_keymaps.h"
610
@@ -265,10 +268,18 @@ static EM_BOOL rwebinput_mouse_cb(int event_type,
611
612
uint8_t mask = 1 << mouse_event->button;
613
614
+#ifdef WEB_SCALING
615
+ double dpr = emscripten_get_device_pixel_ratio();
616
+ rwebinput->mouse.x = (long)(mouse_event->targetX * dpr);
617
+ rwebinput->mouse.y = (long)(mouse_event->targetY * dpr);
618
+ rwebinput->mouse.pending_delta_x += (long)(mouse_event->movementX * dpr);
619
+ rwebinput->mouse.pending_delta_y += (long)(mouse_event->movementY * dpr);
620
+#else
621
rwebinput->mouse.x = mouse_event->targetX;
622
rwebinput->mouse.y = mouse_event->targetY;
623
rwebinput->mouse.pending_delta_x += mouse_event->movementX;
624
rwebinput->mouse.pending_delta_y += mouse_event->movementY;
625
+#endif
626
627
if (event_type == EMSCRIPTEN_EVENT_MOUSEDOWN)
628
rwebinput->mouse.buttons |= mask;
629
@@ -283,8 +294,26 @@ static EM_BOOL rwebinput_wheel_cb(int event_type,
630
{
631
rwebinput_input_t *rwebinput = (rwebinput_input_t*)user_data;
632
633
+#ifdef WEB_SCALING
634
+ double dpr = emscripten_get_device_pixel_ratio();
635
+ rwebinput->mouse.pending_scroll_x += wheel_event->deltaX * dpr;
636
+ rwebinput->mouse.pending_scroll_y += wheel_event->deltaY * dpr;
637
+#else
638
rwebinput->mouse.pending_scroll_x += wheel_event->deltaX;
639
rwebinput->mouse.pending_scroll_y += wheel_event->deltaY;
640
+#endif
641
+
642
+ return EM_TRUE;
643
+}
644
+
645
+static EM_BOOL rwebinput_pointerlockchange_cb(int event_type,
646
+ const EmscriptenPointerlockChangeEvent *pointerlock_change_event, void *user_data)
647
+{
648
+ if (!pointerlock_change_event->isActive)
649
+ {
650
+ retroarch_game_focus_off();
651
+ retroarch_grab_mouse_off();
652
+ }
653
654
return EM_TRUE;
655
}
656
@@ -360,6 +389,15 @@ static void *rwebinput_input_init(const char *joypad_driver)
657
"[EMSCRIPTEN/INPUT] failed to create wheel callback: %d\n", r);
658
}
659
660
+ r = emscripten_set_pointerlockchange_callback(
661
+ EMSCRIPTEN_EVENT_TARGET_DOCUMENT, rwebinput, false,
662
+ rwebinput_pointerlockchange_cb);
663
+ if (r != EMSCRIPTEN_RESULT_SUCCESS)
664
+ {
665
+ RARCH_ERR(
666
+ "[EMSCRIPTEN/INPUT] failed to create pointerlockchange callback: %d\n", r);
667
+ }
668
+
669
input_keymaps_init_keyboard_lut(rarch_key_map_rwebinput);
670
671
return rwebinput;
672
@@ -537,7 +575,7 @@ static int16_t rwebinput_input_state(
673
vp.full_height = 0;
674
675
if (!(video_driver_translate_coord_viewport_wrap(
676
- &vp, mouse->x, mouse->x,
677
+ &vp, mouse->x, mouse->y,
678
&res_x, &res_y, &res_screen_x, &res_screen_y)))
679
return 0;
680
681
@@ -628,8 +666,10 @@ static void rwebinput_process_keyboard_events(
682
character = '\t';
683
684
if (translated_keycode != RETROK_UNKNOWN)
685
+ {
686
input_keyboard_event(keydown, translated_keycode, character, mod,
687
RETRO_DEVICE_KEYBOARD);
688
+ }
689
690
if ( translated_keycode < RETROK_LAST
691
&& translated_keycode != RETROK_UNKNOWN)
692
diff --git a/menu/drivers/materialui.c b/menu/drivers/materialui.c
693
index e591cebd0e..d71581fab9 100644
694
--- a/menu/drivers/materialui.c
695
+++ b/menu/drivers/materialui.c
696
@@ -2294,10 +2294,12 @@ static void materialui_context_reset_textures(materialui_handle_t *mui)
697
}
698
699
/* Warn user if assets are missing */
700
+#ifndef NO_MISSING_ASSET_WARNING
701
if (!has_all_assets)
702
runloop_msg_queue_push(
703
msg_hash_to_str(MSG_MISSING_ASSETS), 1, 256, false, NULL,
704
MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO);
705
+#endif
706
}
707
708
static void materialui_draw_icon(
709
diff --git a/menu/drivers/ozone/ozone.c b/menu/drivers/ozone/ozone.c
710
index 90b814ed3d..9bd20f4f0b 100644
711
--- a/menu/drivers/ozone/ozone.c
712
+++ b/menu/drivers/ozone/ozone.c
713
@@ -743,6 +743,8 @@ static void *ozone_init(void **userdata, bool video_is_threaded)
714
ozone->animations.left_thumbnail_alpha = 1.0f;
715
ozone->force_metadata_display = false;
716
717
+ ozone->minimal_assets = settings->bools.menu_minimal_assets;
718
+
719
gfx_thumbnail_set_stream_delay(-1.0f);
720
gfx_thumbnail_set_fade_duration(-1.0f);
721
gfx_thumbnail_set_fade_missing(false);
722
@@ -1244,7 +1246,7 @@ static void ozone_context_reset(void *data, bool is_threaded)
723
else
724
{
725
#endif
726
- if (!gfx_display_reset_textures_list(filename, ozone->png_path, &ozone->textures[i], TEXTURE_FILTER_MIPMAP_LINEAR, NULL, NULL))
727
+ if (!gfx_display_reset_textures_list(filename, ozone->png_path, &ozone->textures[i], TEXTURE_FILTER_MIPMAP_LINEAR, NULL, NULL) && !ozone->minimal_assets)
728
ozone->has_all_assets = false;
729
#if 0
730
}
731
@@ -1263,14 +1265,15 @@ static void ozone_context_reset(void *data, bool is_threaded)
732
733
if (!gfx_display_reset_textures_list(filename, ozone->tab_path, &ozone->tab_textures[i], TEXTURE_FILTER_MIPMAP_LINEAR, NULL, NULL))
734
{
735
- ozone->has_all_assets = false;
736
+ if (!ozone->minimal_assets)
737
+ ozone->has_all_assets = false;
738
RARCH_WARN("[OZONE] Asset missing: %s%s%s\n", ozone->tab_path,
739
PATH_DEFAULT_SLASH(), filename);
740
}
741
}
742
743
/* Theme textures */
744
- if (!ozone_reset_theme_textures(ozone))
745
+ if (!ozone_reset_theme_textures(ozone) && !ozone->minimal_assets)
746
ozone->has_all_assets = false;
747
748
/* Icons textures init */
749
@@ -1278,7 +1281,8 @@ static void ozone_context_reset(void *data, bool is_threaded)
750
{
751
if (!gfx_display_reset_textures_list(ozone_entries_icon_texture_path(i), ozone->icons_path, &ozone->icons_textures[i], TEXTURE_FILTER_MIPMAP_LINEAR, NULL, NULL))
752
{
753
- ozone->has_all_assets = false;
754
+ if (!ozone->minimal_assets)
755
+ ozone->has_all_assets = false;
756
RARCH_WARN("[OZONE] Asset missing: %s%s%s\n", ozone->icons_path,
757
PATH_DEFAULT_SLASH(), ozone_entries_icon_texture_path(i));
758
}
759
@@ -1307,8 +1311,10 @@ static void ozone_context_reset(void *data, bool is_threaded)
760
ozone->animations.list_alpha = 1.0f;
761
762
/* Missing assets message */
763
+#ifndef NO_MISSING_ASSET_WARNING
764
if (!ozone->has_all_assets)
765
runloop_msg_queue_push(msg_hash_to_str(MSG_MISSING_ASSETS), 1, 256, false, NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO);
766
+#endif
767
768
/* Thumbnails */
769
ozone_update_thumbnail_image(ozone);
770
diff --git a/menu/drivers/ozone/ozone.h b/menu/drivers/ozone/ozone.h
771
index 578c26ce1a..2bfd33bf73 100644
772
--- a/menu/drivers/ozone/ozone.h
773
+++ b/menu/drivers/ozone/ozone.h
774
@@ -292,6 +292,8 @@ struct ozone_handle
775
776
bool force_metadata_display;
777
778
+ bool minimal_assets;
779
+
780
bool is_db_manager_list;
781
bool is_file_list;
782
bool is_quick_menu;
783
diff --git a/menu/drivers/xmb.c b/menu/drivers/xmb.c
784
index a5da529592..4e020e6a7c 100644
785
--- a/menu/drivers/xmb.c
786
+++ b/menu/drivers/xmb.c
787
@@ -6050,7 +6050,9 @@ static void xmb_context_reset_textures(
788
&& !(settings->uints.menu_xmb_theme == XMB_ICON_THEME_CUSTOM)
789
)
790
{
791
+#ifndef NO_MISSING_ASSET_WARNING
792
runloop_msg_queue_push(msg_hash_to_str(MSG_MISSING_ASSETS), 1, 256, false, NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO);
793
+#endif
794
/* Do not draw icons if subsetting is missing */
795
goto error;
796
}
797
diff --git a/retroarch.c b/retroarch.c
798
index 9d3add82cd..4c0a3b494a 100644
799
--- a/retroarch.c
800
+++ b/retroarch.c
801
@@ -11077,6 +11077,10 @@ static bool command_set_shader(const char *arg)
802
803
return retroarch_apply_shader(type, arg, true);
804
}
805
+
806
+bool retroarch_set_shader(const char *path) {
807
+ return command_set_shader(path);
808
+}
809
#endif
810
811
/* TRANSLATION */
812
@@ -13395,6 +13399,14 @@ static bool input_driver_ungrab_mouse(struct rarch_state *p_rarch)
813
return true;
814
}
815
816
+void retroarch_grab_mouse_off(void)
817
+{
818
+ struct rarch_state *p_rarch = &rarch_st;
819
+
820
+ if (p_rarch->input_driver_grab_mouse_state)
821
+ command_event(CMD_EVENT_GRAB_MOUSE_TOGGLE, NULL);
822
+}
823
+
824
static void command_event_reinit(struct rarch_state *p_rarch,
825
const int flags)
826
{
827
@@ -13507,6 +13519,17 @@ static void retroarch_game_focus_free(struct rarch_state *p_rarch)
828
p_rarch->game_focus_state.core_requested = false;
829
}
830
831
+void retroarch_game_focus_off(void)
832
+{
833
+ struct rarch_state *p_rarch = &rarch_st;
834
+
835
+ if (p_rarch->game_focus_state.enabled)
836
+ {
837
+ enum input_game_focus_cmd_type game_focus_cmd = GAME_FOCUS_CMD_OFF;
838
+ command_event(CMD_EVENT_GAME_FOCUS_TOGGLE, &game_focus_cmd);
839
+ }
840
+}
841
+
842
static void retroarch_system_info_free(struct rarch_state *p_rarch)
843
{
844
rarch_system_info_t *sys_info = &p_rarch->runloop_system;
845
@@ -13576,6 +13599,9 @@ bool command_event(enum event_command cmd, void *data)
846
847
switch (cmd)
848
{
849
+ case CMD_EVENT_RELOAD_CONFIG:
850
+ config_load(&p_rarch->g_extern);
851
+ break;
852
case CMD_EVENT_SAVE_FILES:
853
event_save_files(p_rarch->rarch_use_sram);
854
break;
855
@@ -16639,9 +16665,14 @@ static bool dynamic_request_hw_context(enum retro_hw_context_type type,
856
#endif
857
case RETRO_HW_CONTEXT_OPENGL:
858
case RETRO_HW_CONTEXT_OPENGL_CORE:
859
+#ifdef HAVE_REGAL
860
+ RARCH_LOG("Requesting OpenGL context (Regal).\n");
861
+ break;
862
+#else
863
RARCH_ERR("Requesting OpenGL context, but RetroArch "
864
"is compiled against OpenGLES. Cannot use HW context.\n");
865
return false;
866
+#endif
867
868
#elif defined(HAVE_OPENGL) || defined(HAVE_OPENGL_CORE)
869
case RETRO_HW_CONTEXT_OPENGLES2:
870
diff --git a/retroarch.h b/retroarch.h
871
index 5e8e7a513f..ff0a1dc3db 100644
872
--- a/retroarch.h
873
+++ b/retroarch.h
874
@@ -396,6 +396,14 @@ void rarch_favorites_init(void);
875
876
void rarch_favorites_deinit(void);
877
878
+void retroarch_grab_mouse_off(void);
879
+
880
+void retroarch_game_focus_off(void);
881
+
882
+#if defined(HAVE_CG) || defined(HAVE_GLSL) || defined(HAVE_SLANG) || defined(HAVE_HLSL)
883
+bool retroarch_set_shader(const char *path);
884
+#endif
885
+
886
/* Audio */
887
888
#ifdef HAVE_AUDIOMIXER
889
890