diff --git a/include/SDL_hints.h b/include/SDL_hints.h index cd4d4ead3..fd55a55d2 100644 --- a/include/SDL_hints.h +++ b/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. * diff --git a/src/timer/unix/SDL_systimer.c b/src/timer/unix/SDL_systimer.c index 7a44d0520..bfe0fc40d 100644 --- a/src/timer/unix/SDL_systimer.c +++ b/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; } diff --git a/src/video/emscripten/SDL_emscriptenframebuffer.c b/src/video/emscripten/SDL_emscriptenframebuffer.c index 5c845fdef..62193b910 100644 --- a/src/video/emscripten/SDL_emscriptenframebuffer.c +++ b/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); } diff --git a/src/video/emscripten/SDL_emscriptenopengles.c b/src/video/emscripten/SDL_emscriptenopengles.c index 3852fc7bd..6544bc613 100644 --- a/src/video/emscripten/SDL_emscriptenopengles.c +++ b/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); }