mirror of
				https://github.com/Ryujinx/SDL.git
				synced 2025-11-04 12:44:56 +00:00 
			
		
		
		
	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:
		
							parent
							
								
									b9c2ad8395
								
							
						
					
					
						commit
						0fcfaf9e94
					
				| 
						 | 
				
			
			@ -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 */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue