From 844275491268fadcc7c6c2d0361f34a64c15d3ef Mon Sep 17 00:00:00 2001 From: Manuel Alfayate Corchete Date: Tue, 12 Jan 2021 00:22:58 +0100 Subject: [PATCH] [KMS/DRM] Refactor KMSDR_CreateSurface to group all non-Vulkan stuff in a block. --- src/video/kmsdrm/SDL_kmsdrmvideo.c | 122 ++++++++++++++--------------- 1 file changed, 61 insertions(+), 61 deletions(-) diff --git a/src/video/kmsdrm/SDL_kmsdrmvideo.c b/src/video/kmsdrm/SDL_kmsdrmvideo.c index b65b96279..333454e59 100644 --- a/src/video/kmsdrm/SDL_kmsdrmvideo.c +++ b/src/video/kmsdrm/SDL_kmsdrmvideo.c @@ -1008,58 +1008,6 @@ KMSDRM_CreateWindow(_THIS, SDL_Window * window) int ret = 0; drmModeModeInfo *mode; - if ( !(dispdata->gbm_init) && !is_vulkan && !vulkan_mode ) { - - /* If this is not a Vulkan Window, then this is a GL window, so at the - end of this function, we must have marked the window as being OPENGL - and we must have loaded the GL library: both things are needed so the - GL_CreateRenderer() and GL_LoadFunctions() calls in SDL_CreateWindow() - succeed without having to re-create the window. - We must load the EGL library too, which can't be loaded until the GBM - device has been created, because SDL_EGL_Library() function uses it. */ - - /* Maybe you didn't ask for an OPENGL window, but that's what you will get. - See previous comment on why. */ - window->flags |= SDL_WINDOW_OPENGL; - - /* Don't force fullscreen on all windows: it confuses programs that try - to set a window fullscreen after creating it as non-fullscreen (sm64ex) */ - // window->flags |= SDL_WINDOW_FULLSCREEN; - - /* Reopen FD, create gbm dev, setup display plane, etc,. - but only when we come here for the first time, - and only if it's not a VK window. */ - if ((ret = KMSDRM_GBMInit(_this, dispdata))) { - goto cleanup; - } - - /* Manually load the GL library. KMSDRM_EGL_LoadLibrary() has already - been called by SDL_CreateWindow() but we don't do anything there, - precisely to be able to load it here. - If we let SDL_CreateWindow() load the lib, it will be loaded - before we call KMSDRM_GBMInit(), causing GLES programs to fail. */ - if (!_this->egl_data) { - egl_display = (NativeDisplayType)((SDL_VideoData *)_this->driverdata)->gbm_dev; - if (SDL_EGL_LoadLibrary(_this, NULL, egl_display, EGL_PLATFORM_GBM_MESA)) { - goto cleanup; - } - - if (SDL_GL_LoadLibrary(NULL) < 0) { - goto cleanup; - } - } - - /* Can't init mouse stuff sooner because cursor plane is not ready, - so we do it here. */ - KMSDRM_InitMouse(_this); - - /* Since we take cursor buffer way from the cursor plane and - destroy the cursor GBM BO when we destroy a window, we must - also manually re-show the cursor on screen, if necessary, - when we create a window. */ - KMSDRM_InitCursor(); - } - /* Allocate window internal data */ windata = (SDL_WindowData *)SDL_calloc(1, sizeof(SDL_WindowData)); if (!windata) { @@ -1071,16 +1019,68 @@ KMSDRM_CreateWindow(_THIS, SDL_Window * window) windata->viddata = viddata; window->driverdata = windata; - /* We simply IGNORE if it's a fullscreen window, window->flags desn't reflect it. - If it's fullscreen, we will manage that in KMSDRM_SetWindwoFullscreen(), - which will be called by SDL later, if necessary. */ - mode = KMSDRM_GetConnectorMode(dispdata->connector, window->w, window->h ); + if (!is_vulkan && !vulkan_mode) { /* NON-Vulkan block. */ - if (!is_vulkan && !vulkan_mode) { + if (!(dispdata->gbm_init)) { - /* 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) { + /* In order for the GL_CreateRenderer() and GL_LoadFunctions() calls + in SDL_CreateWindow succeed (no doing so causes a windo re-creation), + At the end of this block, we must have: + -Marked the window as being OPENGL + -Loaded the GL library (which can't be loaded until the GBM + device has been created) because SDL_EGL_Library() function uses it. + */ + + /* Maybe you didn't ask for an OPENGL window, but that's what you will get. + See previous comment on why. */ + window->flags |= SDL_WINDOW_OPENGL; + + /* Reopen FD, create gbm dev, setup display plane, etc,. + but only when we come here for the first time, + and only if it's not a VK window. */ + if ((ret = KMSDRM_GBMInit(_this, dispdata))) { + goto cleanup; + } + + /* Manually load the GL library. KMSDRM_EGL_LoadLibrary() has already + been called by SDL_CreateWindow() but we don't do anything there, + precisely to be able to load it here. + If we let SDL_CreateWindow() load the lib, it will be loaded + before we call KMSDRM_GBMInit(), causing GLES programs to fail. */ + if (!_this->egl_data) { + egl_display = (NativeDisplayType)((SDL_VideoData *)_this->driverdata)->gbm_dev; + if (SDL_EGL_LoadLibrary(_this, NULL, egl_display, EGL_PLATFORM_GBM_MESA)) { + goto cleanup; + } + + if (SDL_GL_LoadLibrary(NULL) < 0) { + goto cleanup; + } + } + + /* Can't init mouse stuff sooner because cursor plane is not ready, + so we do it here. */ + KMSDRM_InitMouse(_this); + + /* Since we take cursor buffer way from the cursor plane and + destroy the cursor GBM BO when we destroy a window, we must + also manually re-show the cursor on screen, if necessary, + when we create a window. */ + KMSDRM_InitCursor(); + } + + /**********************************************************************/ + /* We simply IGNORE if it's a fullscreen window, window->flags don't */ + /* reflect it: if it's fullscreen, KMSDRM_SetWindwoFullscreen() which */ + /* will be called by SDL later, and we can manage it there. */ + /**********************************************************************/ + + /* Try to find a matching video mode for the window, fallback to the + original mode if not available, and configure the mode we chose + into the CRTC. */ + mode = KMSDRM_GetConnectorMode(dispdata->connector, window->w, window->h ); + + if (mode) { windata->surface_w = window->w; windata->surface_h = window->h; dispdata->mode = *mode; @@ -1104,7 +1104,7 @@ KMSDRM_CreateWindow(_THIS, SDL_Window * window) so SDL pre-scales to that size for us. */ SDL_SendWindowEvent(window, SDL_WINDOWEVENT_RESIZED, windata->surface_w, windata->surface_h); - } + } /* NON-Vulkan block ends. */ /* Add window to the internal list of tracked windows. Note, while it may seem odd to support multiple fullscreen windows, some apps create an