From 770a2c5ac0c4b863ff9f5b6b76fd888062a57b45 Mon Sep 17 00:00:00 2001 From: slipher Date: Wed, 17 Sep 2025 07:50:42 -0500 Subject: [PATCH 1/6] NUKE unused FBO creation code --- src/engine/renderer/tr_fbo.cpp | 183 +-------------------------------- src/engine/renderer/tr_local.h | 19 ---- 2 files changed, 1 insertion(+), 201 deletions(-) diff --git a/src/engine/renderer/tr_fbo.cpp b/src/engine/renderer/tr_fbo.cpp index f539515431..8f86abc6e3 100644 --- a/src/engine/renderer/tr_fbo.cpp +++ b/src/engine/renderer/tr_fbo.cpp @@ -121,7 +121,6 @@ FBO_t *R_CreateFBO( const char *name, int width, int height ) fbo = tr.fbos[ tr.numFBOs ] = (FBO_t*) ri.Hunk_Alloc( sizeof( *fbo ), ha_pref::h_low ); Q_strncpyz( fbo->name, name, sizeof( fbo->name ) ); - fbo->index = tr.numFBOs++; fbo->width = width; fbo->height = height; @@ -130,157 +129,6 @@ FBO_t *R_CreateFBO( const char *name, int width, int height ) return fbo; } -/* -================ -R_CreateFBOColorBuffer - -Framebuffer must be bound -================ -*/ -void R_CreateFBOColorBuffer( FBO_t *fbo, int format, int index ) -{ - bool absent; - - if ( index < 0 || index >= glConfig.maxColorAttachments ) - { - Log::Warn("R_CreateFBOColorBuffer: invalid attachment index %i", index ); - return; - } - - fbo->colorFormat = format; - - absent = fbo->colorBuffers[ index ] == 0; - - if ( absent ) - { - GL_fboShim.glGenRenderbuffers( 1, &fbo->colorBuffers[ index ] ); - } - - GL_fboShim.glBindRenderbuffer( GL_RENDERBUFFER, fbo->colorBuffers[ index ] ); - GL_fboShim.glRenderbufferStorage( GL_RENDERBUFFER, format, fbo->width, fbo->height ); - - if ( absent ) - { - GL_fboShim.glFramebufferRenderbuffer( GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + index, GL_RENDERBUFFER, - fbo->colorBuffers[ index ] ); - } - - GL_CheckErrors(); -} - -/* -================ -R_CreateFBODepthBuffer -================ -*/ -void R_CreateFBODepthBuffer( FBO_t *fbo, int format ) -{ - bool absent; - - if ( format != GL_DEPTH_COMPONENT && - format != GL_DEPTH_COMPONENT16 && format != GL_DEPTH_COMPONENT24 && format != GL_DEPTH_COMPONENT32_ARB ) - { - Log::Warn("R_CreateFBODepthBuffer: format %i is not depth-renderable", format ); - return; - } - - fbo->depthFormat = format; - - absent = fbo->depthBuffer == 0; - - if ( absent ) - { - GL_fboShim.glGenRenderbuffers( 1, &fbo->depthBuffer ); - } - - GL_fboShim.glBindRenderbuffer( GL_RENDERBUFFER, fbo->depthBuffer ); - GL_fboShim.glRenderbufferStorage( GL_RENDERBUFFER, fbo->depthFormat, fbo->width, fbo->height ); - - if ( absent ) - { - GL_fboShim.glFramebufferRenderbuffer( GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, fbo->depthBuffer ); - } - - GL_CheckErrors(); -} - -/* -================ -R_CreateFBOStencilBuffer -================ -*/ -void R_CreateFBOStencilBuffer( FBO_t *fbo, int format ) -{ - bool absent; - - if ( format != GL_STENCIL_INDEX && - format != GL_STENCIL_INDEX1_EXT && - format != GL_STENCIL_INDEX4_EXT && format != GL_STENCIL_INDEX8_EXT && format != GL_STENCIL_INDEX16_EXT ) - { - Log::Warn("R_CreateFBOStencilBuffer: format %i is not stencil-renderable", format ); - return; - } - - fbo->stencilFormat = format; - - absent = fbo->stencilBuffer == 0; - - if ( absent ) - { - GL_fboShim.glGenRenderbuffers( 1, &fbo->stencilBuffer ); - } - - GL_fboShim.glBindRenderbuffer( GL_RENDERBUFFER, fbo->stencilBuffer ); - GL_fboShim.glRenderbufferStorage( GL_RENDERBUFFER, fbo->stencilFormat, fbo->width, fbo->height ); - GL_CheckErrors(); - - if ( absent ) - { - GL_fboShim.glFramebufferRenderbuffer( GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, fbo->stencilBuffer ); - } - - GL_CheckErrors(); -} - -/* -================ -R_CreateFBOPackedDepthStencilBuffer -================ -*/ -void R_CreateFBOPackedDepthStencilBuffer( FBO_t *fbo, int format ) -{ - bool absent; - - if ( format != GL_DEPTH_STENCIL && format != GL_DEPTH24_STENCIL8 ) - { - Log::Warn("R_CreateFBOPackedDepthStencilBuffer: format %i is not depth-stencil-renderable", format ); - return; - } - - fbo->packedDepthStencilFormat = format; - - absent = fbo->packedDepthStencilBuffer == 0; - - if ( absent ) - { - GL_fboShim.glGenRenderbuffers( 1, &fbo->packedDepthStencilBuffer ); - } - - GL_fboShim.glBindRenderbuffer( GL_RENDERBUFFER, fbo->packedDepthStencilBuffer ); - GL_fboShim.glRenderbufferStorage( GL_RENDERBUFFER, fbo->packedDepthStencilFormat, fbo->width, fbo->height ); - GL_CheckErrors(); - - if ( absent ) - { - GL_fboShim.glFramebufferRenderbuffer( GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, - fbo->packedDepthStencilBuffer ); - GL_fboShim.glFramebufferRenderbuffer( GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, - fbo->packedDepthStencilBuffer ); - } - - GL_CheckErrors(); -} - /* ================= R_AttachFBOTexture1D @@ -335,16 +183,6 @@ void R_AttachFBOTexture3D( int texId, int index, int zOffset ) glFramebufferTexture3D( GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + index, GL_TEXTURE_3D, texId, 0, zOffset ); } -/* -================= -R_AttachFBOTextureDepth -================= -*/ -void R_AttachFBOTextureDepth( int texId ) -{ - GL_fboShim.glFramebufferTexture2D( GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, texId, 0 ); -} - /* ================= R_AttachFBOTexturePackedDepthStencil @@ -499,35 +337,16 @@ R_ShutdownFBOs */ void R_ShutdownFBOs() { - int i, j; FBO_t *fbo; Log::Debug("------- R_ShutdownFBOs -------" ); R_BindNullFBO(); - for ( i = 0; i < tr.numFBOs; i++ ) + for ( int i = 0; i < tr.numFBOs; i++ ) { fbo = tr.fbos[ i ]; - for ( j = 0; j < glConfig.maxColorAttachments; j++ ) - { - if ( fbo->colorBuffers[ j ] ) - { - GL_fboShim.glDeleteRenderbuffers( 1, &fbo->colorBuffers[ j ] ); - } - } - - if ( fbo->depthBuffer ) - { - GL_fboShim.glDeleteRenderbuffers( 1, &fbo->depthBuffer ); - } - - if ( fbo->stencilBuffer ) - { - GL_fboShim.glDeleteRenderbuffers( 1, &fbo->stencilBuffer ); - } - if ( fbo->frameBuffer ) { GL_fboShim.glDeleteFramebuffers( 1, &fbo->frameBuffer ); diff --git a/src/engine/renderer/tr_local.h b/src/engine/renderer/tr_local.h index 827b1ba465..232ba7c225 100644 --- a/src/engine/renderer/tr_local.h +++ b/src/engine/renderer/tr_local.h @@ -563,22 +563,8 @@ enum class ssaoMode { { char name[ MAX_QPATH ]; - int index; - uint32_t frameBuffer; - uint32_t colorBuffers[ 16 ]; - int colorFormat; - - uint32_t depthBuffer; - int depthFormat; - - uint32_t stencilBuffer; - int stencilFormat; - - uint32_t packedDepthStencilBuffer; - int packedDepthStencilFormat; - int width; int height; }; @@ -3287,14 +3273,9 @@ void GLimp_LogComment_( std::string comment ); FBO_t *R_CreateFBO( const char *name, int width, int height ); - void R_CreateFBOColorBuffer( FBO_t *fbo, int format, int index ); - void R_CreateFBODepthBuffer( FBO_t *fbo, int format ); - void R_CreateFBOStencilBuffer( FBO_t *fbo, int format ); - void R_AttachFBOTexture1D( int texId, int attachmentIndex ); void R_AttachFBOTexture2D( int target, int texId, int attachmentIndex ); void R_AttachFBOTexture3D( int texId, int attachmentIndex, int zOffset ); - void R_AttachFBOTextureDepth( int texId ); void R_BindFBO( FBO_t *fbo ); void R_BindNullFBO(); From 5a9dcbb133fdd5b39a5aa27b1675bbb5986245c1 Mon Sep 17 00:00:00 2001 From: slipher Date: Wed, 17 Sep 2025 09:38:32 -0500 Subject: [PATCH 2/6] Remove references to GL renderbuffers We don't use renderbuffers. The renderbuffer size limit does not apply to an FBO. --- src/engine/renderer/tr_fbo.cpp | 5 ++--- src/engine/renderer/tr_init.cpp | 2 -- src/engine/renderer/tr_public.h | 1 - src/engine/sys/sdl_glimp.cpp | 1 - 4 files changed, 2 insertions(+), 7 deletions(-) diff --git a/src/engine/renderer/tr_fbo.cpp b/src/engine/renderer/tr_fbo.cpp index 8f86abc6e3..435c93a7fa 100644 --- a/src/engine/renderer/tr_fbo.cpp +++ b/src/engine/renderer/tr_fbo.cpp @@ -104,12 +104,12 @@ FBO_t *R_CreateFBO( const char *name, int width, int height ) Sys::Drop( "R_CreateFBO: \"%s\" is too long", name ); } - if ( width <= 0 || width > glConfig.maxRenderbufferSize ) + if ( width <= 0 ) { Sys::Drop( "R_CreateFBO: bad width %i", width ); } - if ( height <= 0 || height > glConfig.maxRenderbufferSize ) + if ( height <= 0 ) { Sys::Drop( "R_CreateFBO: bad height %i", height ); } @@ -229,7 +229,6 @@ void R_BindNullFBO() if ( glState.currentFBO ) { GL_fboShim.glBindFramebuffer( GL_FRAMEBUFFER, 0 ); - GL_fboShim.glBindRenderbuffer( GL_RENDERBUFFER, 0 ); glState.currentFBO = nullptr; } } diff --git a/src/engine/renderer/tr_init.cpp b/src/engine/renderer/tr_init.cpp index f13ad4324e..20dac3f8e9 100644 --- a/src/engine/renderer/tr_init.cpp +++ b/src/engine/renderer/tr_init.cpp @@ -868,7 +868,6 @@ ScreenshotCmd screenshotPNGRegistration("screenshotPNG", ssFormat_t::SSF_PNG, "p */ GL_fboShim.glBindFramebuffer( GL_FRAMEBUFFER, 0 ); - GL_fboShim.glBindRenderbuffer( GL_RENDERBUFFER, 0 ); glState.currentFBO = nullptr; GL_PolygonMode( GL_FRONT_AND_BACK, GL_FILL ); @@ -949,7 +948,6 @@ ScreenshotCmd screenshotPNGRegistration("screenshotPNG", ssFormat_t::SSF_PNG, "p Log::Notice("GL_TEXTURE_MAX_ANISOTROPY_EXT: %f", glConfig.maxTextureAnisotropy ); } - Log::Notice("GL_MAX_RENDERBUFFER_SIZE: %d", glConfig.maxRenderbufferSize ); Log::Notice("GL_MAX_COLOR_ATTACHMENTS: %d", glConfig.maxColorAttachments ); Log::Notice("PIXELFORMAT: color(%d-bits)", glConfig.colorBits ); diff --git a/src/engine/renderer/tr_public.h b/src/engine/renderer/tr_public.h index a258046f46..92a144e1d4 100644 --- a/src/engine/renderer/tr_public.h +++ b/src/engine/renderer/tr_public.h @@ -144,7 +144,6 @@ struct GLConfig float textureAnisotropy; bool textureAnisotropyAvailable; - int maxRenderbufferSize; int maxColorAttachments; bool getProgramBinaryAvailable; diff --git a/src/engine/sys/sdl_glimp.cpp b/src/engine/sys/sdl_glimp.cpp index 806bb696b8..e4fc7dc59b 100644 --- a/src/engine/sys/sdl_glimp.cpp +++ b/src/engine/sys/sdl_glimp.cpp @@ -2338,7 +2338,6 @@ static void GLimp_InitExtensions() glFboSetExt(); } - glGetIntegerv( GL_MAX_RENDERBUFFER_SIZE, &glConfig.maxRenderbufferSize ); glGetIntegerv( GL_MAX_COLOR_ATTACHMENTS, &glConfig.maxColorAttachments ); // made required in OpenGL 2.0 From b7ec7eda51e47985550e54739197bda26d9f3176 Mon Sep 17 00:00:00 2001 From: slipher Date: Wed, 17 Sep 2025 10:48:32 -0500 Subject: [PATCH 3/6] Substitute GL_FRAMEBUFFER -> GL_DRAW_FRAMEBUFFER Replace GL_FRAMEBUFFER with GL_DRAW_FRAMEBUFFER everywhere. Binding GL_FRAMEBUFFER to x is defined as binding GL_DRAW_FRAMEBUFFER to x then binding GL_READ_FRAMEBUFFER to x. Currently we only use the DRAW aspect. The double binding can be a nuisance when adding functionality (blit) that needs the read aspect. --- src/engine/renderer/tr_fbo.cpp | 22 +++++++++++----------- src/engine/renderer/tr_init.cpp | 2 +- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/engine/renderer/tr_fbo.cpp b/src/engine/renderer/tr_fbo.cpp index 435c93a7fa..b1d2512c1a 100644 --- a/src/engine/renderer/tr_fbo.cpp +++ b/src/engine/renderer/tr_fbo.cpp @@ -35,13 +35,13 @@ bool R_CheckFBO( const FBO_t *fbo ) int id; glGetIntegerv( GL_FRAMEBUFFER_BINDING, &id ); - GL_fboShim.glBindFramebuffer( GL_FRAMEBUFFER, fbo->frameBuffer ); + GL_fboShim.glBindFramebuffer( GL_DRAW_FRAMEBUFFER, fbo->frameBuffer ); - code = GL_fboShim.glCheckFramebufferStatus( GL_FRAMEBUFFER ); + code = GL_fboShim.glCheckFramebufferStatus( GL_DRAW_FRAMEBUFFER ); if ( code == GL_FRAMEBUFFER_COMPLETE ) { - GL_fboShim.glBindFramebuffer( GL_FRAMEBUFFER, id ); + GL_fboShim.glBindFramebuffer( GL_DRAW_FRAMEBUFFER, id ); return true; } @@ -85,7 +85,7 @@ bool R_CheckFBO( const FBO_t *fbo ) break; } - GL_fboShim.glBindFramebuffer( GL_FRAMEBUFFER, id ); + GL_fboShim.glBindFramebuffer( GL_DRAW_FRAMEBUFFER, id ); return false; } @@ -142,7 +142,7 @@ void R_AttachFBOTexture1D( int texId, int index ) return; } - glFramebufferTexture1D( GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + index, GL_TEXTURE_1D, texId, 0 ); + glFramebufferTexture1D( GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + index, GL_TEXTURE_1D, texId, 0 ); } /* @@ -164,7 +164,7 @@ void R_AttachFBOTexture2D( int target, int texId, int index ) return; } - GL_fboShim.glFramebufferTexture2D( GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + index, target, texId, 0 ); + GL_fboShim.glFramebufferTexture2D( GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + index, target, texId, 0 ); } /* @@ -180,7 +180,7 @@ void R_AttachFBOTexture3D( int texId, int index, int zOffset ) return; } - glFramebufferTexture3D( GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + index, GL_TEXTURE_3D, texId, 0, zOffset ); + glFramebufferTexture3D( GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + index, GL_TEXTURE_3D, texId, 0, zOffset ); } /* @@ -190,8 +190,8 @@ R_AttachFBOTexturePackedDepthStencil */ void R_AttachFBOTexturePackedDepthStencil( int texId ) { - GL_fboShim.glFramebufferTexture2D( GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, texId, 0 ); - GL_fboShim.glFramebufferTexture2D( GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_TEXTURE_2D, texId, 0 ); + GL_fboShim.glFramebufferTexture2D( GL_DRAW_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, texId, 0 ); + GL_fboShim.glFramebufferTexture2D( GL_DRAW_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_TEXTURE_2D, texId, 0 ); } /* @@ -211,7 +211,7 @@ void R_BindFBO( FBO_t *fbo ) if ( glState.currentFBO != fbo ) { - GL_fboShim.glBindFramebuffer( GL_FRAMEBUFFER, fbo->frameBuffer ); + GL_fboShim.glBindFramebuffer( GL_DRAW_FRAMEBUFFER, fbo->frameBuffer ); glState.currentFBO = fbo; } @@ -228,7 +228,7 @@ void R_BindNullFBO() if ( glState.currentFBO ) { - GL_fboShim.glBindFramebuffer( GL_FRAMEBUFFER, 0 ); + GL_fboShim.glBindFramebuffer( GL_DRAW_FRAMEBUFFER, 0 ); glState.currentFBO = nullptr; } } diff --git a/src/engine/renderer/tr_init.cpp b/src/engine/renderer/tr_init.cpp index 20dac3f8e9..4b828b17a2 100644 --- a/src/engine/renderer/tr_init.cpp +++ b/src/engine/renderer/tr_init.cpp @@ -867,7 +867,7 @@ ScreenshotCmd screenshotPNGRegistration("screenshotPNG", ssFormat_t::SSF_PNG, "p bound. */ - GL_fboShim.glBindFramebuffer( GL_FRAMEBUFFER, 0 ); + GL_fboShim.glBindFramebuffer( GL_DRAW_FRAMEBUFFER, 0 ); glState.currentFBO = nullptr; GL_PolygonMode( GL_FRONT_AND_BACK, GL_FILL ); From 5baeaab43e8acc1af6072e0facd31717cb535231 Mon Sep 17 00:00:00 2001 From: slipher Date: Wed, 17 Sep 2025 11:23:29 -0500 Subject: [PATCH 4/6] Optional target parameter for R_BindFBO Co-Authored-By: VReaperV --- src/engine/renderer/tr_fbo.cpp | 28 ++++++++++++---------------- src/engine/renderer/tr_local.h | 1 + 2 files changed, 13 insertions(+), 16 deletions(-) diff --git a/src/engine/renderer/tr_fbo.cpp b/src/engine/renderer/tr_fbo.cpp index b1d2512c1a..3f12ce8a46 100644 --- a/src/engine/renderer/tr_fbo.cpp +++ b/src/engine/renderer/tr_fbo.cpp @@ -201,18 +201,20 @@ R_BindFBO */ void R_BindFBO( FBO_t *fbo ) { - if ( !fbo ) - { - R_BindNullFBO(); - return; - } + R_BindFBO( GL_DRAW_FRAMEBUFFER, fbo ); +} - GLIMP_LOGCOMMENT( "--- R_BindFBO( %s ) ---", fbo->name ); +void R_BindFBO( GLenum target, FBO_t *fbo ) +{ + GLuint handle = fbo == nullptr ? 0 : fbo->frameBuffer; - if ( glState.currentFBO != fbo ) + if ( target != GL_DRAW_FRAMEBUFFER ) { - GL_fboShim.glBindFramebuffer( GL_DRAW_FRAMEBUFFER, fbo->frameBuffer ); - + GL_fboShim.glBindFramebuffer( target, handle ); + } + else if ( glState.currentFBO != fbo ) + { + GL_fboShim.glBindFramebuffer( target, handle ); glState.currentFBO = fbo; } } @@ -224,13 +226,7 @@ R_BindNullFBO */ void R_BindNullFBO() { - GLIMP_LOGCOMMENT( "--- R_BindNullFBO ---" ); - - if ( glState.currentFBO ) - { - GL_fboShim.glBindFramebuffer( GL_DRAW_FRAMEBUFFER, 0 ); - glState.currentFBO = nullptr; - } + R_BindFBO( nullptr ); } /* diff --git a/src/engine/renderer/tr_local.h b/src/engine/renderer/tr_local.h index 232ba7c225..ccc6dcfbe8 100644 --- a/src/engine/renderer/tr_local.h +++ b/src/engine/renderer/tr_local.h @@ -3278,6 +3278,7 @@ void GLimp_LogComment_( std::string comment ); void R_AttachFBOTexture3D( int texId, int attachmentIndex, int zOffset ); void R_BindFBO( FBO_t *fbo ); + void R_BindFBO( GLenum target, FBO_t *fbo ); void R_BindNullFBO(); void R_InitFBOs(); From 2da6e92739162dcfdea6412f2a58287218c5b79d Mon Sep 17 00:00:00 2001 From: slipher Date: Wed, 17 Sep 2025 11:43:17 -0500 Subject: [PATCH 5/6] Add BlitFramebuffer function to GL_fboShim Strangely, we didn't use any functions from EXT_framebuffer_blit before this, despite it being a required extension (if ARB_framebuffer_blit is unavailable) and a comment saying "our code is known to require EXT_framebuffer_blit". --- src/engine/renderer/tr_local.h | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/engine/renderer/tr_local.h b/src/engine/renderer/tr_local.h index ccc6dcfbe8..20501595cc 100644 --- a/src/engine/renderer/tr_local.h +++ b/src/engine/renderer/tr_local.h @@ -233,6 +233,8 @@ struct glFboShim_t PFNGLGENRENDERBUFFERSPROC glGenRenderbuffers; // void (*glRenderbufferStorage) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); PFNGLRENDERBUFFERSTORAGEPROC glRenderbufferStorage; + // void (*glBlitFramebuffer) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); + PFNGLBLITFRAMEBUFFERPROC glBlitFramebuffer; /* Unused for now, part of GL_EXT_framebuffer_multisample: // void (*glRenderbufferStorageMultisample) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); @@ -266,6 +268,7 @@ static inline void glFboSetArb() GL_fboShim.glGenFramebuffers = glGenFramebuffers; GL_fboShim.glGenRenderbuffers = glGenRenderbuffers; GL_fboShim.glRenderbufferStorage = glRenderbufferStorage; + GL_fboShim.glBlitFramebuffer = glBlitFramebuffer; /* Unused for now, part of GL_EXT_framebuffer_multisample: GL_fboShim.glRenderbufferStorageMultisample = glRenderbufferStorageMultisample; */ @@ -273,6 +276,7 @@ static inline void glFboSetArb() static inline void glFboSetExt() { + // EXT_framebuffer_object GL_fboShim.glBindFramebuffer = glBindFramebufferEXT; GL_fboShim.glBindRenderbuffer = glBindRenderbufferEXT; GL_fboShim.glCheckFramebufferStatus = glCheckFramebufferStatusEXT; @@ -285,6 +289,9 @@ static inline void glFboSetExt() GL_fboShim.glGenRenderbuffers = glGenRenderbuffersEXT; GL_fboShim.glRenderbufferStorage = glRenderbufferStorageEXT; + // EXT_framebuffer_blit + GL_fboShim.glBlitFramebuffer = glBlitFramebufferEXT; + /* Unused for now, part of GL_EXT_framebuffer_multisample: GL_fboShim.glRenderbufferStorageMultisample = glRenderbufferStorageMultisampleEXT; */ } From ffc6f250f2c1c46e2002d22cc1c8a83ec1dd6256 Mon Sep 17 00:00:00 2001 From: slipher Date: Wed, 17 Sep 2025 11:59:29 -0500 Subject: [PATCH 6/6] Fix missing 'FBO shim' for glFramebufferTexture3D Provide the alternative function to use if GL_ARB_framebuffer_object is not available but GL_EXT_framebuffer_object is. The missing shim could result in a crash if the former extension is not available and dynamic lights are enabled. --- src/engine/renderer/tr_fbo.cpp | 4 ++-- src/engine/renderer/tr_local.h | 8 ++++++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/engine/renderer/tr_fbo.cpp b/src/engine/renderer/tr_fbo.cpp index 3f12ce8a46..d382c63b7f 100644 --- a/src/engine/renderer/tr_fbo.cpp +++ b/src/engine/renderer/tr_fbo.cpp @@ -142,7 +142,7 @@ void R_AttachFBOTexture1D( int texId, int index ) return; } - glFramebufferTexture1D( GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + index, GL_TEXTURE_1D, texId, 0 ); + GL_fboShim.glFramebufferTexture1D( GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + index, GL_TEXTURE_1D, texId, 0 ); } /* @@ -180,7 +180,7 @@ void R_AttachFBOTexture3D( int texId, int index, int zOffset ) return; } - glFramebufferTexture3D( GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + index, GL_TEXTURE_3D, texId, 0, zOffset ); + GL_fboShim.glFramebufferTexture3D( GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + index, GL_TEXTURE_3D, texId, 0, zOffset ); } /* diff --git a/src/engine/renderer/tr_local.h b/src/engine/renderer/tr_local.h index 20501595cc..f8cf1f1347 100644 --- a/src/engine/renderer/tr_local.h +++ b/src/engine/renderer/tr_local.h @@ -223,8 +223,12 @@ struct glFboShim_t PFNGLDELETERENDERBUFFERSPROC glDeleteRenderbuffers; // void (*glFramebufferRenderbuffer) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); PFNGLFRAMEBUFFERRENDERBUFFERPROC glFramebufferRenderbuffer; + // void (*glFramebufferTexture1D) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); + PFNGLFRAMEBUFFERTEXTURE1DPROC glFramebufferTexture1D; // void (*glFramebufferTexture2D) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); PFNGLFRAMEBUFFERTEXTURE2DPROC glFramebufferTexture2D; + // void (*glFramebufferTexture3D) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); + PFNGLFRAMEBUFFERTEXTURE3DPROC glFramebufferTexture3D; // void (*glGenerateMipmap) (GLenum target); PFNGLGENERATEMIPMAPPROC glGenerateMipmap; // void (*glGenFramebuffers) (GLsizei n, GLuint *framebuffers); @@ -263,7 +267,9 @@ static inline void glFboSetArb() GL_fboShim.glDeleteFramebuffers = glDeleteFramebuffers; GL_fboShim.glDeleteRenderbuffers = glDeleteRenderbuffers; GL_fboShim.glFramebufferRenderbuffer = glFramebufferRenderbuffer; + GL_fboShim.glFramebufferTexture1D = glFramebufferTexture1D; GL_fboShim.glFramebufferTexture2D = glFramebufferTexture2D; + GL_fboShim.glFramebufferTexture3D = glFramebufferTexture3D; GL_fboShim.glGenerateMipmap = glGenerateMipmap; GL_fboShim.glGenFramebuffers = glGenFramebuffers; GL_fboShim.glGenRenderbuffers = glGenRenderbuffers; @@ -283,7 +289,9 @@ static inline void glFboSetExt() GL_fboShim.glDeleteFramebuffers = glDeleteFramebuffersEXT; GL_fboShim.glDeleteRenderbuffers = glDeleteRenderbuffersEXT; GL_fboShim.glFramebufferRenderbuffer = glFramebufferRenderbufferEXT; + GL_fboShim.glFramebufferTexture1D = glFramebufferTexture1DEXT; GL_fboShim.glFramebufferTexture2D = glFramebufferTexture2DEXT; + GL_fboShim.glFramebufferTexture3D = glFramebufferTexture3DEXT; GL_fboShim.glGenerateMipmap = glGenerateMipmapEXT; GL_fboShim.glGenFramebuffers = glGenFramebuffersEXT; GL_fboShim.glGenRenderbuffers = glGenRenderbuffersEXT;