From e4000c028493ba151ead1b91e3b90eaddbeae7dc Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" 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 ff55308b90..c2b4aed511 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; }