From 0fcfaf9e9482953ee425cc15b91160b92de3df7f Mon Sep 17 00:00:00 2001 From: Charlie Birks Date: Wed, 8 Jun 2022 14:20:50 +0100 Subject: [PATCH] emscripten: use MAIN_THREAD_EM_ASM for the fb/cursor proxying This is how everything else was handled and fixes undefined symbol errors in non-threads builds. --- .../emscripten/SDL_emscriptenframebuffer.c | 39 +++++--------- src/video/emscripten/SDL_emscriptenmouse.c | 51 +++++-------------- 2 files changed, 26 insertions(+), 64 deletions(-) diff --git a/src/video/emscripten/SDL_emscriptenframebuffer.c b/src/video/emscripten/SDL_emscriptenframebuffer.c index 372c6f5ac..03fea04ef 100644 --- a/src/video/emscripten/SDL_emscriptenframebuffer.c +++ b/src/video/emscripten/SDL_emscriptenframebuffer.c @@ -59,10 +59,19 @@ int Emscripten_CreateWindowFramebuffer(_THIS, SDL_Window * window, Uint32 * form return 0; } -static void -Emscripten_UpdateWindowFramebufferWorker(SDL_Surface* surface) +int Emscripten_UpdateWindowFramebuffer(_THIS, SDL_Window * window, const SDL_Rect * rects, int numrects) { - EM_ASM_INT({ + SDL_Surface *surface; + + SDL_WindowData *data = (SDL_WindowData *) window->driverdata; + surface = data->surface; + if (!surface) { + return SDL_SetError("Couldn't find framebuffer surface for window"); + } + + /* Send the data to the display */ + + MAIN_THREAD_EM_ASM({ var w = $0; var h = $1; var pixels = $2; @@ -147,31 +156,7 @@ Emscripten_UpdateWindowFramebufferWorker(SDL_Surface* surface) } SDL2.ctx.putImageData(SDL2.image, 0, 0); - return 0; }, surface->w, surface->h, surface->pixels); -} - -int Emscripten_UpdateWindowFramebuffer(_THIS, SDL_Window * window, const SDL_Rect * rects, int numrects) -{ - SDL_Surface *surface; - - SDL_WindowData *data = (SDL_WindowData *) window->driverdata; - surface = data->surface; - if (!surface) { - return SDL_SetError("Couldn't find framebuffer surface for window"); - } - - /* Send the data to the display */ - - if (emscripten_is_main_runtime_thread()) { - Emscripten_UpdateWindowFramebufferWorker(surface); - } else { - emscripten_sync_run_in_main_runtime_thread( - EM_FUNC_SIG_VI, - Emscripten_UpdateWindowFramebufferWorker, - (uint32_t)surface - ); - } if (emscripten_has_asyncify() && SDL_GetHintBoolean(SDL_HINT_EMSCRIPTEN_ASYNCIFY, SDL_TRUE)) { /* give back control to browser for screen refresh */ diff --git a/src/video/emscripten/SDL_emscriptenmouse.c b/src/video/emscripten/SDL_emscriptenmouse.c index e41480725..38e394ac1 100644 --- a/src/video/emscripten/SDL_emscriptenmouse.c +++ b/src/video/emscripten/SDL_emscriptenmouse.c @@ -63,10 +63,20 @@ Emscripten_CreateDefaultCursor() return Emscripten_CreateCursorFromString("default", SDL_FALSE); } -static const char* -Emscripten_GetCursorUrl(int w, int h, int hot_x, int hot_y, void* pixels) + +static SDL_Cursor* +Emscripten_CreateCursor(SDL_Surface* surface, int hot_x, int hot_y) { - return (const char *)EM_ASM_INT({ + const char *cursor_url = NULL; + SDL_Surface *conv_surf; + + conv_surf = SDL_ConvertSurfaceFormat(surface, SDL_PIXELFORMAT_ABGR8888, 0); + + if (!conv_surf) { + return NULL; + } + + cursor_url = (const char *)MAIN_THREAD_EM_ASM_INT({ var w = $0; var h = $1; var hot_x = $2; @@ -114,40 +124,7 @@ Emscripten_GetCursorUrl(int w, int h, int hot_x, int hot_y, void* pixels) stringToUTF8(url, urlBuf, url.length + 1); return urlBuf; - }, w, h, hot_x, hot_y, pixels); -} - -static SDL_Cursor* -Emscripten_CreateCursor(SDL_Surface* surface, int hot_x, int hot_y) -{ - const char *cursor_url = NULL; - SDL_Surface *conv_surf; - - conv_surf = SDL_ConvertSurfaceFormat(surface, SDL_PIXELFORMAT_ABGR8888, 0); - - if (!conv_surf) { - return NULL; - } - - if (emscripten_is_main_runtime_thread()) { - cursor_url = Emscripten_GetCursorUrl( - surface->w, - surface->h, - hot_x, - hot_y, - conv_surf->pixels - ); - } else { - cursor_url = (const char *)emscripten_sync_run_in_main_runtime_thread( - EM_FUNC_SIG_IIIIIII, - Emscripten_GetCursorUrl, - surface->w, - surface->h, - hot_x, - hot_y, - conv_surf->pixels - ); - } + }, surface->w, surface->h, hot_x, hot_y, conv_surf->pixels); SDL_FreeSurface(conv_surf);