From 60d1944e463da73f753661190d783961a9c5b764 Mon Sep 17 00:00:00 2001
From: Shootfast <[EMAIL REDACTED]>
Date: Wed, 6 Jul 2022 20:12:30 +0100
Subject: [PATCH] SDL_video: Added SDL_GL_FLOATBUFFERS to allow Cocoa GL
contexts to use EDR
---
include/SDL_video.h | 3 ++-
src/video/SDL_sysvideo.h | 1 +
src/video/SDL_video.c | 4 ++++
src/video/cocoa/SDL_cocoaopengl.m | 3 +++
src/video/windows/SDL_windowsopengl.c | 9 +++++++++
src/video/x11/SDL_x11opengl.c | 20 +++++++++++++++++++-
6 files changed, 38 insertions(+), 2 deletions(-)
diff --git a/include/SDL_video.h b/include/SDL_video.h
index 48d00cf406c..8e6d317a68e 100644
--- a/include/SDL_video.h
+++ b/include/SDL_video.h
@@ -248,7 +248,8 @@ typedef enum
SDL_GL_FRAMEBUFFER_SRGB_CAPABLE,
SDL_GL_CONTEXT_RELEASE_BEHAVIOR,
SDL_GL_CONTEXT_RESET_NOTIFICATION,
- SDL_GL_CONTEXT_NO_ERROR
+ SDL_GL_CONTEXT_NO_ERROR,
+ SDL_GL_FLOATBUFFERS
} SDL_GLattr;
typedef enum
diff --git a/src/video/SDL_sysvideo.h b/src/video/SDL_sysvideo.h
index fdaf1adf115..6bfb60e9275 100644
--- a/src/video/SDL_sysvideo.h
+++ b/src/video/SDL_sysvideo.h
@@ -368,6 +368,7 @@ struct SDL_VideoDevice
int stereo;
int multisamplebuffers;
int multisamplesamples;
+ int floatbuffers;
int accelerated;
int major_version;
int minor_version;
diff --git a/src/video/SDL_video.c b/src/video/SDL_video.c
index 2ce99c9210d..986854345d3 100644
--- a/src/video/SDL_video.c
+++ b/src/video/SDL_video.c
@@ -3519,6 +3519,7 @@ SDL_GL_ResetAttributes()
_this->gl_config.stereo = 0;
_this->gl_config.multisamplebuffers = 0;
_this->gl_config.multisamplesamples = 0;
+ _this->gl_config.floatbuffers = 0;
_this->gl_config.retained_backing = 1;
_this->gl_config.accelerated = -1; /* accelerated or not, both are fine */
@@ -3607,6 +3608,9 @@ SDL_GL_SetAttribute(SDL_GLattr attr, int value)
case SDL_GL_MULTISAMPLESAMPLES:
_this->gl_config.multisamplesamples = value;
break;
+ case SDL_GL_FLOATBUFFERS:
+ _this->gl_config.floatbuffers = value;
+ break;
case SDL_GL_ACCELERATED_VISUAL:
_this->gl_config.accelerated = value;
break;
diff --git a/src/video/cocoa/SDL_cocoaopengl.m b/src/video/cocoa/SDL_cocoaopengl.m
index 5a57612b2fa..5b41b18222b 100644
--- a/src/video/cocoa/SDL_cocoaopengl.m
+++ b/src/video/cocoa/SDL_cocoaopengl.m
@@ -261,6 +261,9 @@ - (void)explicitUpdate
attr[i++] = _this->gl_config.multisamplesamples;
attr[i++] = NSOpenGLPFANoRecovery;
}
+ if (_this->gl_config.floatbuffers) {
+ attr[i++] = NSOpenGLPFAColorFloat;
+ }
if (_this->gl_config.accelerated >= 0) {
if (_this->gl_config.accelerated) {
diff --git a/src/video/windows/SDL_windowsopengl.c b/src/video/windows/SDL_windowsopengl.c
index 549b01bb179..1f81917f359 100644
--- a/src/video/windows/SDL_windowsopengl.c
+++ b/src/video/windows/SDL_windowsopengl.c
@@ -74,6 +74,11 @@
#define WGL_FRAMEBUFFER_SRGB_CAPABLE_ARB 0x20A9
#endif
+#ifndef WGL_ARB_pixel_format_float
+#define WGL_ARB_pixel_format_float
+#define WGL_TYPE_RGBA_FLOAT_ARB 0x21A0
+#endif
+
#ifndef WGL_ARB_context_flush_control
#define WGL_ARB_context_flush_control
#define WGL_CONTEXT_RELEASE_BEHAVIOR_ARB 0x2097
@@ -597,6 +602,10 @@ WIN_GL_SetupWindowInternal(_THIS, SDL_Window * window)
*iAttr++ = _this->gl_config.multisamplesamples;
}
+ if (_this->gl_config.floatbuffers) {
+ *iAttr++ = WGL_TYPE_RGBA_FLOAT_ARB;
+ }
+
if (_this->gl_config.framebuffer_srgb_capable) {
*iAttr++ = WGL_FRAMEBUFFER_SRGB_CAPABLE_ARB;
*iAttr++ = _this->gl_config.framebuffer_srgb_capable;
diff --git a/src/video/x11/SDL_x11opengl.c b/src/video/x11/SDL_x11opengl.c
index 3e17e97ff5a..60b2203cdf6 100644
--- a/src/video/x11/SDL_x11opengl.c
+++ b/src/video/x11/SDL_x11opengl.c
@@ -118,6 +118,16 @@ typedef GLXContext(*PFNGLXCREATECONTEXTATTRIBSARBPROC) (Display * dpy,
#endif
#endif
+#ifndef GLX_ARB_fbconfig_float
+#define GLX_ARB_fbconfig_float
+#ifndef GLX_RGBA_FLOAT_TYPE_ARB
+#define GLX_RGBA_FLOAT_TYPE_ARB 0x20B9
+#endif
+#ifndef GLX_RGBA_FLOAT_BIT_ARB
+#define GLX_RGBA_FLOAT_BIT_ARB 0x00000004
+#endif
+#endif
+
#ifndef GLX_ARB_create_context_no_error
#define GLX_ARB_create_context_no_error
#ifndef GLX_CONTEXT_OPENGL_NO_ERROR_ARB
@@ -492,7 +502,11 @@ X11_GL_GetAttributes(_THIS, Display * display, int screen, int * attribs, int si
/* Setup our GLX attributes according to the gl_config. */
if( for_FBConfig ) {
attribs[i++] = GLX_RENDER_TYPE;
- attribs[i++] = GLX_RGBA_BIT;
+ if (_this->gl_config.floatbuffers) {
+ attribs[i++] = GLX_RGBA_FLOAT_BIT_ARB;
+ } else {
+ attribs[i++] = GLX_RGBA_BIT;
+ }
} else {
attribs[i++] = GLX_RGBA;
}
@@ -560,6 +574,10 @@ X11_GL_GetAttributes(_THIS, Display * display, int screen, int * attribs, int si
attribs[i++] = _this->gl_config.multisamplesamples;
}
+ if (_this->gl_config.floatbuffers) {
+ attribs[i++] = GLX_RGBA_FLOAT_TYPE_ARB;
+ }
+
if (_this->gl_config.framebuffer_srgb_capable) {
attribs[i++] = GLX_FRAMEBUFFER_SRGB_CAPABLE_ARB;
attribs[i++] = True; /* always needed, for_FBConfig or not! */