From a29eba40a469f254bcf0c93590b6050641fde7ef Mon Sep 17 00:00:00 2001
From: "Ryan C. Gordon" <[EMAIL REDACTED]>
Date: Wed, 2 Sep 2026 10:23:47 -0400
Subject: [PATCH] kmsdrm: atomic path FIXME cleanup, must call CreateSurfaces.
This was a pending question from the atomic merge. Not only does this function
need to be called, it needs to be called in the SwapWindow* functions first,
like the legacy (non-atomic) path does.
Reference Issue #16136.
---
src/video/kmsdrm/SDL_kmsdrmopengles.c | 24 ++++++++++++------------
1 file changed, 12 insertions(+), 12 deletions(-)
diff --git a/src/video/kmsdrm/SDL_kmsdrmopengles.c b/src/video/kmsdrm/SDL_kmsdrmopengles.c
index 534daba116ed4..ad8314beec915 100644
--- a/src/video/kmsdrm/SDL_kmsdrmopengles.c
+++ b/src/video/kmsdrm/SDL_kmsdrmopengles.c
@@ -125,7 +125,11 @@ static bool KMSDRM_GLES_SwapWindowFenced(SDL_VideoDevice *_this, SDL_Window * wi
SDL_DisplayData *dispdata = SDL_GetDisplayDriverDataForWindow(window);
KMSDRM_FBInfo *fb;
KMSDRM_PlaneInfo info;
- bool modesetting = false;
+ const bool modesetting = windata->egl_surface_dirty;
+
+ if (modesetting) {
+ KMSDRM_CreateSurfaces(_this, window);
+ }
SDL_zero(info);
@@ -232,10 +236,7 @@ static bool KMSDRM_GLES_SwapWindowFenced(SDL_VideoDevice *_this, SDL_Window * wi
/* Do we have a pending modesetting? If so, set the necessary
props so it's included in the incoming atomic commit. */
- if (windata->egl_surface_dirty) {
- // !!! FIXME: this CreateSurfaces call is what the legacy path does; it's not clear to me if the atomic paths need to do it too.
- KMSDRM_CreateSurfaces(_this, window);
-
+ if (modesetting) {
uint32_t blob_id;
SDL_VideoData *viddata = (SDL_VideoData *)_this->internal;
@@ -243,7 +244,6 @@ static bool KMSDRM_GLES_SwapWindowFenced(SDL_VideoDevice *_this, SDL_Window * wi
KMSDRM_drmModeCreatePropertyBlob(viddata->drm_fd, &dispdata->mode, sizeof(dispdata->mode), &blob_id);
add_crtc_property(dispdata->atomic_req, &dispdata->crtc, "MODE_ID", blob_id);
add_crtc_property(dispdata->atomic_req, &dispdata->crtc, "active", 1);
- modesetting = true;
}
/*****************************************************************/
@@ -294,7 +294,11 @@ static bool KMSDRM_GLES_SwapWindowDoubleBuffered(SDL_VideoDevice *_this, SDL_Win
SDL_DisplayData *dispdata = SDL_GetDisplayDriverDataForWindow(window);
KMSDRM_FBInfo *fb;
KMSDRM_PlaneInfo info;
- bool modesetting = false;
+ const bool modesetting = windata->egl_surface_dirty;
+
+ if (modesetting) {
+ KMSDRM_CreateSurfaces(_this, window);
+ }
SDL_zero(info);
@@ -352,10 +356,7 @@ static bool KMSDRM_GLES_SwapWindowDoubleBuffered(SDL_VideoDevice *_this, SDL_Win
/* Do we have a pending modesetting? If so, set the necessary
props so it's included in the incoming atomic commit. */
- if (windata->egl_surface_dirty) {
- // !!! FIXME: this CreateSurfaces call is what the legacy path does; it's not clear to me if the atomic paths need to do it too.
- KMSDRM_CreateSurfaces(_this, window);
-
+ if (modesetting) {
uint32_t blob_id;
SDL_VideoData *viddata = (SDL_VideoData *)_this->internal;
@@ -364,7 +365,6 @@ static bool KMSDRM_GLES_SwapWindowDoubleBuffered(SDL_VideoDevice *_this, SDL_Win
KMSDRM_drmModeCreatePropertyBlob(viddata->drm_fd, &dispdata->mode, sizeof(dispdata->mode), &blob_id);
add_crtc_property(dispdata->atomic_req, &dispdata->crtc, "MODE_ID", blob_id);
add_crtc_property(dispdata->atomic_req, &dispdata->crtc, "active", 1);
- modesetting = true;
}
/* Issue the one and only atomic commit where all changes will be requested!