Compare commits

...
5 Commits
Author SHA1 Message Date
Alug a8df763823 fix bad copy paste 2025-09-26 17:20:41 +02:00
Alug 58af8f84b9 squash cherry all changes to here 2025-09-22 22:50:55 +02:00
Alug b0395ad539 Revert "get rid of the automatic "downsample" detection stufff"
This reverts commit b712cba62d.
2025-09-22 22:48:55 +02:00
Alug b712cba62d get rid of the automatic "downsample" detection stufff
massive declutter
2025-09-21 14:56:44 +02:00
Alug 16c0b48f4a add backwards compat support for ogl 2.1 fbo extensions
this should allow older gpus to use the feature aswell, not super clean but seems to work
TODO: refactor this whole crap, switch to seperate read and draw to use blitting and make this multisampling compatible so we can get rid of the messy "downsample" code and have this active by default
2025-09-21 05:12:47 +02:00
3 changed files with 363 additions and 136 deletions

No files matched your search

+361 -107
View File
@@ -128,12 +128,27 @@ GLfloat projMatrix[16];
static GLint viewport[4];
#ifdef USE_FBO_OGL
GLuint FramebufferObject, FramebufferTexture, RenderbufferObject;
boolean supportFBO = false;
enum
{
FBO_NONE,
FBO_ARB,
FBO_EXT,
FBO_EXT_STENCIL // supports stencil attachment
};
int supportFBO = FBO_NONE;
static boolean fboinit = false;
static void GL_Framebuffer_DeleteAttachments(void);
static int FBO_FRAMEBUFFER = GL_FRAMEBUFFER;
static int FBO_COLOR_ATTACHMENT = GL_COLOR_ATTACHMENT0;
static int FBO_DEPTH_ATTACHMENT = GL_DEPTH_STENCIL_ATTACHMENT;
static int FBO_DEPTH_STENCIL = GL_DEPTH24_STENCIL8;
static int FBO_RENDERBUFFER = GL_RENDERBUFFER;
static int FBO_COMPLETE = GL_FRAMEBUFFER_COMPLETE;
#endif
// Sryder: NextTexAvail is broken for these because palette changes or changes to the texture filter or antialiasing
@@ -328,6 +343,10 @@ static void GL_MSG_Error(const char *format, ...)
#define pglCopyTexImage2D glCopyTexImage2D
#define pglCopyTexSubImage2D glCopyTexSubImage2D
#ifdef GLDEBUGMESSAGE
#define pglDebugMessageCallback glDebugMessageCallback
#endif
#else //!STATIC_OPENGL
/* 1.0 functions */
@@ -449,7 +468,7 @@ typedef void (APIENTRY * PFNglCopyTexSubImage2D) (GLenum target, GLint level, GL
static PFNglCopyTexSubImage2D pglCopyTexSubImage2D;
#ifdef USE_FBO_OGL
/* 3.0 functions for framebuffers and renderbuffers */
/* core functions for framebuffers and renderbuffers */
typedef void (APIENTRY * PFNglGenFramebuffers) (GLsizei n, GLuint *ids);
static PFNglGenFramebuffers pglGenFramebuffers;
typedef void (APIENTRY * PFNglBindFramebuffer) (GLenum target, GLuint framebuffer);
@@ -468,10 +487,58 @@ typedef void (APIENTRY * PFNglDeleteRenderbuffers) (GLsizei n, GLuint *renderbuf
static PFNglDeleteRenderbuffers pglDeleteRenderbuffers;
typedef void (APIENTRY * PFNglRenderbufferStorage) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
static PFNglRenderbufferStorage pglRenderbufferStorage;
typedef void (APIENTRY * PFNglRenderbufferStorageMultisample) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
static PFNglRenderbufferStorageMultisample pglRenderbufferStorageMultisample;
typedef void (APIENTRY * PFNglBlitFramebuffer) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
static PFNglBlitFramebuffer pglBlitFramebuffer;
typedef void (APIENTRY * PFNglTexImage2DMultisample) ( GLenum target,
GLsizei samples,
GLenum internalformat,
GLsizei width,
GLsizei height,
GLboolean fixedsamplelocations);
static PFNglTexImage2DMultisample pglTexImage2DMultisample;
typedef void (APIENTRY * PFNglDrawBuffer) ( GLenum buf);
static PFNglDrawBuffer pglDrawBuffer;
typedef void (APIENTRY * PFNglReadBuffer) ( GLenum mode);
static PFNglReadBuffer pglReadBuffer;
typedef void (APIENTRY * PFNglFramebufferRenderbuffer) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLenum renderbuffer);
static PFNglFramebufferRenderbuffer pglFramebufferRenderbuffer;
/* 2.1 extension functions for framebuffers and renderbuffers */
typedef void (APIENTRY * PFNglGenFramebuffersEXT) (GLsizei n, GLuint *ids);
static PFNglGenFramebuffersEXT pglGenFramebuffersEXT;
typedef void (APIENTRY * PFNglBindFramebufferEXT) (GLenum target, GLuint framebuffer);
static PFNglBindFramebufferEXT pglBindFramebufferEXT;
typedef void (APIENTRY * PFNglDeleteFramebuffersEXT) (GLsizei n, GLuint *ids);
static PFNglDeleteFramebuffersEXT pglDeleteFramebuffersEXT;
typedef void (APIENTRY * PFNglFramebufferTexture2DEXT) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
static PFNglFramebufferTexture2DEXT pglFramebufferTexture2DEXT;
typedef GLenum (APIENTRY * PFNglCheckFramebufferStatusEXT) (GLenum target);
static PFNglCheckFramebufferStatusEXT pglCheckFramebufferStatusEXT;
typedef void (APIENTRY * PFNglGenRenderbuffersEXT) (GLsizei n, GLuint *renderbuffers);
static PFNglGenRenderbuffersEXT pglGenRenderbuffersEXT;
typedef void (APIENTRY * PFNglBindRenderbufferEXT) (GLenum target, GLuint renderbuffer);
static PFNglBindRenderbufferEXT pglBindRenderbufferEXT;
typedef void (APIENTRY * PFNglDeleteRenderbuffersEXT) (GLsizei n, GLuint *renderbuffers);
static PFNglDeleteRenderbuffersEXT pglDeleteRenderbuffersEXT;
typedef void (APIENTRY * PFNglRenderbufferStorageEXT) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
static PFNglRenderbufferStorageEXT pglRenderbufferStorageEXT;
typedef void (APIENTRY * PFNglFramebufferRenderbufferEXT) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLenum renderbuffer);
static PFNglFramebufferRenderbufferEXT pglFramebufferRenderbufferEXT;
#endif // USE_FBO_OGL
typedef GLenum (APIENTRY * PFNglGetError) ( void);
static PFNglGetError pglGetError;
#endif //!STATIC_OPENGL
/* 1.2 functions for 3D textures */
@@ -506,6 +573,11 @@ static PFNglColorPointer pglColorPointer;
typedef void (APIENTRY * PFNglBlendEquation) (GLenum mode);
static PFNglBlendEquation pglBlendEquation;
#ifdef GLDEBUGMESSAGE
typedef void (APIENTRY * PFNglDebugMessageCallback) (void (APIENTRY *DEBUGPROC)(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *message, const void *userParam), const void *userParam);
static PFNglDebugMessageCallback pglDebugMessageCallback;
#endif
/* 1.2 Parms */
/* GL_CLAMP_TO_EDGE_EXT */
#ifndef GL_CLAMP_TO_EDGE
@@ -732,16 +804,35 @@ static void GL_Shader_SetUniforms(FSurfaceInfo *Surface, GLRGBAFloat *poly, GLRG
static GLRGBAFloat shader_defaultcolor = {1.0f, 1.0f, 1.0f, 1.0f};
#ifdef USE_FBO_OGL
static boolean GLFramebuffer_CheckExt(void)
static int GLFramebuffer_CheckExt(void)
{
//this stuff needs atleast OGL 3.0
if (majorGL < 3)
return false;
// in opengl 3.0 and up fbos are standart and always supported
if (majorGL >= 3)
return FBO_ARB;
// check if all needed gl extensions are available
return (GL_isExtAvailable("GL_ARB_framebuffer_no_attachments", gl_extensions)
&& GL_isExtAvailable("GL_ARB_framebuffer_object", gl_extensions)
&& GL_isExtAvailable("GL_ARB_framebuffer_sRGB", gl_extensions));
// gl versions from 2.1 may still support framebuffer objects
// maybe, just maybe, we support the standart extensions
if (GL_isExtAvailable("GL_ARB_framebuffer_no_attachments", gl_extensions)
&& GL_isExtAvailable("GL_ARB_framebuffer_object", gl_extensions)
&& GL_isExtAvailable("GL_ARB_framebuffer_sRGB", gl_extensions))
return FBO_ARB;
// nope, try the older 2.1 extensions
if (GL_isExtAvailable("GL_EXT_framebuffer_no_attachments", gl_extensions)
&& GL_isExtAvailable("GL_EXT_framebuffer_object", gl_extensions)
&& GL_isExtAvailable("GL_EXT_framebuffer_sRGB", gl_extensions))
{
// perhaps we may even support a stencil attachment
if (GL_isExtAvailable("GL_EXT_packed_depth_stencil", gl_extensions))
return FBO_EXT_STENCIL;
// no stencil support, sad
return FBO_EXT;
}
// no fbo support for you :c
return FBO_NONE;
}
#endif
@@ -798,28 +889,105 @@ void SetupGLFunc4(void)
GetGLfunc(glUniform3fv);
GetGLfunc(glGetUniformLocation);
#ifdef USE_FBO_OGL
if (GLFramebuffer_CheckExt())
{
GetGLfunc(glGenFramebuffers);
GetGLfunc(glBindFramebuffer);
GetGLfunc(glDeleteFramebuffers);
GetGLfunc(glFramebufferTexture2D);
GetGLfunc(glCheckFramebufferStatus);
GetGLfunc(glGenRenderbuffers);
GetGLfunc(glBindRenderbuffer);
GetGLfunc(glDeleteRenderbuffers);
GetGLfunc(glRenderbufferStorage);
GetGLfunc(glFramebufferRenderbuffer);
#ifdef GLDEBUGMESSAGE
GetGLfunc(glDebugMessageCallback);
#endif
// check if ALL functions are availible
if (pglGenFramebuffers && pglBindFramebuffer &&
pglDeleteFramebuffers && pglFramebufferTexture2D &&
pglCheckFramebufferStatus && pglGenRenderbuffers &&
pglBindRenderbuffer && pglDeleteRenderbuffers &&
pglRenderbufferStorage && pglFramebufferRenderbuffer)
supportFBO = true;
#ifdef USE_FBO_OGL
const int fbocheck = GLFramebuffer_CheckExt();
if (fbocheck != FBO_NONE)
{
if (fbocheck == FBO_ARB)
{
GetGLfunc(glGenFramebuffers);
GetGLfunc(glBindFramebuffer);
GetGLfunc(glDeleteFramebuffers);
GetGLfunc(glFramebufferTexture2D);
GetGLfunc(glCheckFramebufferStatus);
GetGLfunc(glGenRenderbuffers);
GetGLfunc(glBindRenderbuffer);
GetGLfunc(glDeleteRenderbuffers);
GetGLfunc(glRenderbufferStorage);
GetGLfunc(glRenderbufferStorageMultisample);
GetGLfunc(glBlitFramebuffer);
GetGLfunc(glFramebufferRenderbuffer);
GetGLfunc(glTexImage2DMultisample);
GetGLfunc(glDrawBuffer);
GetGLfunc(glReadBuffer);
// check if ALL functions are availible
// what a mouthful
if (pglGenFramebuffers && pglBindFramebuffer &&
pglDeleteFramebuffers && pglFramebufferTexture2D &&
pglCheckFramebufferStatus && pglGenRenderbuffers &&
pglBindRenderbuffer && pglDeleteRenderbuffers &&
pglRenderbufferStorage && pglFramebufferRenderbuffer)
supportFBO = fbocheck;
}
else if (fbocheck == FBO_EXT || fbocheck == FBO_EXT_STENCIL) // uh oh only support for EXT prefix fbos...
{
GetGLfunc(glGenFramebuffersEXT);
GetGLfunc(glBindFramebufferEXT);
GetGLfunc(glDeleteFramebuffersEXT);
GetGLfunc(glFramebufferTexture2DEXT);
GetGLfunc(glCheckFramebufferStatusEXT);
GetGLfunc(glGenRenderbuffersEXT);
GetGLfunc(glBindRenderbufferEXT);
GetGLfunc(glDeleteRenderbuffersEXT);
GetGLfunc(glRenderbufferStorageEXT);
GetGLfunc(glFramebufferRenderbufferEXT);
// check if ALL functions are availible
// what a mouthful
if (pglGenFramebuffersEXT && pglBindFramebufferEXT &&
pglDeleteFramebuffersEXT && pglFramebufferTexture2DEXT &&
pglCheckFramebufferStatusEXT && pglGenRenderbuffersEXT &&
pglBindRenderbufferEXT && pglDeleteRenderbuffersEXT &&
pglRenderbufferStorageEXT && pglFramebufferRenderbufferEXT)
{
// remapping galore huehue
// do this so we dont have to dupe half our code
pglGenFramebuffers = pglGenFramebuffersEXT;
pglBindFramebuffer = pglBindFramebufferEXT;
pglDeleteFramebuffers = pglDeleteFramebuffersEXT;
pglFramebufferTexture2D = pglFramebufferTexture2DEXT;
pglCheckFramebufferStatus = pglCheckFramebufferStatusEXT;
pglGenRenderbuffers = pglGenRenderbuffersEXT;
pglBindRenderbuffer = pglBindRenderbufferEXT;
pglDeleteRenderbuffers = pglDeleteRenderbuffersEXT;
pglRenderbufferStorage = pglRenderbufferStorageEXT;
pglFramebufferRenderbuffer = pglFramebufferRenderbufferEXT;
// the enums "technically" should map the same
// but better be safe than sorry
FBO_FRAMEBUFFER = GL_FRAMEBUFFER_EXT;
FBO_COLOR_ATTACHMENT = GL_COLOR_ATTACHMENT0_EXT;
FBO_DEPTH_ATTACHMENT = GL_DEPTH_ATTACHMENT_EXT;
FBO_DEPTH_STENCIL = (supportFBO == FBO_EXT_STENCIL) ? GL_DEPTH_STENCIL_EXT : GL_DEPTH_COMPONENT;
FBO_RENDERBUFFER = GL_RENDERBUFFER_EXT;
FBO_COMPLETE = GL_FRAMEBUFFER_COMPLETE_EXT;
supportFBO = fbocheck;
}
}
}
/*switch (supportFBO)
{
case FBO_ARB:
GL_DBG_Printf("\nFBO: ARB extensions found\n");
break;
case FBO_EXT:
GL_DBG_Printf("\nFBO: EXT extensions found, no stencil\n");
break;
case FBO_EXT_STENCIL:
GL_DBG_Printf("\nFBO: EXT extensions with packed depth-stencil\n");
break;
case FBO_NONE:
GL_DBG_Printf("\nFBO: No framebuffer object support\n");
break;
}*/
#endif
#undef GetGLfunc
}
@@ -1063,6 +1231,53 @@ void GL_SetModelView(GLint w, GLint h)
pglGetFloatv(GL_PROJECTION_MATRIX, projMatrix);
}
#ifdef GLDEBUGMESSAGE
static void APIENTRY DebugMessage(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *message, const void *userParam)
{
const char *debugsource, *debugtype;
switch (source)
{
#define S(s) case GL_DEBUG_SOURCE_##s: debugsource = #s; break
S(API);
S(WINDOW_SYSTEM);
S(SHADER_COMPILER);
S(THIRD_PARTY);
S(APPLICATION);
S(OTHER);
#undef S
default:
debugsource = "unknown";
break;
}
switch (type)
{
#define S(s) case GL_DEBUG_TYPE_##s: debugtype = #s; break
S(ERROR);
S(DEPRECATED_BEHAVIOR);
S(UNDEFINED_BEHAVIOR);
S(PORTABILITY);
S(PERFORMANCE);
S(MARKER);
S(PUSH_GROUP);
S(POP_GROUP);
S(OTHER);
#undef S
default:
debugtype = "unknown";
break;
}
alerttype_t level = severity == GL_DEBUG_SEVERITY_HIGH ? CONS_ERROR
: severity == GL_DEBUG_SEVERITY_MEDIUM ? CONS_WARNING
: CONS_NOTICE;
//CONS_Alert(level, "OpenGL (%s) (%s): %s\n", debugsource, debugtype, message);
printf("OpenGL (%s) (%s): %s\n", debugsource, debugtype, message);
}
#endif
// -----------------+
// SetStates : Set permanent states
// -----------------+
@@ -1099,6 +1314,14 @@ void GL_SetStates(void)
pglLoadIdentity();
pglScalef(1.0f, 1.0f, -1.0f);
pglGetFloatv(GL_MODELVIEW_MATRIX, modelMatrix); // added for new coronas' code (without depth buffer)
pglEnable(GL_MULTISAMPLE);
#ifdef GLDEBUGMESSAGE
pglEnable(GL_DEBUG_OUTPUT);
pglEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
pglDebugMessageCallback(&DebugMessage, NULL);
#endif
}
// -----------------+
@@ -1137,48 +1360,80 @@ void GL_DeleteTexture(GLMipmap_t *pTexInfo)
pTexInfo->downloaded = 0;
}
#ifdef USE_FBO_OGL
static void GL_Framebuffer_GenerateAttachments(void)
enum
{
if (!supportFBO || !UseScreenFBO())
FBO_RESOLV,
FBO_MSAA,
};
enum
{
RBO_COLOR,
RBO_DEPTH,
};
typedef struct
{
GLuint fbobject;
GLuint rbo[2];
} glfbo_t;
static glfbo_t FBO[2] = {};
static bool fboInit = false;
static void GL_Framebuffer_Generate(void)
{
if (!supportFBO || fboInit)
return;
// Bind the framebuffer
pglBindFramebuffer(GL_FRAMEBUFFER, FramebufferObject);
if (!FBO[FBO_MSAA].fbobject)
pglGenFramebuffers(1, &FBO[FBO_MSAA].fbobject);
// Generate the framebuffer texture
if (!FramebufferTexture)
pglBindFramebuffer(GL_FRAMEBUFFER, FBO[FBO_MSAA].fbobject);
if (!FBO[FBO_MSAA].rbo[RBO_COLOR])
{
pglGenTextures(1, &FramebufferTexture);
pglBindTexture(GL_TEXTURE_2D, FramebufferTexture);
pglTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, screen_width, screen_height, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
pglBindTexture(GL_TEXTURE_2D, 0);
// Attach the framebuffer texture to the framebuffer
pglFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, FramebufferTexture, 0);
pglGenRenderbuffers(1, &FBO[FBO_MSAA].rbo[RBO_COLOR]);
pglBindRenderbuffer(GL_RENDERBUFFER, FBO[FBO_MSAA].rbo[RBO_COLOR]);
pglRenderbufferStorageMultisample(GL_RENDERBUFFER, 4, GL_RGBA8, screen_width, screen_height);
pglFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, FBO[FBO_MSAA].rbo[RBO_COLOR]);
}
// Generate the renderbuffer
if (!RenderbufferObject)
if (!FBO[FBO_MSAA].rbo[RBO_DEPTH])
{
pglGenRenderbuffers(1, &RenderbufferObject);
pglGenRenderbuffers(1, &FBO[FBO_MSAA].rbo[RBO_DEPTH]);
pglBindRenderbuffer(GL_RENDERBUFFER, FBO[FBO_MSAA].rbo[RBO_DEPTH]);
pglRenderbufferStorageMultisample(GL_RENDERBUFFER, 4, GL_DEPTH24_STENCIL8, screen_width, screen_height);
pglFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, FBO[FBO_MSAA].rbo[RBO_DEPTH]);
}
pglBindRenderbuffer(GL_RENDERBUFFER, RenderbufferObject);
if (!FBO[FBO_RESOLV].fbobject)
pglGenFramebuffers(1, &FBO[FBO_RESOLV].fbobject);
pglBindFramebuffer(GL_FRAMEBUFFER, FBO[FBO_RESOLV].fbobject);
if (!FBO[FBO_RESOLV].rbo[RBO_COLOR])
{
pglGenRenderbuffers(1, &FBO[FBO_RESOLV].rbo[RBO_COLOR]);
pglBindRenderbuffer(GL_RENDERBUFFER, FBO[FBO_RESOLV].rbo[RBO_COLOR]);
pglRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, screen_width, screen_height);
pglFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, FBO[FBO_RESOLV].rbo[RBO_COLOR]);
}
if (!FBO[FBO_RESOLV].rbo[RBO_DEPTH])
{
pglGenRenderbuffers(1, &FBO[FBO_RESOLV].rbo[RBO_DEPTH]);
pglBindRenderbuffer(GL_RENDERBUFFER, FBO[FBO_RESOLV].rbo[RBO_DEPTH]);
pglRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, screen_width, screen_height);
pglFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, RenderbufferObject);
// Clear the renderbuffer
GL_ClearBuffer(true, true, true, NULL);
pglBindRenderbuffer(GL_RENDERBUFFER, 0);
pglFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, FBO[FBO_RESOLV].rbo[RBO_DEPTH]);
}
// Unbind the framebuffer
// unbind
pglBindFramebuffer(GL_FRAMEBUFFER, 0);
pglBindRenderbuffer(GL_RENDERBUFFER, 0);
fboinit = true;
fboInit = true;
}
static void GL_Framebuffer_DeleteAttachments(void)
@@ -1186,47 +1441,51 @@ static void GL_Framebuffer_DeleteAttachments(void)
if (!supportFBO || !fboinit)
return;
if (!FramebufferObject && !RenderbufferObject && !FramebufferTexture)
return;
if (FBO[FBO_MSAA].rbo[RBO_COLOR])
{
pglDeleteRenderbuffers(1, &FBO[FBO_MSAA].rbo[RBO_COLOR]);
FBO[FBO_MSAA].rbo[RBO_COLOR] = 0;
}
// Unbind the framebuffer
pglBindFramebuffer(GL_FRAMEBUFFER, 0);
pglBindRenderbuffer(GL_RENDERBUFFER, 0);
if (FBO[FBO_MSAA].rbo[RBO_DEPTH])
{
pglDeleteRenderbuffers(1, &FBO[FBO_MSAA].rbo[RBO_DEPTH]);
FBO[FBO_MSAA].rbo[RBO_DEPTH] = 0;
}
if (FramebufferTexture)
pglDeleteTextures(1, &FramebufferTexture);
if (FBO[FBO_RESOLV].rbo[RBO_COLOR])
{
pglDeleteRenderbuffers(1, &FBO[FBO_RESOLV].rbo[RBO_COLOR]);
FBO[FBO_RESOLV].rbo[RBO_COLOR] = 0;
}
if (RenderbufferObject)
pglDeleteRenderbuffers(1, &RenderbufferObject);
if (FBO[FBO_RESOLV].rbo[RBO_DEPTH])
{
pglDeleteRenderbuffers(1, &FBO[FBO_RESOLV].rbo[RBO_DEPTH]);
FBO[FBO_RESOLV].rbo[RBO_DEPTH] = 0;
}
FramebufferTexture = 0;
RenderbufferObject = 0;
fboinit = false;
}
static void GL_Framebuffer_Generate(void)
{
if (!supportFBO || !UseScreenFBO())
return;
// Generate the framebuffer
if (!FramebufferObject)
pglGenFramebuffers(1, &FramebufferObject);
if (pglCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE)
GL_Framebuffer_GenerateAttachments();
fboInit = false;
}
static void GL_Framebuffer_Delete(void)
{
if (!supportFBO || !fboinit)
if (!supportFBO)
return;
if (FramebufferObject)
pglDeleteFramebuffers(1, &FramebufferObject);
GL_Framebuffer_DeleteAttachments();
FramebufferObject = 0;
if (FBO[FBO_MSAA].fbobject)
{
pglDeleteFramebuffers(1, &FBO[FBO_MSAA].fbobject);
FBO[FBO_MSAA].fbobject = 0;
}
if (FBO[FBO_RESOLV].fbobject)
{
pglDeleteFramebuffers(1, &FBO[FBO_RESOLV].fbobject);
FBO[FBO_RESOLV].fbobject = 0;
}
}
void GL_Framebuffer_Unbind(void)
@@ -1234,41 +1493,36 @@ void GL_Framebuffer_Unbind(void)
if (!supportFBO || !fboinit)
return;
if (!FramebufferObject && !RenderbufferObject)
return;
pglBindFramebuffer(GL_READ_FRAMEBUFFER, FBO[FBO_MSAA].fbobject);
pglBindFramebuffer(GL_DRAW_FRAMEBUFFER, FBO[FBO_RESOLV].fbobject);
pglBlitFramebuffer(0, 0, screen_width, screen_height,
0, 0, screen_width, screen_height,
GL_COLOR_BUFFER_BIT,
GL_NEAREST);
// back to default framebuffer
pglBindFramebuffer(GL_FRAMEBUFFER, 0);
pglBindRenderbuffer(GL_RENDERBUFFER, 0);
}
void GL_Framebuffer_Enable(void)
{
if (!supportFBO || !UseScreenFBO())
if (!supportFBO)
return;
if (FramebufferObject == 0)
GL_Framebuffer_Generate();
else if (!FramebufferTexture || !RenderbufferObject)
GL_Framebuffer_GenerateAttachments();
pglBindFramebuffer(GL_FRAMEBUFFER, FramebufferObject);
pglBindRenderbuffer(GL_RENDERBUFFER, RenderbufferObject);
GL_Framebuffer_Generate();
pglBindFramebuffer(GL_FRAMEBUFFER, FBO[FBO_MSAA].fbobject);
}
void GL_Framebuffer_Disable(void)
{
if (!supportFBO || !fboinit)
return;
if (!FramebufferObject && !RenderbufferObject)
if (!supportFBO)
return;
pglBindFramebuffer(GL_FRAMEBUFFER, 0);
pglBindRenderbuffer(GL_RENDERBUFFER, 0);
GL_Framebuffer_Delete();
}
#endif
// -----------------+
// Flush : flush OpenGL textures
+1 -2
View File
@@ -111,9 +111,8 @@ void GL_Framebuffer_Unbind(void);
void GL_Framebuffer_Enable(void);
void GL_Framebuffer_Disable(void);
extern GLuint FramebufferObject, FramebufferTexture, RenderbufferObject;
extern GLboolean FrameBufferEnabled, RenderToFramebuffer;
extern boolean supportFBO;
extern int supportFBO;
#endif
// ==========================================================================
+1 -27
View File
@@ -71,18 +71,9 @@ PFNglGetString pglGetString;
#endif
#ifdef USE_FBO_OGL
#if defined (__unix__)
static boolean xwaylandcrap = false;
#endif
boolean UseScreenFBO(void)
{
return ((supportFBO && cv_glframebuffer.value && downsample)
#if defined (__unix__)
|| (supportFBO && xwaylandcrap)
#endif
);
return (supportFBO && cv_glframebuffer.value);
}
#endif
@@ -207,16 +198,6 @@ boolean OglSdlSurface(INT32 w, INT32 h)
maximumAnisotropy = 1;
glanisotropicmode_cons_t[1].value = maximumAnisotropy;
#if defined (__unix__)
#ifdef USE_FBO_OGL
char videodriver[4] = {'S','D','L',0};
if (supportFBO && strstr((const char*)gl_renderer, "NVIDIA")
&& (*strncpy(videodriver, SDL_GetCurrentVideoDriver(), sizeof(videodriver)-1) != '\0')
&& (strncasecmp("x11",videodriver,4) == 0))
xwaylandcrap = true;
#endif
#endif
}
SDL_GL_SetSwapInterval(cv_vidwait.value ? 1 : 0);
@@ -294,13 +275,6 @@ void OglSdlFinishUpdate(boolean waitvbl)
if (!I_CheckNativeRes() || WipeInAction)
#endif
HWR_DrawScreenFinalTexture(realwidth, realheight, false);
#if defined (__unix__)
#ifdef USE_FBO_OGL
if (loaded_config)
xwaylandcrap = false;
#endif
#endif
}
#endif //HWRENDER