Skip to content

Commit

Permalink
bugfix: When using KMSDRM, controller input was lost after entering t…
Browse files Browse the repository at this point in the history
…he GUI once (fixes #1384)

This seems to be caused by SDL2 when using KMSDRM only, as it works properly under X.
As a workaround, I'm changing the logic to keep only a single window and renderer when KMSDRM is detected.
  • Loading branch information
midwan committed Aug 30, 2024
1 parent e6ac62b commit 1366a3f
Show file tree
Hide file tree
Showing 2 changed files with 49 additions and 5 deletions.
38 changes: 36 additions & 2 deletions src/osdep/amiberry_gfx.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -217,7 +217,17 @@ static void SDL2_init()
write_log("Getting Current Video Driver...\n");
sdl_video_driver = SDL_GetCurrentVideoDriver();
if (sdl_video_driver != nullptr && strcmpi(sdl_video_driver, "KMSDRM") == 0)
{
kmsdrm_detected = true;
if (!mon->amiga_window && mon->gui_window)
{
mon->amiga_window = mon->gui_window;
}
if (!mon->amiga_renderer && mon->gui_renderer)
{
mon->amiga_renderer = mon->gui_renderer;
}
}

const auto should_be_zero = SDL_GetCurrentDisplayMode(0, &sdl_mode);
if (should_be_zero == 0)
Expand Down Expand Up @@ -2298,6 +2308,30 @@ void graphics_leave()
struct AmigaMonitor* mon = &AMonitors[0];
close_windows(mon);

if (kmsdrm_detected)
{
if (mon->amiga_renderer)
{
SDL_DestroyRenderer(mon->amiga_renderer);
mon->amiga_renderer = nullptr;
}
if (mon->gui_renderer)
{
SDL_DestroyRenderer(mon->gui_renderer);
mon->gui_renderer = nullptr;
}
if (mon->amiga_window)
{
SDL_DestroyWindow(mon->amiga_window);
mon->amiga_window = nullptr;
}
if (mon->gui_window)
{
SDL_DestroyWindow(mon->gui_window);
mon->gui_window = nullptr;
}
}

SDL_DestroyMutex(screen_cs);
screen_cs = nullptr;
screen_cs_allocated = false;
Expand Down Expand Up @@ -2325,13 +2359,13 @@ void close_windows(struct AmigaMonitor* mon)
gl_context = nullptr;
}
#else
if (mon->amiga_renderer)
if (mon->amiga_renderer && !kmsdrm_detected)
{
SDL_DestroyRenderer(mon->amiga_renderer);
mon->amiga_renderer = nullptr;
}
#endif
if (mon->amiga_window)
if (mon->amiga_window && !kmsdrm_detected)
{
SDL_DestroyWindow(mon->amiga_window);
mon->amiga_window = nullptr;
Expand Down
16 changes: 13 additions & 3 deletions src/osdep/gui/main_window.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -273,7 +273,17 @@ void amiberry_gui_init()
sdl_video_driver = SDL_GetCurrentVideoDriver();

if (sdl_video_driver != nullptr && strcmpi(sdl_video_driver, "KMSDRM") == 0)
{
kmsdrm_detected = true;
if (!mon->gui_window && mon->amiga_window)
{
mon->gui_window = mon->amiga_window;
}
if (!mon->gui_renderer && mon->amiga_renderer)
{
mon->gui_renderer = mon->amiga_renderer;
}
}
SDL_GetCurrentDisplayMode(0, &sdl_mode);

//-------------------------------------------------
Expand All @@ -297,7 +307,7 @@ void amiberry_gui_init()
else
{
// otherwise go for Full-window
mode = SDL_WINDOW_FULLSCREEN_DESKTOP | SDL_WINDOW_ALWAYS_ON_TOP;
mode = SDL_WINDOW_FULLSCREEN_DESKTOP;
}

if (currprefs.gui_alwaysontop)
Expand Down Expand Up @@ -404,13 +414,13 @@ void amiberry_gui_halt()
SDL_DestroyTexture(gui_texture);
gui_texture = nullptr;
}
if (mon->gui_renderer)
if (mon->gui_renderer && !kmsdrm_detected)
{
SDL_DestroyRenderer(mon->gui_renderer);
mon->gui_renderer = nullptr;
}

if (mon->gui_window) {
if (mon->gui_window && !kmsdrm_detected) {
SDL_DestroyWindow(mon->gui_window);
mon->gui_window = nullptr;
}
Expand Down

0 comments on commit 1366a3f

Please sign in to comment.