emscripten: Fixes for data addresses above 2gb

This includes both wasm64 and wasm32 when addressing more than 2gb of memory.

Fixes: #9052

(Manually cherry-picked from 3deb07ea39.)
This commit is contained in:
Ryan C. Gordon 2024-10-08 17:41:18 -04:00
parent c34790f9f1
commit 02434cd293
No known key found for this signature in database
GPG key ID: FA148B892AB48044
4 changed files with 12 additions and 5 deletions

View file

@ -428,7 +428,7 @@ typedef Sint64 SDL_Time;
#define SDL_PRIs64 "I64d" #define SDL_PRIs64 "I64d"
#elif defined(PRIs64) #elif defined(PRIs64)
#define SDL_PRIs64 PRIs64 #define SDL_PRIs64 PRIs64
#elif defined(__LP64__) && !defined(SDL_PLATFORM_APPLE) #elif defined(__LP64__) && !defined(SDL_PLATFORM_APPLE) && !defined(__EMSCRIPTEN__)
#define SDL_PRIs64 "ld" #define SDL_PRIs64 "ld"
#else #else
#define SDL_PRIs64 "lld" #define SDL_PRIs64 "lld"
@ -439,7 +439,7 @@ typedef Sint64 SDL_Time;
#define SDL_PRIu64 "I64u" #define SDL_PRIu64 "I64u"
#elif defined(PRIu64) #elif defined(PRIu64)
#define SDL_PRIu64 PRIu64 #define SDL_PRIu64 PRIu64
#elif defined(__LP64__) && !defined(SDL_PLATFORM_APPLE) #elif defined(__LP64__) && !defined(SDL_PLATFORM_APPLE) && !defined(__EMSCRIPTEN__)
#define SDL_PRIu64 "lu" #define SDL_PRIu64 "lu"
#else #else
#define SDL_PRIu64 "llu" #define SDL_PRIu64 "llu"

View file

@ -40,6 +40,13 @@ static bool EMSCRIPTENAUDIO_PlayDevice(SDL_AudioDevice *device, const Uint8 *buf
{ {
const int framelen = SDL_AUDIO_FRAMESIZE(device->spec); const int framelen = SDL_AUDIO_FRAMESIZE(device->spec);
MAIN_THREAD_EM_ASM({ 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 SDL3 = Module['SDL3'];
var numChannels = SDL3.audio_playback.currentPlaybackBuffer['numberOfChannels']; var numChannels = SDL3.audio_playback.currentPlaybackBuffer['numberOfChannels'];
for (var c = 0; c < numChannels; ++c) { for (var c = 0; c < numChannels; ++c) {
@ -49,7 +56,7 @@ static bool EMSCRIPTENAUDIO_PlayDevice(SDL_AudioDevice *device, const Uint8 *buf
} }
for (var j = 0; j < $1; ++j) { for (var j = 0; j < $1; ++j) {
channelData[j] = HEAPF32[$0 + ((j*numChannels + c) << 2) >> 2]; // !!! FIXME: why are these shifts here? channelData[j] = HEAPF32[buf + (j*numChannels + c)];
} }
} }
}, buffer, buffer_size / framelen); }, buffer, buffer_size / framelen);

View file

@ -88,7 +88,7 @@ bool Emscripten_UpdateWindowFramebuffer(SDL_VideoDevice *_this, SDL_Window *wind
SDL3.imageCtx = SDL3.ctx; SDL3.imageCtx = SDL3.ctx;
} }
var data = SDL3.image.data; var data = SDL3.image.data;
var src = pixels >> 2; var src = pixels / 4;
var dst = 0; var dst = 0;
var num; var num;

View file

@ -94,7 +94,7 @@ static SDL_Cursor *Emscripten_CreateCursor(SDL_Surface *surface, int hot_x, int
var image = ctx.createImageData(w, h); var image = ctx.createImageData(w, h);
var data = image.data; var data = image.data;
var src = pixels >> 2; var src = pixels / 4;
var data32 = new Int32Array(data.buffer); var data32 = new Int32Array(data.buffer);
data32.set(HEAP32.subarray(src, src + data32.length)); data32.set(HEAP32.subarray(src, src + data32.length));