Browse Source

emscripten: support pseudo-synchronous screen refresh and events update using asyncify

Sylvain Beucler 4 years ago
parent
commit
01af7b0254

+ 11 - 0
src/timer/unix/SDL_systimer.c

@@ -31,6 +31,10 @@
 #include "SDL_assert.h"
 #include "../SDL_timer_c.h"
 
+#ifdef __EMSCRIPTEN__
+#include <emscripten.h>
+#endif
+
 /* The clock_gettime provides monotonous time, so we should use it if
    it's available. The clock_gettime function is behind ifdef
    for __USE_POSIX199309
@@ -186,6 +190,13 @@ SDL_GetPerformanceFrequency(void)
 void
 SDL_Delay(Uint32 ms)
 {
+#ifdef __EMSCRIPTEN__
+    if (emscripten_has_asyncify()) {
+        /* pseudo-synchronous pause */
+        emscripten_sleep(ms);
+        return;
+    }
+#endif
     int was_error;
 
 #if HAVE_NANOSLEEP

+ 6 - 0
src/video/emscripten/SDL_emscriptenframebuffer.c

@@ -162,6 +162,12 @@ int Emscripten_UpdateWindowFramebuffer(_THIS, SDL_Window * window, const SDL_Rec
                      SDL_GetWindowID(window), ++frame_number);
         SDL_SaveBMP(surface, file);
     }*/
+
+    if (emscripten_has_asyncify()) {
+        /* give back control to browser for screen refresh */
+        emscripten_sleep(0);
+    }
+
     return 0;
 }
 

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

@@ -82,9 +82,19 @@ Emscripten_GLES_LoadLibrary(_THIS, const char *path) {
 }
 
 SDL_EGL_CreateContext_impl(Emscripten)
-SDL_EGL_SwapWindow_impl(Emscripten)
 SDL_EGL_MakeCurrent_impl(Emscripten)
 
+int
+Emscripten_GLES_SwapWindow(_THIS, SDL_Window * window)
+{
+    EGLBoolean ret = SDL_EGL_SwapBuffers(_this, ((SDL_WindowData *) window->driverdata)->egl_surface);
+    if (emscripten_has_asyncify()) {
+        /* give back control to browser for screen refresh */
+        emscripten_sleep(0);
+    }
+    return ret;
+}
+
 void
 Emscripten_GLES_GetDrawableSize(_THIS, SDL_Window * window, int * w, int * h)
 {