From 256c9daefd9959e1e92ed9201e7d42e43587b63b Mon Sep 17 00:00:00 2001 From: Bananymous Date: Sun, 3 Aug 2025 15:47:50 +0300 Subject: [PATCH] ports/SDL2: Optimize rendering and fix cursor Remove the unnecessary framebuffer layer, we can just use the window's own framebuffer. Set default cursor on mouse initialization, this fixes cursor hiding in tuxracer defined SetRelativeMouseMode instead of SetMouseCapture. This is what the behaviour was :D --- .../patches/0001-add-banan_os-support.patch | 145 ++++++------------ 1 file changed, 47 insertions(+), 98 deletions(-) diff --git a/ports/SDL2/patches/0001-add-banan_os-support.patch b/ports/SDL2/patches/0001-add-banan_os-support.patch index 4959de15..06f84857 100644 --- a/ports/SDL2/patches/0001-add-banan_os-support.patch +++ b/ports/SDL2/patches/0001-add-banan_os-support.patch @@ -1,6 +1,6 @@ -diff -ruN SDL-release-2.30.11/CMakeLists.txt SDL-release-2.30.11-banan_os/CMakeLists.txt +diff -ruN SDL-release-2.30.11/CMakeLists.txt SDL2-2.30.11-banan_os/CMakeLists.txt --- SDL-release-2.30.11/CMakeLists.txt 2025-01-01 19:09:38.000000000 +0200 -+++ SDL-release-2.30.11-banan_os/CMakeLists.txt 2025-06-25 16:53:26.163363407 +0300 ++++ SDL2-2.30.11-banan_os/CMakeLists.txt 2025-08-03 14:04:09.894244781 +0300 @@ -1452,7 +1452,7 @@ CheckPTHREAD() CheckLibUnwind() @@ -60,9 +60,9 @@ diff -ruN SDL-release-2.30.11/CMakeLists.txt SDL-release-2.30.11-banan_os/CMakeL elseif(RISCOS) if(SDL_MISC) file(GLOB MISC_SOURCES ${SDL2_SOURCE_DIR}/src/misc/riscos/*.c) -diff -ruN SDL-release-2.30.11/include/SDL_config.h.cmake SDL-release-2.30.11-banan_os/include/SDL_config.h.cmake +diff -ruN SDL-release-2.30.11/include/SDL_config.h.cmake SDL2-2.30.11-banan_os/include/SDL_config.h.cmake --- SDL-release-2.30.11/include/SDL_config.h.cmake 2025-01-01 19:09:38.000000000 +0200 -+++ SDL-release-2.30.11-banan_os/include/SDL_config.h.cmake 2025-06-24 19:53:27.963249565 +0300 ++++ SDL2-2.30.11-banan_os/include/SDL_config.h.cmake 2025-08-03 14:04:09.894803585 +0300 @@ -406,6 +406,7 @@ #cmakedefine SDL_VIDEO_DRIVER_ANDROID @SDL_VIDEO_DRIVER_ANDROID@ #cmakedefine SDL_VIDEO_DRIVER_EMSCRIPTEN @SDL_VIDEO_DRIVER_EMSCRIPTEN@ @@ -71,9 +71,9 @@ diff -ruN SDL-release-2.30.11/include/SDL_config.h.cmake SDL-release-2.30.11-ban #cmakedefine SDL_VIDEO_DRIVER_COCOA @SDL_VIDEO_DRIVER_COCOA@ #cmakedefine SDL_VIDEO_DRIVER_UIKIT @SDL_VIDEO_DRIVER_UIKIT@ #cmakedefine SDL_VIDEO_DRIVER_DIRECTFB @SDL_VIDEO_DRIVER_DIRECTFB@ -diff -ruN SDL-release-2.30.11/include/SDL_platform.h SDL-release-2.30.11-banan_os/include/SDL_platform.h +diff -ruN SDL-release-2.30.11/include/SDL_platform.h SDL2-2.30.11-banan_os/include/SDL_platform.h --- SDL-release-2.30.11/include/SDL_platform.h 2025-01-01 19:09:38.000000000 +0200 -+++ SDL-release-2.30.11-banan_os/include/SDL_platform.h 2025-06-24 17:54:20.094530618 +0300 ++++ SDL2-2.30.11-banan_os/include/SDL_platform.h 2025-08-03 14:04:09.895022748 +0300 @@ -36,6 +36,10 @@ #undef __HAIKU__ #define __HAIKU__ 1 @@ -85,9 +85,9 @@ diff -ruN SDL-release-2.30.11/include/SDL_platform.h SDL-release-2.30.11-banan_o #if defined(bsdi) || defined(__bsdi) || defined(__bsdi__) #undef __BSDI__ #define __BSDI__ 1 -diff -ruN SDL-release-2.30.11/src/misc/banan_os/SDL_sysurl.cpp SDL-release-2.30.11-banan_os/src/misc/banan_os/SDL_sysurl.cpp +diff -ruN SDL-release-2.30.11/src/misc/banan_os/SDL_sysurl.cpp SDL2-2.30.11-banan_os/src/misc/banan_os/SDL_sysurl.cpp --- SDL-release-2.30.11/src/misc/banan_os/SDL_sysurl.cpp 1970-01-01 02:00:00.000000000 +0200 -+++ SDL-release-2.30.11-banan_os/src/misc/banan_os/SDL_sysurl.cpp 2025-06-24 18:51:56.695953622 +0300 ++++ SDL2-2.30.11-banan_os/src/misc/banan_os/SDL_sysurl.cpp 2025-08-03 14:04:09.895198889 +0300 @@ -0,0 +1,30 @@ +/* + Simple DirectMedia Layer @@ -119,9 +119,9 @@ diff -ruN SDL-release-2.30.11/src/misc/banan_os/SDL_sysurl.cpp SDL-release-2.30. + +/* vi: set ts=4 sw=4 expandtab: */ + -diff -ruN SDL-release-2.30.11/src/video/banan_os/SDL_banan_os_message_box.cpp SDL-release-2.30.11-banan_os/src/video/banan_os/SDL_banan_os_message_box.cpp +diff -ruN SDL-release-2.30.11/src/video/banan_os/SDL_banan_os_message_box.cpp SDL2-2.30.11-banan_os/src/video/banan_os/SDL_banan_os_message_box.cpp --- SDL-release-2.30.11/src/video/banan_os/SDL_banan_os_message_box.cpp 1970-01-01 02:00:00.000000000 +0200 -+++ SDL-release-2.30.11-banan_os/src/video/banan_os/SDL_banan_os_message_box.cpp 2025-06-27 16:29:59.012277213 +0300 ++++ SDL2-2.30.11-banan_os/src/video/banan_os/SDL_banan_os_message_box.cpp 2025-08-03 14:04:09.895299391 +0300 @@ -0,0 +1,60 @@ +/* + Simple DirectMedia Layer @@ -183,9 +183,9 @@ diff -ruN SDL-release-2.30.11/src/video/banan_os/SDL_banan_os_message_box.cpp SD +#endif /* SDL_VIDEO_DRIVER_BANAN_OS */ + +/* vi: set ts=4 sw=4 expandtab: */ -diff -ruN SDL-release-2.30.11/src/video/banan_os/SDL_banan_os_message_box.h SDL-release-2.30.11-banan_os/src/video/banan_os/SDL_banan_os_message_box.h +diff -ruN SDL-release-2.30.11/src/video/banan_os/SDL_banan_os_message_box.h SDL2-2.30.11-banan_os/src/video/banan_os/SDL_banan_os_message_box.h --- SDL-release-2.30.11/src/video/banan_os/SDL_banan_os_message_box.h 1970-01-01 02:00:00.000000000 +0200 -+++ SDL-release-2.30.11-banan_os/src/video/banan_os/SDL_banan_os_message_box.h 2025-06-24 19:49:44.390183027 +0300 ++++ SDL2-2.30.11-banan_os/src/video/banan_os/SDL_banan_os_message_box.h 2025-08-03 14:04:09.895347931 +0300 @@ -0,0 +1,45 @@ +/* + Simple DirectMedia Layer @@ -232,10 +232,10 @@ diff -ruN SDL-release-2.30.11/src/video/banan_os/SDL_banan_os_message_box.h SDL- +#endif + +/* vi: set ts=4 sw=4 expandtab: */ -diff -ruN SDL-release-2.30.11/src/video/banan_os/SDL_banan_os_video.cpp SDL-release-2.30.11-banan_os/src/video/banan_os/SDL_banan_os_video.cpp +diff -ruN SDL-release-2.30.11/src/video/banan_os/SDL_banan_os_video.cpp SDL2-2.30.11-banan_os/src/video/banan_os/SDL_banan_os_video.cpp --- SDL-release-2.30.11/src/video/banan_os/SDL_banan_os_video.cpp 1970-01-01 02:00:00.000000000 +0200 -+++ SDL-release-2.30.11-banan_os/src/video/banan_os/SDL_banan_os_video.cpp 2025-06-28 20:49:41.452498550 +0300 -@@ -0,0 +1,770 @@ ++++ SDL2-2.30.11-banan_os/src/video/banan_os/SDL_banan_os_video.cpp 2025-08-04 14:57:50.844360579 +0300 +@@ -0,0 +1,719 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2025 Sam Lantinga @@ -291,8 +291,8 @@ diff -ruN SDL-release-2.30.11/src/video/banan_os/SDL_banan_os_video.cpp SDL-rele +struct banan_os_window +{ + BAN::UniqPtr window; -+ LibGUI::Texture framebuffer; -+ OSMesaContext gl_context; ++ OSMesaContext gl_context { nullptr }; ++ SDL_bool relative { SDL_FALSE }; +}; + +struct banan_os_video_device_data @@ -442,6 +442,8 @@ diff -ruN SDL-release-2.30.11/src/video/banan_os/SDL_banan_os_video.cpp SDL-rele +{ + DUMP_FUNCTION(); + ++ // FIXME: support system cursors :) ++ + auto* cursor = static_cast(SDL_calloc(1, sizeof(SDL_Cursor))); + if (cursor == nullptr) { + SDL_OutOfMemory(); @@ -473,12 +475,17 @@ diff -ruN SDL-release-2.30.11/src/video/banan_os/SDL_banan_os_video.cpp SDL-rele + return 0; +} + -+static int BANAN_OS_CaptureMouse(SDL_Window* window) ++static int BANAN_OS_SetRelativeMouseMode(SDL_bool enabled) +{ + DUMP_FUNCTION(); + ++ auto* window = SDL_GetMouseFocus(); ++ if (window == nullptr) ++ return 0; ++ + auto& ban_window = *static_cast(window->driverdata); -+ ban_window.window->set_mouse_capture(SDL_GetMouse()->capture_window == window); ++ ban_window.window->set_mouse_relative(enabled); ++ ban_window.relative = enabled; + + return 0; +} @@ -489,9 +496,11 @@ diff -ruN SDL-release-2.30.11/src/video/banan_os/SDL_banan_os_video.cpp SDL-rele + + auto* mouse = SDL_GetMouse(); + mouse->ShowCursor = BANAN_OS_ShowCursor; -+ mouse->CaptureMouse = BANAN_OS_CaptureMouse; ++ mouse->SetRelativeMouseMode = BANAN_OS_SetRelativeMouseMode; + mouse->CreateSystemCursor = BANAN_OS_CreateSystemCursor; + mouse->FreeCursor = BANAN_OS_FreeCursor; ++ ++ SDL_SetDefaultCursor(BANAN_OS_CreateSystemCursor(SDL_SYSTEM_CURSOR_ARROW)); +} + +static int BANAN_OS_VideoInit(_THIS) @@ -588,16 +597,16 @@ diff -ruN SDL-release-2.30.11/src/video/banan_os/SDL_banan_os_video.cpp SDL-rele + ); + + ban_window->window->set_mouse_button_event_callback( -+ [window](LibGUI::EventPacket::MouseButtonEvent::event_t event) { ++ [window, ban_window](LibGUI::EventPacket::MouseButtonEvent::event_t event) { + const int state = event.pressed ? SDL_PRESSED : SDL_RELEASED; -+ SDL_SendMouseMotion(window, 0, SDL_FALSE, event.x, event.y); ++ SDL_SendMouseMotion(window, 0, ban_window->relative, event.x, event.y); + SDL_SendMouseButton(window, 0, state, BANAN_OS_mouse_button_to_sdl(event.button)); + } + ); + + ban_window->window->set_mouse_move_event_callback( -+ [window](LibGUI::EventPacket::MouseMoveEvent::event_t event) { -+ SDL_SendMouseMotion(window, 0, SDL_FALSE, event.x, event.y); ++ [window, ban_window](LibGUI::EventPacket::MouseMoveEvent::event_t event) { ++ SDL_SendMouseMotion(window, 0, ban_window->relative, event.x, event.y); + } + ); + @@ -613,13 +622,13 @@ diff -ruN SDL-release-2.30.11/src/video/banan_os/SDL_banan_os_video.cpp SDL-rele + const size_t height = ban_window->window->height(); + + if (ban_window->gl_context) { -+ ban_window->framebuffer = MUST(LibGUI::Texture::create(width, height, 0x000000)); + OSMesaMakeCurrent( + ban_window->gl_context, -+ ban_window->framebuffer.pixels().data(), ++ ban_window->window->texture().pixels().data(), + GL_UNSIGNED_BYTE, + width, height + ); ++ OSMesaPixelStore(OSMESA_Y_UP, 0); + } + + SDL_SendWindowEvent(window, SDL_WINDOWEVENT_RESIZED, width, height); @@ -767,11 +776,9 @@ diff -ruN SDL-release-2.30.11/src/video/banan_os/SDL_banan_os_video.cpp SDL-rele + return -1; + } + -+ ban_window.framebuffer = framebuffer_or_error.release_value(); -+ + *format = SDL_PIXELFORMAT_BGR888; -+ *pixels = ban_window.framebuffer.pixels().data(); -+ *pitch = ban_window.framebuffer.width() * sizeof(uint32_t); ++ *pixels = ban_window.window->texture().pixels().data(); ++ *pitch = ban_window.window->texture().width() * sizeof(uint32_t); + + return 0; +} @@ -782,25 +789,8 @@ diff -ruN SDL-release-2.30.11/src/video/banan_os/SDL_banan_os_video.cpp SDL-rele + + auto& ban_window = *static_cast(window->driverdata); + -+ int min_x = ban_window.window->width(); -+ int min_y = ban_window.window->height(); -+ int max_x = 0; -+ int max_y = 0; -+ for (int i = 0; i < numrects; i++) { -+ ban_window.window->texture().copy_texture(ban_window.framebuffer, -+ rects[i].x, rects[i].y, -+ rects[i].x, rects[i].y, -+ rects[i].w, rects[i].h -+ ); -+ -+ min_x = BAN::Math::min(min_x, rects[i].x); -+ min_y = BAN::Math::min(min_y, rects[i].y); -+ max_x = BAN::Math::max(max_x, rects[i].x + rects[i].w); -+ max_y = BAN::Math::max(max_y, rects[i].y + rects[i].h); -+ } -+ -+ if (min_x < max_x && min_y < max_y) -+ ban_window.window->invalidate(min_x, min_y, max_x - min_x, max_y - min_y); ++ for (int i = 0; i < numrects; i++) ++ ban_window.window->invalidate(rects[i].x, rects[i].y, rects[i].w, rects[i].h); + + return 0; +} @@ -808,32 +798,6 @@ diff -ruN SDL-release-2.30.11/src/video/banan_os/SDL_banan_os_video.cpp SDL-rele +static void BANAN_OS_DestroyWindowFramebuffer(_THIS, SDL_Window* window) +{ + DUMP_FUNCTION(); -+ -+ auto& ban_window = *static_cast(window->driverdata); -+ ban_window.framebuffer = {}; -+} -+ -+static int BANAN_OS_WaitEventTimeout(_THIS, int timeout) -+{ -+ DUMP_FUNCTION(); -+ -+ auto& ban_video_device_data = *static_cast(_this->driverdata); -+ -+ fd_set fds; -+ FD_ZERO(&fds); -+ -+ int max_fd = 0; -+ for (auto* window : ban_video_device_data.windows) -+ { -+ max_fd = BAN::Math::max(max_fd, window->window->server_fd()); -+ FD_SET(window->window->server_fd(), &fds); -+ } -+ -+ timeval tv { -+ .tv_sec = static_cast(timeout / 1000), -+ .tv_usec = static_cast((timeout % 1000) * 1000), -+ }; -+ return select(max_fd + 1, &fds, nullptr, nullptr, &tv); +} + +static void BANAN_OS_PumpEvents(_THIS) @@ -871,25 +835,19 @@ diff -ruN SDL-release-2.30.11/src/video/banan_os/SDL_banan_os_video.cpp SDL-rele + + auto& ban_window = *static_cast(window->driverdata); + -+ auto framebuffer_or_error = LibGUI::Texture::create(ban_window.window->width(), ban_window.window->width(), 0x000000); -+ if (framebuffer_or_error.is_error()) { -+ dwarnln("LibGUI::Texture::create: {}", framebuffer_or_error.error()); -+ return nullptr; -+ } -+ + auto gl_context = OSMesaCreateContext(OSMESA_BGRA, NULL); + if (gl_context == nullptr) { + dwarnln("OSMesaCreateContext"); + return nullptr; + } + -+ auto fb = framebuffer_or_error.release_value(); ++ auto& fb = ban_window.window->texture(); + if (!OSMesaMakeCurrent(gl_context, fb.pixels().data(), GL_UNSIGNED_BYTE, fb.width(), fb.height())) { + OSMesaDestroyContext(gl_context); + return nullptr; + } ++ OSMesaPixelStore(OSMESA_Y_UP, 0); + -+ ban_window.framebuffer = BAN::move(fb); + ban_window.gl_context = gl_context; + + return gl_context; @@ -914,9 +872,10 @@ diff -ruN SDL-release-2.30.11/src/video/banan_os/SDL_banan_os_video.cpp SDL-rele + + auto gl_context = static_cast(context); + -+ auto& fb = ban_window.framebuffer; ++ auto& fb = ban_window.window->texture(); + if (!OSMesaMakeCurrent(gl_context, fb.pixels().data(), GL_UNSIGNED_BYTE, fb.width(), fb.height())) + return -1; ++ OSMesaPixelStore(OSMESA_Y_UP, 0); + + return 0; +} @@ -931,15 +890,6 @@ diff -ruN SDL-release-2.30.11/src/video/banan_os/SDL_banan_os_video.cpp SDL-rele + glFinish(); + + auto& ban_window = *static_cast(window->driverdata); -+ -+ auto* src = ban_window.framebuffer.pixels().data(); -+ auto* dst = ban_window.window->texture().pixels().data(); -+ -+ const size_t width = ban_window.window->width(); -+ const size_t height = ban_window.window->height(); -+ for (size_t y = 0; y < height; y++) -+ memcpy(&dst[(height - y - 1) * width], &src[y * width], width * 4); -+ + ban_window.window->invalidate(); + + return 0; @@ -982,7 +932,6 @@ diff -ruN SDL-release-2.30.11/src/video/banan_os/SDL_banan_os_video.cpp SDL-rele + device->UpdateWindowFramebuffer = BANAN_OS_UpdateWindowFramebuffer; + device->DestroyWindowFramebuffer = BANAN_OS_DestroyWindowFramebuffer; + -+ device->WaitEventTimeout = BANAN_OS_WaitEventTimeout; + device->PumpEvents = BANAN_OS_PumpEvents; + + device->GL_LoadLibrary = BANAN_OS_GL_LoadLibrary; @@ -1006,9 +955,9 @@ diff -ruN SDL-release-2.30.11/src/video/banan_os/SDL_banan_os_video.cpp SDL-rele +#endif /* SDL_VIDEO_DRIVER_BANAN_OS */ + +/* vi: set ts=4 sw=4 expandtab: */ -diff -ruN SDL-release-2.30.11/src/video/SDL_sysvideo.h SDL-release-2.30.11-banan_os/src/video/SDL_sysvideo.h +diff -ruN SDL-release-2.30.11/src/video/SDL_sysvideo.h SDL2-2.30.11-banan_os/src/video/SDL_sysvideo.h --- SDL-release-2.30.11/src/video/SDL_sysvideo.h 2025-01-01 19:09:38.000000000 +0200 -+++ SDL-release-2.30.11-banan_os/src/video/SDL_sysvideo.h 2025-06-24 18:55:08.546768590 +0300 ++++ SDL2-2.30.11-banan_os/src/video/SDL_sysvideo.h 2025-08-03 14:04:09.895655165 +0300 @@ -462,6 +462,7 @@ extern VideoBootStrap WINDOWS_bootstrap; extern VideoBootStrap WINRT_bootstrap; @@ -1017,9 +966,9 @@ diff -ruN SDL-release-2.30.11/src/video/SDL_sysvideo.h SDL-release-2.30.11-banan extern VideoBootStrap PND_bootstrap; extern VideoBootStrap UIKIT_bootstrap; extern VideoBootStrap Android_bootstrap; -diff -ruN SDL-release-2.30.11/src/video/SDL_video.c SDL-release-2.30.11-banan_os/src/video/SDL_video.c +diff -ruN SDL-release-2.30.11/src/video/SDL_video.c SDL2-2.30.11-banan_os/src/video/SDL_video.c --- SDL-release-2.30.11/src/video/SDL_video.c 2025-01-01 19:09:38.000000000 +0200 -+++ SDL-release-2.30.11-banan_os/src/video/SDL_video.c 2025-06-24 19:37:36.342677687 +0300 ++++ SDL2-2.30.11-banan_os/src/video/SDL_video.c 2025-08-03 14:04:09.896007237 +0300 @@ -94,6 +94,9 @@ #ifdef SDL_VIDEO_DRIVER_HAIKU &HAIKU_bootstrap,