Consistently use SDL_PIXELFORMAT_RGBA32 with Emscripten

This commit is contained in:
Cameron Cawley
2025-09-04 15:36:45 +01:00
committed by Sam Lantinga
parent c78e279d3c
commit bd680bdbcc
3 changed files with 4 additions and 45 deletions

View File

@@ -30,7 +30,7 @@
bool Emscripten_CreateWindowFramebuffer(SDL_VideoDevice *_this, SDL_Window *window, SDL_PixelFormat *format, void **pixels, int *pitch) bool Emscripten_CreateWindowFramebuffer(SDL_VideoDevice *_this, SDL_Window *window, SDL_PixelFormat *format, void **pixels, int *pitch)
{ {
SDL_Surface *surface; SDL_Surface *surface;
const SDL_PixelFormat surface_format = SDL_PIXELFORMAT_XBGR8888; const SDL_PixelFormat surface_format = SDL_PIXELFORMAT_RGBA32;
int w, h; int w, h;
// Free the old framebuffer surface // Free the old framebuffer surface
@@ -89,54 +89,13 @@ bool Emscripten_UpdateWindowFramebuffer(SDL_VideoDevice *_this, SDL_Window *wind
} }
var data = SDL3.image.data; var data = SDL3.image.data;
var src = pixels / 4; var src = pixels / 4;
var dst = 0;
var num;
if (SDL3.data32Data !== data) { if (SDL3.data32Data !== data) {
SDL3.data32 = new Int32Array(data.buffer); SDL3.data32 = new Int32Array(data.buffer);
SDL3.data8 = new Uint8Array(data.buffer);
SDL3.data32Data = data; SDL3.data32Data = data;
} }
var data32 = SDL3.data32; var data32 = SDL3.data32;
num = data32.length; data32.set(HEAP32.subarray(src, src + data32.length));
// logically we need to do
// while (dst < num) {
// data32[dst++] = HEAP32[src++] | 0xff000000
// }
// the following code is faster though, because
// .set() is almost free - easily 10x faster due to
// native SDL_memcpy efficiencies, and the remaining loop
// just stores, not load + store, so it is faster
data32.set(HEAP32.subarray(src, src + num));
var data8 = SDL3.data8;
var i = 3;
var j = i + 4 * num;
if (num % 8 == 0) {
// unrolling gives big speedups
while (i < j) {
data8[i] = 0xff;
i = i + 4 | 0;
data8[i] = 0xff;
i = i + 4 | 0;
data8[i] = 0xff;
i = i + 4 | 0;
data8[i] = 0xff;
i = i + 4 | 0;
data8[i] = 0xff;
i = i + 4 | 0;
data8[i] = 0xff;
i = i + 4 | 0;
data8[i] = 0xff;
i = i + 4 | 0;
data8[i] = 0xff;
i = i + 4 | 0;
}
} else {
while (i < j) {
data8[i] = 0xff;
i = i + 4 | 0;
}
}
SDL3.ctx.putImageData(SDL3.image, 0, 0); SDL3.ctx.putImageData(SDL3.image, 0, 0);
}, surface->w, surface->h, surface->pixels, data->canvas_id); }, surface->w, surface->h, surface->pixels, data->canvas_id);

View File

@@ -74,7 +74,7 @@ static SDL_Cursor *Emscripten_CreateCursor(SDL_Surface *surface, int hot_x, int
const char *cursor_url = NULL; const char *cursor_url = NULL;
SDL_Surface *conv_surf; SDL_Surface *conv_surf;
conv_surf = SDL_ConvertSurface(surface, SDL_PIXELFORMAT_ABGR8888); conv_surf = SDL_ConvertSurface(surface, SDL_PIXELFORMAT_RGBA32);
if (!conv_surf) { if (!conv_surf) {
return NULL; return NULL;

View File

@@ -376,7 +376,7 @@ bool Emscripten_VideoInit(SDL_VideoDevice *_this)
// Use a fake 32-bpp desktop mode // Use a fake 32-bpp desktop mode
SDL_zero(mode); SDL_zero(mode);
mode.format = SDL_PIXELFORMAT_XRGB8888; mode.format = SDL_PIXELFORMAT_RGBA32;
emscripten_get_screen_size(&mode.w, &mode.h); emscripten_get_screen_size(&mode.w, &mode.h);
mode.pixel_density = emscripten_get_device_pixel_ratio(); mode.pixel_density = emscripten_get_device_pixel_ratio();