mirror of
https://github.com/Relintai/sdl2_frt.git
synced 2024-12-20 22:16:49 +01:00
[KMS/DRM] Refactor KMSDR_CreateSurface to group all non-Vulkan stuff in a block.
This commit is contained in:
parent
87eb734c4e
commit
8442754912
@ -1008,58 +1008,6 @@ KMSDRM_CreateWindow(_THIS, SDL_Window * window)
|
|||||||
int ret = 0;
|
int ret = 0;
|
||||||
drmModeModeInfo *mode;
|
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 */
|
/* Allocate window internal data */
|
||||||
windata = (SDL_WindowData *)SDL_calloc(1, sizeof(SDL_WindowData));
|
windata = (SDL_WindowData *)SDL_calloc(1, sizeof(SDL_WindowData));
|
||||||
if (!windata) {
|
if (!windata) {
|
||||||
@ -1071,16 +1019,68 @@ KMSDRM_CreateWindow(_THIS, SDL_Window * window)
|
|||||||
windata->viddata = viddata;
|
windata->viddata = viddata;
|
||||||
window->driverdata = windata;
|
window->driverdata = windata;
|
||||||
|
|
||||||
/* We simply IGNORE if it's a fullscreen window, window->flags desn't reflect it.
|
if (!is_vulkan && !vulkan_mode) { /* NON-Vulkan block. */
|
||||||
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) {
|
if (!(dispdata->gbm_init)) {
|
||||||
|
|
||||||
/* Try to find a matching video mode for the window, with fallback to the
|
/* In order for the GL_CreateRenderer() and GL_LoadFunctions() calls
|
||||||
original mode if not available, and configure that mode into the CRTC. */
|
in SDL_CreateWindow succeed (no doing so causes a windo re-creation),
|
||||||
if (mode) {
|
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_w = window->w;
|
||||||
windata->surface_h = window->h;
|
windata->surface_h = window->h;
|
||||||
dispdata->mode = *mode;
|
dispdata->mode = *mode;
|
||||||
@ -1104,7 +1104,7 @@ KMSDRM_CreateWindow(_THIS, SDL_Window * window)
|
|||||||
so SDL pre-scales to that size for us. */
|
so SDL pre-scales to that size for us. */
|
||||||
SDL_SendWindowEvent(window, SDL_WINDOWEVENT_RESIZED,
|
SDL_SendWindowEvent(window, SDL_WINDOWEVENT_RESIZED,
|
||||||
windata->surface_w, windata->surface_h);
|
windata->surface_w, windata->surface_h);
|
||||||
}
|
} /* NON-Vulkan block ends. */
|
||||||
|
|
||||||
/* Add window to the internal list of tracked windows. Note, while it may
|
/* Add window to the internal list of tracked windows. Note, while it may
|
||||||
seem odd to support multiple fullscreen windows, some apps create an
|
seem odd to support multiple fullscreen windows, some apps create an
|
||||||
|
Loading…
Reference in New Issue
Block a user