From 5105ecf8b1b37ab4e4b8344550c90dd69f49909e Mon Sep 17 00:00:00 2001 From: Manuel Alfayate Corchete Date: Mon, 11 Jan 2021 21:02:07 +0100 Subject: [PATCH] [KMS/DRM] Move surface size info to window driverdata, for coherency. --- src/video/kmsdrm/SDL_kmsdrmvideo.c | 38 ++++++++++++++---------------- src/video/kmsdrm/SDL_kmsdrmvideo.h | 9 ++++--- 2 files changed, 24 insertions(+), 23 deletions(-) diff --git a/src/video/kmsdrm/SDL_kmsdrmvideo.c b/src/video/kmsdrm/SDL_kmsdrmvideo.c index 781b796cc..f860815b0 100644 --- a/src/video/kmsdrm/SDL_kmsdrmvideo.c +++ b/src/video/kmsdrm/SDL_kmsdrmvideo.c @@ -823,7 +823,7 @@ KMSDRM_CreateSurfaces(_THIS, SDL_Window * window) { SDL_VideoData *viddata = ((SDL_VideoData *)_this->driverdata); SDL_WindowData *windata = (SDL_WindowData *)window->driverdata; - SDL_DisplayData *dispdata = (SDL_DisplayData *) SDL_GetDisplayForWindow(window)->driverdata; + uint32_t surface_fmt = GBM_FORMAT_ARGB8888; uint32_t surface_flags = GBM_BO_USE_SCANOUT | GBM_BO_USE_RENDERING; @@ -845,7 +845,7 @@ KMSDRM_CreateSurfaces(_THIS, SDL_Window * window) } windata->gs = KMSDRM_gbm_surface_create(viddata->gbm_dev, - dispdata->surface_w, dispdata->surface_h, surface_fmt, surface_flags); + windata->surface_w, windata->surface_h, surface_fmt, surface_flags); if (!windata->gs) { return SDL_SetError("Could not create GBM surface"); @@ -1020,14 +1020,11 @@ KMSDRM_SetDisplayMode(_THIS, SDL_VideoDisplay * display, SDL_DisplayMode * mode) return SDL_SetError("Mode doesn't have an associated index"); } - /* Take note of the new mode to be set, and leave the modeset pending. */ + /* Take note of the new mode to be set, and leave the CRTC modeset pending + so it's done in SwapWindow. */ dispdata->mode = conn->modes[modedata->mode_index]; dispdata->modeset_pending = SDL_TRUE; - /* Set the new surface size. */ - dispdata->surface_w = dispdata->mode.hdisplay; - dispdata->surface_h = dispdata->mode.vdisplay; - for (i = 0; i < viddata->num_windows; i++) { SDL_Window *window = viddata->windows[i]; @@ -1193,16 +1190,17 @@ KMSDRM_CreateWindow(_THIS, SDL_Window * window) /* Try to find a matching video mode for the window, with fallback to the original mode if not available, and configure that mode into the CRTC. */ if (mode) { - dispdata->surface_w = window->w; - dispdata->surface_h = window->h; + windata->surface_w = window->w; + windata->surface_h = window->h; dispdata->mode = *mode; } else { - dispdata->surface_w = dispdata->original_mode.hdisplay; - dispdata->surface_h = dispdata->original_mode.vdisplay; + windata->surface_w = dispdata->original_mode.hdisplay; + windata->surface_h = dispdata->original_mode.vdisplay; dispdata->mode = dispdata->original_mode; } + /* Take note to do the modesettng on the CRTC in SwapWindow. */ dispdata->modeset_pending = SDL_TRUE; /* Create the window surfaces with the size we have just chosen. @@ -1239,7 +1237,7 @@ KMSDRM_CreateWindow(_THIS, SDL_Window * window) /* Tell app about the size we have determined for the window, so SDL pre-scales to that size for us. */ SDL_SendWindowEvent(window, SDL_WINDOWEVENT_RESIZED, - dispdata->surface_w, dispdata->surface_h); + windata->surface_w, windata->surface_h); /***********************************************************/ /* Tell SDL that the mouse has entered the window using an */ @@ -1266,8 +1264,8 @@ cleanup: /*****************************************************************************/ void KMSDRM_ReconfigureWindow( _THIS, SDL_Window * window) { - SDL_DisplayData *dispdata = (SDL_DisplayData *) SDL_GetDisplayForWindow(window)->driverdata; + SDL_WindowData *windata = (SDL_WindowData *) window->driverdata; if ((window->flags & SDL_WINDOW_FULLSCREEN_DESKTOP) == SDL_WINDOW_FULLSCREEN_DESKTOP) @@ -1275,8 +1273,8 @@ KMSDRM_ReconfigureWindow( _THIS, SDL_Window * window) { /* Update the current mode to the desktop mode, take note of pending mode configuration to the CRTC, and recreate the GBM surface with the same size as the size. */ - dispdata->surface_w = dispdata->original_mode.hdisplay; - dispdata->surface_h = dispdata->original_mode.vdisplay; + windata->surface_w = dispdata->original_mode.hdisplay; + windata->surface_h = dispdata->original_mode.vdisplay; dispdata->mode = dispdata->original_mode; } else @@ -1288,16 +1286,16 @@ KMSDRM_ReconfigureWindow( _THIS, SDL_Window * window) { if (mode) { /* If matching mode found, recreate the GBM surface with the size of that mode and configure it on the CRTC. */ - dispdata->surface_w = window->windowed.w; - dispdata->surface_h = window->windowed.h; + windata->surface_w = window->windowed.w; + windata->surface_h = window->windowed.h; dispdata->mode = *mode; } else { /* If not matching mode found, recreate the GBM surfaces with the size of the mode that was originally configured on the CRTC, and setup that mode on the CRTC. */ - dispdata->surface_w = dispdata->original_mode.hdisplay; - dispdata->surface_h = dispdata->original_mode.vdisplay; + windata->surface_w = dispdata->original_mode.hdisplay; + windata->surface_h = dispdata->original_mode.vdisplay; dispdata->mode = dispdata->original_mode; } } @@ -1310,7 +1308,7 @@ KMSDRM_ReconfigureWindow( _THIS, SDL_Window * window) { /* Tell app about the size we have determined for the window, so SDL pre-scales to that size for us. */ SDL_SendWindowEvent(window, SDL_WINDOWEVENT_RESIZED, - dispdata->surface_w, dispdata->surface_h); + windata->surface_w, windata->surface_h); } int diff --git a/src/video/kmsdrm/SDL_kmsdrmvideo.h b/src/video/kmsdrm/SDL_kmsdrmvideo.h index 74af9f008..d089e1041 100644 --- a/src/video/kmsdrm/SDL_kmsdrmvideo.h +++ b/src/video/kmsdrm/SDL_kmsdrmvideo.h @@ -78,9 +78,6 @@ typedef struct SDL_DisplayData SDL_bool set_default_cursor_pending; SDL_bool modeset_pending; - uint32_t surface_w; - uint32_t surface_h; - } SDL_DisplayData; typedef struct SDL_WindowData @@ -99,6 +96,12 @@ typedef struct SDL_WindowData EGLSurface egl_surface; + /* The size we chose for the GBM surface. REMEMBER that the CRTC must always have + a mode with the same size configured before trying to flip to a buffer of that + surface or drmModePageFlip() will return -28. */ + uint32_t surface_w; + uint32_t surface_h; + } SDL_WindowData; typedef struct KMSDRM_FBInfo