mirror of
https://github.com/Relintai/sdl2_frt.git
synced 2024-12-16 11:06:49 +01:00
[KMS/DRM] Correct EGL/GL library loading on window creation, thus saving window re-creation.
This commit is contained in:
parent
d81fe9239f
commit
e34caa9779
@ -75,8 +75,8 @@ KMSDRM_GLES_LoadLibrary(_THIS, const char *path) {
|
|||||||
|
|
||||||
void
|
void
|
||||||
KMSDRM_GLES_UnloadLibrary(_THIS) {
|
KMSDRM_GLES_UnloadLibrary(_THIS) {
|
||||||
/* As with KMSDRM_GLES_LoadLibrary(), we define our own unloading function so
|
/* As with KMSDRM_GLES_LoadLibrary(), we define our own "dummy" unloading function
|
||||||
we manually unload the library whenever we want. */
|
so we manually unload the library whenever we want. */
|
||||||
}
|
}
|
||||||
|
|
||||||
SDL_EGL_CreateContext_impl(KMSDRM)
|
SDL_EGL_CreateContext_impl(KMSDRM)
|
||||||
|
@ -856,16 +856,18 @@ KMSDRM_CreateDevice(int devindex)
|
|||||||
device->SetWindowGrab = KMSDRM_SetWindowGrab;
|
device->SetWindowGrab = KMSDRM_SetWindowGrab;
|
||||||
device->DestroyWindow = KMSDRM_DestroyWindow;
|
device->DestroyWindow = KMSDRM_DestroyWindow;
|
||||||
device->GetWindowWMInfo = KMSDRM_GetWindowWMInfo;
|
device->GetWindowWMInfo = KMSDRM_GetWindowWMInfo;
|
||||||
|
|
||||||
device->GL_DefaultProfileConfig = KMSDRM_GLES_DefaultProfileConfig;
|
device->GL_DefaultProfileConfig = KMSDRM_GLES_DefaultProfileConfig;
|
||||||
device->GL_LoadLibrary = KMSDRM_GLES_LoadLibrary;
|
|
||||||
device->GL_GetProcAddress = KMSDRM_GLES_GetProcAddress;
|
device->GL_GetProcAddress = KMSDRM_GLES_GetProcAddress;
|
||||||
device->GL_UnloadLibrary = KMSDRM_GLES_UnloadLibrary;
|
|
||||||
device->GL_CreateContext = KMSDRM_GLES_CreateContext;
|
device->GL_CreateContext = KMSDRM_GLES_CreateContext;
|
||||||
device->GL_MakeCurrent = KMSDRM_GLES_MakeCurrent;
|
device->GL_MakeCurrent = KMSDRM_GLES_MakeCurrent;
|
||||||
device->GL_SetSwapInterval = KMSDRM_GLES_SetSwapInterval;
|
device->GL_SetSwapInterval = KMSDRM_GLES_SetSwapInterval;
|
||||||
device->GL_GetSwapInterval = KMSDRM_GLES_GetSwapInterval;
|
device->GL_GetSwapInterval = KMSDRM_GLES_GetSwapInterval;
|
||||||
device->GL_SwapWindow = KMSDRM_GLES_SwapWindow;
|
device->GL_SwapWindow = KMSDRM_GLES_SwapWindow;
|
||||||
device->GL_DeleteContext = KMSDRM_GLES_DeleteContext;
|
device->GL_DeleteContext = KMSDRM_GLES_DeleteContext;
|
||||||
|
/* Those two functions are dummy. We do these things manually. */
|
||||||
|
device->GL_LoadLibrary = KMSDRM_GLES_LoadLibrary;
|
||||||
|
device->GL_UnloadLibrary = KMSDRM_GLES_UnloadLibrary;
|
||||||
|
|
||||||
#if SDL_VIDEO_VULKAN
|
#if SDL_VIDEO_VULKAN
|
||||||
device->Vulkan_LoadLibrary = KMSDRM_Vulkan_LoadLibrary;
|
device->Vulkan_LoadLibrary = KMSDRM_Vulkan_LoadLibrary;
|
||||||
@ -1499,6 +1501,11 @@ KMSDRM_DestroyWindow(_THIS, SDL_Window *window)
|
|||||||
SDL_EGL_UnloadLibrary(_this);
|
SDL_EGL_UnloadLibrary(_this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Unload GL library. */
|
||||||
|
if (_this->gl_config.driver_loaded) {
|
||||||
|
SDL_GL_UnloadLibrary();
|
||||||
|
}
|
||||||
|
|
||||||
/* Free display plane, and destroy GBM device. */
|
/* Free display plane, and destroy GBM device. */
|
||||||
KMSDRM_GBMDeinit(_this, dispdata);
|
KMSDRM_GBMDeinit(_this, dispdata);
|
||||||
}
|
}
|
||||||
@ -1774,6 +1781,16 @@ KMSDRM_CreateWindow(_THIS, SDL_Window * window)
|
|||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
if ( !(dispdata->gbm_init) && !is_vulkan && !vulkan_mode ) {
|
if ( !(dispdata->gbm_init) && !is_vulkan && !vulkan_mode ) {
|
||||||
|
|
||||||
|
/* Maybe you didn't ask for an OPENGL window, but that's what you will get.
|
||||||
|
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. */
|
||||||
|
window->flags |= SDL_WINDOW_OPENGL;
|
||||||
|
|
||||||
/* Reopen FD, create gbm dev, setup display plane, etc,.
|
/* Reopen FD, create gbm dev, setup display plane, etc,.
|
||||||
but only when we come here for the first time,
|
but only when we come here for the first time,
|
||||||
and only if it's not a VK window. */
|
and only if it's not a VK window. */
|
||||||
@ -1781,19 +1798,24 @@ KMSDRM_CreateWindow(_THIS, SDL_Window * window)
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Manually load the EGL library. KMSDRM_EGL_LoadLibrary() has already
|
/* Manually load the GL library. KMSDRM_EGL_LoadLibrary() has already
|
||||||
been called by SDL_CreateWindow() but we don't do anything there,
|
been called by SDL_CreateWindow() but we don't do anything there,
|
||||||
precisely to be able to load it here.
|
precisely to be able to load it here.
|
||||||
If we let SDL_CreateWindow() load the lib, it will be loaded
|
If we let SDL_CreateWindow() load the lib, it will be loaded
|
||||||
before we call KMSDRM_GBMInit(), causing GLES programs to fail. */
|
before we call KMSDRM_GBMInit(), causing GLES programs to fail. */
|
||||||
if (!_this->egl_data) {
|
if (!_this->egl_data) {
|
||||||
egl_display = (NativeDisplayType)((SDL_VideoData *)_this->driverdata)->gbm_dev;
|
egl_display = (NativeDisplayType)((SDL_VideoData *)_this->driverdata)->gbm_dev;
|
||||||
if ((ret = SDL_EGL_LoadLibrary(_this, NULL, egl_display, EGL_PLATFORM_GBM_MESA))) {
|
if (SDL_EGL_LoadLibrary(_this, NULL, egl_display, EGL_PLATFORM_GBM_MESA)) {
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (SDL_GL_LoadLibrary(NULL) < 0) {
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Can't init mouse stuff sooner because cursor plane is not ready. */
|
/* Can't init mouse stuff sooner because cursor plane is not ready,
|
||||||
|
so we do it here. */
|
||||||
KMSDRM_InitMouse(_this);
|
KMSDRM_InitMouse(_this);
|
||||||
|
|
||||||
/* Since we take cursor buffer way from the cursor plane and
|
/* Since we take cursor buffer way from the cursor plane and
|
||||||
|
Loading…
Reference in New Issue
Block a user