From e4000c028493ba151ead1b91e3b90eaddbeae7dc Mon Sep 17 00:00:00 2001
From: "Ryan C. Gordon" <[EMAIL REDACTED]>
Date: Fri, 31 Dec 2021 10:30:51 -0500
Subject: [PATCH] video: SDL_GL_GetAttribute needs to operate on FBO 0.
If a different FBO is bound, this would return incorrect results.
Fixes #5082.
---
src/video/SDL_video.c | 15 ++++++++++++++-
1 file changed, 14 insertions(+), 1 deletion(-)
diff --git a/src/video/SDL_video.c b/src/video/SDL_video.c
index ff55308b906..c2b4aed5116 100644
--- a/src/video/SDL_video.c
+++ b/src/video/SDL_video.c
@@ -3842,10 +3842,23 @@ SDL_GL_GetAttribute(SDL_GLattr attr, int *value)
}
if (attachmentattrib && isAtLeastGL3((const char *) glGetStringFunc(GL_VERSION))) {
- glGetFramebufferAttachmentParameterivFunc = SDL_GL_GetProcAddress("glGetFramebufferAttachmentParameteriv");
+ /* glGetFramebufferAttachmentParameteriv needs to operate on the window framebuffer for this, so bind FBO 0 if necessary. */
+ GLint current_fbo = 0;
+ void (APIENTRY *glGetIntegervFunc) (GLenum pname, GLint * params) = SDL_GL_GetProcAddress("glGetIntegerv");
+ void (APIENTRY *glBindFramebufferFunc) (GLenum target, GLuint fbo) = SDL_GL_GetProcAddress("glBindFramebuffer");
+ if (glGetIntegervFunc && glBindFramebufferFunc) {
+ glGetIntegervFunc(GL_DRAW_FRAMEBUFFER_BINDING, ¤t_fbo);
+ }
+ glGetFramebufferAttachmentParameterivFunc = SDL_GL_GetProcAddress("glGetFramebufferAttachmentParameteriv");
if (glGetFramebufferAttachmentParameterivFunc) {
+ if (glBindFramebufferFunc && (current_fbo != 0)) {
+ glBindFramebufferFunc(GL_DRAW_FRAMEBUFFER, 0);
+ }
glGetFramebufferAttachmentParameterivFunc(GL_FRAMEBUFFER, attachment, attachmentattrib, (GLint *) value);
+ if (glBindFramebufferFunc && (current_fbo != 0)) {
+ glBindFramebufferFunc(GL_DRAW_FRAMEBUFFER, current_fbo);
+ }
} else {
return -1;
}