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.
This commit is contained in:
Charlie Birks 2022-06-08 14:20:50 +01:00 committed by Sam Lantinga
parent b9c2ad8395
commit 0fcfaf9e94
2 changed files with 26 additions and 64 deletions

View File

@ -59,10 +59,19 @@ int Emscripten_CreateWindowFramebuffer(_THIS, SDL_Window * window, Uint32 * form
return 0; return 0;
} }
static void int Emscripten_UpdateWindowFramebuffer(_THIS, SDL_Window * window, const SDL_Rect * rects, int numrects)
Emscripten_UpdateWindowFramebufferWorker(SDL_Surface* surface)
{ {
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 w = $0;
var h = $1; var h = $1;
var pixels = $2; var pixels = $2;
@ -147,31 +156,7 @@ Emscripten_UpdateWindowFramebufferWorker(SDL_Surface* surface)
} }
SDL2.ctx.putImageData(SDL2.image, 0, 0); SDL2.ctx.putImageData(SDL2.image, 0, 0);
return 0;
}, surface->w, surface->h, surface->pixels); }, 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)) { if (emscripten_has_asyncify() && SDL_GetHintBoolean(SDL_HINT_EMSCRIPTEN_ASYNCIFY, SDL_TRUE)) {
/* give back control to browser for screen refresh */ /* give back control to browser for screen refresh */

View File

@ -63,10 +63,20 @@ Emscripten_CreateDefaultCursor()
return Emscripten_CreateCursorFromString("default", SDL_FALSE); 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 w = $0;
var h = $1; var h = $1;
var hot_x = $2; 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); stringToUTF8(url, urlBuf, url.length + 1);
return urlBuf; return urlBuf;
}, w, h, hot_x, hot_y, pixels); }, surface->w, surface->h, hot_x, hot_y, conv_surf->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
);
}
SDL_FreeSurface(conv_surf); SDL_FreeSurface(conv_surf);