From d9bc9dda7a0887c6d117134b93be260473046e6a Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Mon, 2 Feb 2026 18:11:04 -0500 Subject: [PATCH] emscripten: Cleanup some wasm32/wasm64 ifdefs. Fixes #14066. (cherry picked from commit bb6ced6fc00c018ba418964f69458e222dd08a04) --- src/SDL.c | 12 +++++++ src/audio/emscripten/SDL_emscriptenaudio.c | 7 +--- src/video/emscripten/SDL_emscriptenevents.c | 36 ++++----------------- 3 files changed, 19 insertions(+), 36 deletions(-) diff --git a/src/SDL.c b/src/SDL.c index cf5ff5b2c1..2128438c6e 100644 --- a/src/SDL.c +++ b/src/SDL.c @@ -328,9 +328,21 @@ bool SDL_InitSubSystem(SDL_InitFlags flags) #ifdef SDL_PLATFORM_EMSCRIPTEN MAIN_THREAD_EM_ASM({ + // make sure this generic table to hang SDL-specific Javascript stuff is available at init time. if (typeof(Module['SDL3']) === 'undefined') { Module['SDL3'] = {}; } + + var SDL3 = Module['SDL3']; + #if defined(__wasm32__) + if (typeof(SDL3.JSVarToCPtr) === 'undefined') { SDL3.JSVarToCPtr = function(v) { return v; }; } + if (typeof(SDL3.CPtrToHeap32Index) === 'undefined') { SDL3.CPtrToHeap32Index = function(ptr) { return ptr >>> 2; }; } + #elif defined(__wasm64__) + if (typeof(SDL3.JSVarToCPtr) === 'undefined') { SDL3.JSVarToCPtr = function(v) { return BigInt(v); }; } + if (typeof(SDL3.CPtrToHeap32Index) === 'undefined') { SDL3.CPtrToHeap32Index = function(ptr) { return Number(ptr / 4n); }; } + #else + #error Please define your platform. + #endif }); #endif diff --git a/src/audio/emscripten/SDL_emscriptenaudio.c b/src/audio/emscripten/SDL_emscriptenaudio.c index 3eaa8e05e0..4087a5efcc 100644 --- a/src/audio/emscripten/SDL_emscriptenaudio.c +++ b/src/audio/emscripten/SDL_emscriptenaudio.c @@ -41,13 +41,8 @@ static bool EMSCRIPTENAUDIO_PlayDevice(SDL_AudioDevice *device, const Uint8 *buf const int framelen = SDL_AUDIO_FRAMESIZE(device->spec); MAIN_THREAD_EM_ASM({ /* Convert incoming buf pointer to a HEAPF32 offset. */ - #ifdef __wasm64__ - var buf = $0 / 4; - #else - var buf = $0 >>> 2; - #endif - var SDL3 = Module['SDL3']; + var buf = SDL3.CPtrToHeap32Index($0); var numChannels = SDL3.audio_playback.currentPlaybackBuffer['numberOfChannels']; for (var c = 0; c < numChannels; ++c) { var channelData = SDL3.audio_playback.currentPlaybackBuffer['getChannelData'](c); diff --git a/src/video/emscripten/SDL_emscriptenevents.c b/src/video/emscripten/SDL_emscriptenevents.c index 28e686a66f..3f71edee1b 100644 --- a/src/video/emscripten/SDL_emscriptenevents.c +++ b/src/video/emscripten/SDL_emscriptenevents.c @@ -974,11 +974,7 @@ static void Emscripten_prep_pointer_event_callbacks(void) var ptr = _SDL_malloc($0); if (ptr != 0) { - #ifdef __wasm32__ - var idx = ptr >> 2; - #elif __wasm64__ - var idx = Number(ptr / 4n); - #endif + var idx = SDL3.CPtrToHeap32Index(ptr); HEAP32[idx++] = ptrtype; HEAP32[idx++] = event.pointerId; HEAP32[idx++] = (typeof(event.button) !== "undefined") ? event.button : -1; @@ -1016,11 +1012,7 @@ static void Emscripten_set_pointer_event_callbacks(SDL_WindowData *data) var d = SDL3.makePointerEventCStruct(rect.left, rect.top, event); if (d != 0) { - #ifdef __wasm32__ - _Emscripten_HandlePointerEnter(data, d); - #elif __wasm64__ - _Emscripten_HandlePointerEnter(BigInt(data), d); - #endif + _Emscripten_HandlePointerEnter(SDL3.JSVarToCPtr(data), d); _SDL_free(d); } }; @@ -1029,11 +1021,7 @@ static void Emscripten_set_pointer_event_callbacks(SDL_WindowData *data) var d = SDL3.makePointerEventCStruct(rect.left, rect.top, event); if (d != 0) { - #ifdef __wasm32__ - _Emscripten_HandlePointerLeave(data, d); - #elif __wasm64__ - _Emscripten_HandlePointerLeave(BigInt(data), d); - #endif + _Emscripten_HandlePointerLeave(SDL3.JSVarToCPtr(data), d); _SDL_free(d); } }; @@ -1042,11 +1030,7 @@ static void Emscripten_set_pointer_event_callbacks(SDL_WindowData *data) var d = SDL3.makePointerEventCStruct(rect.left, rect.top, event); if (d != 0) { - #ifdef __wasm32__ - _Emscripten_HandlePointerGeneric(data, d); - #elif __wasm64__ - _Emscripten_HandlePointerGeneric(BigInt(data), d); - #endif + _Emscripten_HandlePointerGeneric(SDL3.JSVarToCPtr(data), d); _SDL_free(d); } }; @@ -1104,11 +1088,7 @@ static void Emscripten_set_global_mouseup_callback(SDL_VideoDevice *device) var d = SDL3.makePointerEventCStruct(0, 0, event); if (d != 0) { - #ifdef __wasm32__ - _Emscripten_HandleMouseButtonUpGlobal($0, d); - #elif __wasm64__ - _Emscripten_HandleMouseButtonUpGlobal(BigInt($0), d); - #endif + _Emscripten_HandleMouseButtonUpGlobal(SDL3.JSVarToCPtr($0), d); _SDL_free(d); } }; @@ -1348,11 +1328,7 @@ void Emscripten_RegisterEventHandlers(SDL_WindowData *data) // don't try to adjust the state on the actual lock key presses; the normal key handler will catch that and adjust. if ((event.key != "CapsLock") && (event.key != "NumLock") && (event.key != "ScrollLock")) { - #ifdef __wasm32__ - _Emscripten_HandleLockKeysCheck(data, event.getModifierState("CapsLock"), event.getModifierState("NumLock"), event.getModifierState("ScrollLock")); - #elif __wasm64__ - _Emscripten_HandleLockKeysCheck(BigInt(data), event.getModifierState("CapsLock"), event.getModifierState("NumLock"), event.getModifierState("ScrollLock")); - #endif + _Emscripten_HandleLockKeysCheck(Module['SDL3'].JSVarToCPtr(data), event.getModifierState("CapsLock"), event.getModifierState("NumLock"), event.getModifierState("ScrollLock")); } }; document.addEventListener("keydown", document.sdlEventHandlerLockKeysCheck);