Browse Source

emscripten: Introduce SDL_HINT_EMSCRIPTEN_ASYNCIFY

See https://github.com/emscripten-core/emscripten/issues/10746

and

https://github.com/emscripten-ports/SDL2/pull/112

Fixes Bugzilla #4997.
Sylvain Beucler 4 years ago
parent
commit
e594a6738a

+ 15 - 0
include/SDL_hints.h

@@ -1042,6 +1042,21 @@ extern "C" {
  */
 #define SDL_HINT_EMSCRIPTEN_KEYBOARD_ELEMENT   "SDL_EMSCRIPTEN_KEYBOARD_ELEMENT"
 
+/**
+ *  \brief Disable giving back control to the browser automatically
+ *  when running with asyncify
+ *
+ * With -s ASYNCIFY, SDL2 calls emscripten_sleep during operations
+ * such as refreshing the screen or polling events.
+ *
+ * This hint only applies to the emscripten platform
+ *
+ * The variable can be set to the following values:
+ *    "0"       - Disable emscripten_sleep calls (if you give back browser control manually or use asyncify for other purposes)
+ *    "1"       - Enable emscripten_sleep calls (the default)
+ */
+#define SDL_HINT_EMSCRIPTEN_ASYNCIFY   "SDL_EMSCRIPTEN_ASYNCIFY"
+
 /**
  *  \brief Tell SDL not to catch the SIGINT or SIGTERM signals.
  *

+ 3 - 2
src/timer/unix/SDL_systimer.c

@@ -29,6 +29,7 @@
 
 #include "SDL_timer.h"
 #include "SDL_assert.h"
+#include "SDL_hints.h"
 #include "../SDL_timer_c.h"
 
 #ifdef __EMSCRIPTEN__
@@ -191,8 +192,8 @@ void
 SDL_Delay(Uint32 ms)
 {
 #ifdef __EMSCRIPTEN__
-    if (emscripten_has_asyncify()) {
-        /* pseudo-synchronous pause */
+    if (emscripten_has_asyncify() && SDL_GetHintBoolean(SDL_HINT_EMSCRIPTEN_ASYNCIFY, SDL_TRUE)) {
+        /* pseudo-synchronous pause, used directly or through e.g. SDL_WaitEvent */
         emscripten_sleep(ms);
         return;
     }

+ 2 - 1
src/video/emscripten/SDL_emscriptenframebuffer.c

@@ -24,6 +24,7 @@
 
 #include "SDL_emscriptenvideo.h"
 #include "SDL_emscriptenframebuffer.h"
+#include "SDL_hints.h"
 
 
 int Emscripten_CreateWindowFramebuffer(_THIS, SDL_Window * window, Uint32 * format, void ** pixels, int *pitch)
@@ -163,7 +164,7 @@ int Emscripten_UpdateWindowFramebuffer(_THIS, SDL_Window * window, const SDL_Rec
         SDL_SaveBMP(surface, file);
     }*/
 
-    if (emscripten_has_asyncify()) {
+    if (emscripten_has_asyncify() && SDL_GetHintBoolean(SDL_HINT_EMSCRIPTEN_ASYNCIFY, SDL_TRUE)) {
         /* give back control to browser for screen refresh */
         emscripten_sleep(0);
     }

+ 2 - 1
src/video/emscripten/SDL_emscriptenopengles.c

@@ -27,6 +27,7 @@
 
 #include "SDL_emscriptenvideo.h"
 #include "SDL_emscriptenopengles.h"
+#include "SDL_hints.h"
 
 #define LOAD_FUNC(NAME) _this->egl_data->NAME = NAME;
 
@@ -88,7 +89,7 @@ int
 Emscripten_GLES_SwapWindow(_THIS, SDL_Window * window)
 {
     EGLBoolean ret = SDL_EGL_SwapBuffers(_this, ((SDL_WindowData *) window->driverdata)->egl_surface);
-    if (emscripten_has_asyncify()) {
+    if (emscripten_has_asyncify() && SDL_GetHintBoolean(SDL_HINT_EMSCRIPTEN_ASYNCIFY, SDL_TRUE)) {
         /* give back control to browser for screen refresh */
         emscripten_sleep(0);
     }