From dec7875a6e23212021e4d9080330a42832dfe02a Mon Sep 17 00:00:00 2001
From: Edward Rudd <urkle@outoforder.cc>
Date: Tue, 15 Jun 2021 01:40:19 +0000
Subject: [PATCH] update SDL soruce to 2.0.14
---
source/src/video/SDL_video.c | 244 +++++++++++++++++++++++++++++++++++++++---------
1 files changed, 196 insertions(+), 48 deletions(-)
diff --git a/source/src/video/SDL_video.c b/source/src/video/SDL_video.c
index de0bc1c..a0ca322 100644
--- a/source/src/video/SDL_video.c
+++ b/source/src/video/SDL_video.c
@@ -96,6 +96,7 @@
#endif
#if SDL_VIDEO_DRIVER_KMSDRM
&KMSDRM_bootstrap,
+ &KMSDRM_LEGACY_bootstrap,
#endif
#if SDL_VIDEO_DRIVER_RPI
&RPI_bootstrap,
@@ -111,6 +112,10 @@
#endif
#if SDL_VIDEO_DRIVER_OFFSCREEN
&OFFSCREEN_bootstrap,
+#endif
+#if SDL_VIDEO_DRIVER_OS2
+ &OS2DIVE_bootstrap,
+ &OS2VMAN_bootstrap,
#endif
#if SDL_VIDEO_DRIVER_DUMMY
&DUMMY_bootstrap,
@@ -493,19 +498,15 @@
if (driver_name != NULL) {
for (i = 0; bootstrap[i]; ++i) {
if (SDL_strncasecmp(bootstrap[i]->name, driver_name, SDL_strlen(driver_name)) == 0) {
- if (bootstrap[i]->available()) {
- video = bootstrap[i]->create(index);
- break;
- }
+ video = bootstrap[i]->create(index);
+ break;
}
}
} else {
for (i = 0; bootstrap[i]; ++i) {
- if (bootstrap[i]->available()) {
- video = bootstrap[i]->create(index);
- if (video != NULL) {
- break;
- }
+ video = bootstrap[i]->create(index);
+ if (video != NULL) {
+ break;
}
}
}
@@ -599,11 +600,11 @@
}
display.current_mode = display.desktop_mode;
- return SDL_AddVideoDisplay(&display);
+ return SDL_AddVideoDisplay(&display, SDL_FALSE);
}
int
-SDL_AddVideoDisplay(const SDL_VideoDisplay * display)
+SDL_AddVideoDisplay(const SDL_VideoDisplay * display, SDL_bool send_event)
{
SDL_VideoDisplay *displays;
int index = -1;
@@ -625,10 +626,29 @@
SDL_itoa(index, name, 10);
displays[index].name = SDL_strdup(name);
}
+
+ if (send_event) {
+ SDL_SendDisplayEvent(&_this->displays[index], SDL_DISPLAYEVENT_CONNECTED, 0);
+ }
} else {
SDL_OutOfMemory();
}
return index;
+}
+
+void
+SDL_DelVideoDisplay(int index)
+{
+ if (index < 0 || index >= _this->num_displays) {
+ return;
+ }
+
+ SDL_SendDisplayEvent(&_this->displays[index], SDL_DISPLAYEVENT_DISCONNECTED, 0);
+
+ if (index < (_this->num_displays - 1)) {
+ SDL_memmove(&_this->displays[index], &_this->displays[index+1], (_this->num_displays - index - 1)*sizeof(_this->displays[index]));
+ }
+ --_this->num_displays;
}
int
@@ -1366,7 +1386,7 @@
}
#define CREATE_FLAGS \
- (SDL_WINDOW_OPENGL | SDL_WINDOW_BORDERLESS | SDL_WINDOW_RESIZABLE | SDL_WINDOW_ALLOW_HIGHDPI | SDL_WINDOW_ALWAYS_ON_TOP | SDL_WINDOW_SKIP_TASKBAR | SDL_WINDOW_POPUP_MENU | SDL_WINDOW_UTILITY | SDL_WINDOW_TOOLTIP | SDL_WINDOW_VULKAN | SDL_WINDOW_MINIMIZED)
+ (SDL_WINDOW_OPENGL | SDL_WINDOW_BORDERLESS | SDL_WINDOW_RESIZABLE | SDL_WINDOW_ALLOW_HIGHDPI | SDL_WINDOW_ALWAYS_ON_TOP | SDL_WINDOW_SKIP_TASKBAR | SDL_WINDOW_POPUP_MENU | SDL_WINDOW_UTILITY | SDL_WINDOW_TOOLTIP | SDL_WINDOW_VULKAN | SDL_WINDOW_MINIMIZED | SDL_WINDOW_METAL)
static SDL_INLINE SDL_bool
IsAcceptingDragAndDrop(void)
@@ -1429,7 +1449,7 @@
if (!_this) {
/* Initialize the video system if needed */
- if (SDL_VideoInit(NULL) < 0) {
+ if (SDL_Init(SDL_INIT_VIDEO) < 0) {
return NULL;
}
}
@@ -1455,7 +1475,7 @@
/* Some platforms have OpenGL enabled by default */
#if (SDL_VIDEO_OPENGL && __MACOSX__) || __IPHONEOS__ || __ANDROID__ || __NACL__
- if (!_this->is_dummy && !(flags & SDL_WINDOW_VULKAN) && !SDL_IsVideoContextExternal()) {
+ if (!_this->is_dummy && !(flags & SDL_WINDOW_VULKAN) && !(flags & SDL_WINDOW_METAL) && !SDL_IsVideoContextExternal()) {
flags |= SDL_WINDOW_OPENGL;
}
#endif
@@ -1483,6 +1503,24 @@
return NULL;
}
if (SDL_Vulkan_LoadLibrary(NULL) < 0) {
+ return NULL;
+ }
+ }
+
+ if (flags & SDL_WINDOW_METAL) {
+ if (!_this->Metal_CreateView) {
+ SDL_SetError("Metal support is either not configured in SDL "
+ "or not available in current SDL video driver "
+ "(%s) or platform", _this->name);
+ return NULL;
+ }
+ if (flags & SDL_WINDOW_OPENGL) {
+ SDL_SetError("Metal and OpenGL not supported on same window");
+ return NULL;
+ }
+ if (flags & SDL_WINDOW_VULKAN) {
+ SDL_SetError("Metal and Vulkan not supported on same window. "
+ "To use MoltenVK, set SDL_WINDOW_VULKAN only.");
return NULL;
}
}
@@ -1635,6 +1673,11 @@
SDL_RecreateWindow(SDL_Window * window, Uint32 flags)
{
SDL_bool loaded_opengl = SDL_FALSE;
+ SDL_bool need_gl_unload = SDL_FALSE;
+ SDL_bool need_gl_load = SDL_FALSE;
+ SDL_bool loaded_vulkan = SDL_FALSE;
+ SDL_bool need_vulkan_unload = SDL_FALSE;
+ SDL_bool need_vulkan_load = SDL_FALSE;
if ((flags & SDL_WINDOW_OPENGL) && !_this->GL_CreateContext) {
return SDL_SetError("OpenGL support is either not configured in SDL "
@@ -1668,29 +1711,72 @@
if ((window->flags & SDL_WINDOW_OPENGL) != (flags & SDL_WINDOW_OPENGL)) {
if (flags & SDL_WINDOW_OPENGL) {
- if (SDL_GL_LoadLibrary(NULL) < 0) {
- return -1;
- }
- loaded_opengl = SDL_TRUE;
+ need_gl_load = SDL_TRUE;
} else {
- SDL_GL_UnloadLibrary();
+ need_gl_unload = SDL_TRUE;
}
} else if (window->flags & SDL_WINDOW_OPENGL) {
+ need_gl_unload = SDL_TRUE;
+ need_gl_load = SDL_TRUE;
+ }
+
+ if ((window->flags & SDL_WINDOW_METAL) != (flags & SDL_WINDOW_METAL)) {
+ if (flags & SDL_WINDOW_METAL) {
+ need_gl_load = SDL_TRUE;
+ } else {
+ need_gl_unload = SDL_TRUE;
+ }
+ } else if (window->flags & SDL_WINDOW_METAL) {
+ need_gl_unload = SDL_TRUE;
+ need_gl_load = SDL_TRUE;
+ }
+
+ if ((window->flags & SDL_WINDOW_VULKAN) != (flags & SDL_WINDOW_VULKAN)) {
+ if (flags & SDL_WINDOW_VULKAN) {
+ need_vulkan_load = SDL_TRUE;
+ } else {
+ need_vulkan_unload = SDL_TRUE;
+ }
+ } else if (window->flags & SDL_WINDOW_VULKAN) {
+ need_vulkan_unload = SDL_TRUE;
+ need_vulkan_load = SDL_TRUE;
+ }
+
+ if ((flags & SDL_WINDOW_VULKAN) && (flags & SDL_WINDOW_OPENGL)) {
+ SDL_SetError("Vulkan and OpenGL not supported on same window");
+ return -1;
+ }
+
+ if ((flags & SDL_WINDOW_METAL) && (flags & SDL_WINDOW_OPENGL)) {
+ SDL_SetError("Metal and OpenGL not supported on same window");
+ return -1;
+ }
+
+ if ((flags & SDL_WINDOW_METAL) && (flags & SDL_WINDOW_VULKAN)) {
+ SDL_SetError("Metal and Vulkan not supported on same window");
+ return -1;
+ }
+
+ if (need_gl_unload) {
SDL_GL_UnloadLibrary();
+ }
+
+ if (need_vulkan_unload) {
+ SDL_Vulkan_UnloadLibrary();
+ }
+
+ if (need_gl_load) {
if (SDL_GL_LoadLibrary(NULL) < 0) {
return -1;
}
loaded_opengl = SDL_TRUE;
}
- if ((window->flags & SDL_WINDOW_VULKAN) != (flags & SDL_WINDOW_VULKAN)) {
- SDL_SetError("Can't change SDL_WINDOW_VULKAN window flag");
- return -1;
- }
-
- if ((window->flags & SDL_WINDOW_VULKAN) && (flags & SDL_WINDOW_OPENGL)) {
- SDL_SetError("Vulkan and OpenGL not supported on same window");
- return -1;
+ if (need_vulkan_load) {
+ if (SDL_Vulkan_LoadLibrary(NULL) < 0) {
+ return -1;
+ }
+ loaded_vulkan = SDL_TRUE;
}
window->flags = ((flags & CREATE_FLAGS) | SDL_WINDOW_HIDDEN);
@@ -1702,6 +1788,10 @@
if (loaded_opengl) {
SDL_GL_UnloadLibrary();
window->flags &= ~SDL_WINDOW_OPENGL;
+ }
+ if (loaded_vulkan) {
+ SDL_Vulkan_UnloadLibrary();
+ window->flags &= ~SDL_WINDOW_VULKAN;
}
return -1;
}
@@ -2098,8 +2188,8 @@
return;
}
- if ((window->max_w && min_w >= window->max_w) ||
- (window->max_h && min_h >= window->max_h)) {
+ if ((window->max_w && min_w > window->max_w) ||
+ (window->max_h && min_h > window->max_h)) {
SDL_SetError("SDL_SetWindowMinimumSize(): Tried to set minimum size larger than maximum size");
return;
}
@@ -2141,7 +2231,7 @@
return;
}
- if (max_w <= window->min_w || max_h <= window->min_h) {
+ if (max_w < window->min_w || max_h < window->min_h) {
SDL_SetError("SDL_SetWindowMaximumSize(): Tried to set maximum size smaller than minimum size");
return;
}
@@ -2319,6 +2409,10 @@
return NULL;
}
+ if (window->surface) {
+ return window->surface;
+ }
+
if (!SDL_PixelFormatEnumToMasks(format, &bpp, &Rmask, &Gmask, &Bmask, &Amask)) {
return NULL;
}
@@ -2335,6 +2429,7 @@
if (window->surface) {
window->surface->flags &= ~SDL_DONTFREE;
SDL_FreeSurface(window->surface);
+ window->surface = NULL;
}
window->surface = SDL_CreateWindowFramebuffer(window);
if (window->surface) {
@@ -2694,7 +2789,7 @@
}
#endif
- return SDL_GetHintBoolean(SDL_HINT_VIDEO_MINIMIZE_ON_FOCUS_LOSS, SDL_TRUE);
+ return SDL_GetHintBoolean(SDL_HINT_VIDEO_MINIMIZE_ON_FOCUS_LOSS, SDL_FALSE);
}
void
@@ -2759,6 +2854,8 @@
if (window->surface) {
window->surface->flags &= ~SDL_DONTFREE;
SDL_FreeSurface(window->surface);
+ window->surface = NULL;
+ window->surface_valid = SDL_FALSE;
}
if (_this->DestroyWindowFramebuffer) {
_this->DestroyWindowFramebuffer(_this, window);
@@ -3111,24 +3208,24 @@
_this->gl_config.retained_backing = 1;
_this->gl_config.accelerated = -1; /* accelerated or not, both are fine */
+#if SDL_VIDEO_OPENGL
+ _this->gl_config.major_version = 2;
+ _this->gl_config.minor_version = 1;
+ _this->gl_config.profile_mask = 0;
+#elif SDL_VIDEO_OPENGL_ES2
+ _this->gl_config.major_version = 2;
+ _this->gl_config.minor_version = 0;
+ _this->gl_config.profile_mask = SDL_GL_CONTEXT_PROFILE_ES;
+#elif SDL_VIDEO_OPENGL_ES
+ _this->gl_config.major_version = 1;
+ _this->gl_config.minor_version = 1;
+ _this->gl_config.profile_mask = SDL_GL_CONTEXT_PROFILE_ES;
+#endif
+
if (_this->GL_DefaultProfileConfig) {
_this->GL_DefaultProfileConfig(_this, &_this->gl_config.profile_mask,
&_this->gl_config.major_version,
&_this->gl_config.minor_version);
- } else {
-#if SDL_VIDEO_OPENGL
- _this->gl_config.major_version = 2;
- _this->gl_config.minor_version = 1;
- _this->gl_config.profile_mask = 0;
-#elif SDL_VIDEO_OPENGL_ES2
- _this->gl_config.major_version = 2;
- _this->gl_config.minor_version = 0;
- _this->gl_config.profile_mask = SDL_GL_CONTEXT_PROFILE_ES;
-#elif SDL_VIDEO_OPENGL_ES
- _this->gl_config.major_version = 1;
- _this->gl_config.minor_version = 1;
- _this->gl_config.profile_mask = SDL_GL_CONTEXT_PROFILE_ES;
-#endif
}
_this->gl_config.flags = 0;
@@ -3546,12 +3643,14 @@
if (!ctx) {
window = NULL;
- } else {
+ } else if (window) {
CHECK_WINDOW_MAGIC(window, -1);
if (!(window->flags & SDL_WINDOW_OPENGL)) {
return SDL_SetError("The specified window isn't an OpenGL window");
}
+ } else if (!_this->gl_allow_no_surface) {
+ return SDL_SetError("Use of OpenGL without a window is not supported on this platform");
}
retval = _this->GL_MakeCurrent(_this, window, ctx);
@@ -3867,9 +3966,11 @@
#if SDL_VIDEO_DRIVER_HAIKU
#include "haiku/SDL_bmessagebox.h"
#endif
+#if SDL_VIDEO_DRIVER_OS2
+#include "os2/SDL_os2messagebox.h"
+#endif
-
-#if SDL_VIDEO_DRIVER_WINDOWS || SDL_VIDEO_DRIVER_WINRT || SDL_VIDEO_DRIVER_COCOA || SDL_VIDEO_DRIVER_UIKIT || SDL_VIDEO_DRIVER_X11 || SDL_VIDEO_DRIVER_HAIKU
+#if SDL_VIDEO_DRIVER_WINDOWS || SDL_VIDEO_DRIVER_WINRT || SDL_VIDEO_DRIVER_COCOA || SDL_VIDEO_DRIVER_UIKIT || SDL_VIDEO_DRIVER_X11 || SDL_VIDEO_DRIVER_HAIKU || SDL_VIDEO_DRIVER_OS2
static SDL_bool SDL_MessageboxValidForDriver(const SDL_MessageBoxData *messageboxdata, SDL_SYSWM_TYPE drivertype)
{
SDL_SysWMinfo info;
@@ -3897,6 +3998,7 @@
int show_cursor_prev;
SDL_bool mouse_captured;
SDL_Window *current_window;
+ SDL_MessageBoxData mbdata;
if (!messageboxdata) {
return SDL_InvalidParamError("messageboxdata");
@@ -3915,6 +4017,11 @@
if (!buttonid) {
buttonid = &dummybutton;
}
+
+ SDL_memcpy(&mbdata, messageboxdata, sizeof(*messageboxdata));
+ if (!mbdata.title) mbdata.title = "";
+ if (!mbdata.message) mbdata.message = "";
+ messageboxdata = &mbdata;
if (_this && _this->ShowMessageBox) {
retval = _this->ShowMessageBox(_this, messageboxdata, buttonid);
@@ -3969,6 +4076,13 @@
retval = 0;
}
#endif
+#if SDL_VIDEO_DRIVER_OS2
+ if (retval == -1 &&
+ SDL_MessageboxValidForDriver(messageboxdata, SDL_SYSWM_OS2) &&
+ OS2_ShowMessageBox(messageboxdata, buttonid) == 0) {
+ retval = 0;
+ }
+#endif
if (retval == -1) {
SDL_SetError("No message system available");
}
@@ -3994,6 +4108,8 @@
/* Web browsers don't (currently) have an API for a custom message box
that can block, but for the most common case (SDL_ShowSimpleMessageBox),
we can use the standard Javascript alert() function. */
+ if (!title) title = "";
+ if (!message) message = "";
EM_ASM_({
alert(UTF8ToString($0) + "\n\n" + UTF8ToString($1));
}, title, message);
@@ -4219,6 +4335,11 @@
{
CHECK_WINDOW_MAGIC(window, NULL);
+ if (!(window->flags & SDL_WINDOW_METAL)) {
+ SDL_SetError("The specified window isn't a Metal window");
+ return NULL;
+ }
+
if (_this->Metal_CreateView) {
return _this->Metal_CreateView(_this, window);
} else {
@@ -4235,4 +4356,31 @@
}
}
+void *
+SDL_Metal_GetLayer(SDL_MetalView view)
+{
+ if (_this && _this->Metal_GetLayer) {
+ if (view) {
+ return _this->Metal_GetLayer(_this, view);
+ } else {
+ SDL_InvalidParamError("view");
+ return NULL;
+ }
+ } else {
+ SDL_SetError("Metal is not supported.");
+ return NULL;
+ }
+}
+
+void SDL_Metal_GetDrawableSize(SDL_Window * window, int *w, int *h)
+{
+ CHECK_WINDOW_MAGIC(window,);
+
+ if (_this->Metal_GetDrawableSize) {
+ _this->Metal_GetDrawableSize(_this, window, w, h);
+ } else {
+ SDL_GetWindowSize(window, w, h);
+ }
+}
+
/* vi: set ts=4 sw=4 expandtab: */
--
Gitblit v1.9.3