1
0
mirror of https://github.com/blawar/GLideN64.git synced 2024-07-07 03:13:49 +00:00

Make wrappers for frame buffer functions.

The wrappers call either OpenGL 4.x functions or FBO extensions,
depending on supported OpenGL version.
This commit is contained in:
Sergey Lipskiy 2013-06-01 00:29:31 +07:00
parent c7e089bcaf
commit a03636b92f
4 changed files with 272 additions and 118 deletions

View File

@ -218,9 +218,5 @@ void Combiner_EndTextureUpdate();
void Combiner_CalcLOD();
void Combiner_PostCalcLOD();
#define FBO
//#define LOD_TEST
//#define FBO_OLD
#endif

View File

@ -474,11 +474,10 @@ void InitGLSLCombiner()
#endif
#endif // LOD_TEST
#ifdef FBO
// generate a framebuffer
glGenFramebuffers(1, &g_lod_fbo);
ogl_glGenFramebuffers(1, &g_lod_fbo);
// bind it as the target for rendering commands
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, g_lod_fbo);
ogl_glBindFramebuffer(GL_DRAW_FRAMEBUFFER, g_lod_fbo);
glActiveTextureARB(GL_TEXTURE2_ARB);
glEnable(GL_TEXTURE_2D);
@ -488,16 +487,16 @@ void InitGLSLCombiner()
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexImage2D(GL_TEXTURE_2D, 0,GL_RG16F,
glTexImage2D(GL_TEXTURE_2D, 0,GL_RGBA16F,
OGL.width <= 1024 ? 1024 : 2048,
OGL.height <= 1024 ? 1024 : 2048,
0, GL_RG, GL_FLOAT,
0, GL_RGBA, GL_FLOAT,
NULL);
glBindTexture(GL_TEXTURE_2D, 0);
glFramebufferTexture(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, g_lod_tex, 0);
ogl_glFramebufferTexture(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, g_lod_tex, 0);
// check if everything is OK
GLenum e = glCheckFramebufferStatus(GL_DRAW_FRAMEBUFFER);
GLenum e = ogl_glCheckFramebufferStatus(GL_DRAW_FRAMEBUFFER);
switch (e) {
case GL_FRAMEBUFFER_UNDEFINED:
printf("FBO Undefined\n");
@ -517,83 +516,23 @@ void InitGLSLCombiner()
case GL_FRAMEBUFFER_COMPLETE:
printf("FBO OK\n");
break;
case GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT:
printf("framebuffer FRAMEBUFFER_DIMENSIONS\n");
break;
case GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT:
printf("framebuffer INCOMPLETE_FORMATS\n");
break;
default:
printf("FBO Problem?\n");
}
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
#endif
#ifdef FBO_OLD
// generate a framebuffer
glGenFramebuffersEXT(1, &g_lod_fbo);
glActiveTextureARB(GL_TEXTURE2_ARB);
glEnable(GL_TEXTURE_2D);
glGenTextures(1, &g_lod_tex);
glBindTexture(GL_TEXTURE_2D, g_lod_tex);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexImage2D(GL_TEXTURE_2D, 0,GL_RGBA16F,
OGL.width <= 1024 ? 1024 : 2048,
OGL.height <= 1024 ? 1024 : 2048,
0, GL_RGBA, GL_FLOAT,
NULL);
glBindTexture(GL_TEXTURE_2D, 0);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, g_lod_fbo);
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, g_lod_tex, 0);
// check if everything is OK
GLenum e = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
switch (e) {
case GL_FRAMEBUFFER_COMPLETE_EXT:
printf("framebuffer complete!\n");
break;
case GL_FRAMEBUFFER_UNSUPPORTED_EXT:
printf("framebuffer GL_FRAMEBUFFER_UNSUPPORTED_EXT\n");
/* you gotta choose different formats */
break;
case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT:
printf("framebuffer INCOMPLETE_ATTACHMENT\n");
break;
case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT:
printf("framebuffer FRAMEBUFFER_MISSING_ATTACHMENT\n");
break;
case GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT:
printf("framebuffer FRAMEBUFFER_DIMENSIONS\n");
break;
case GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT:
printf("framebuffer INCOMPLETE_FORMATS\n");
break;
case GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT:
printf("framebuffer INCOMPLETE_DRAW_BUFFER\n");
break;
case GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT:
printf("framebuffer INCOMPLETE_READ_BUFFER\n");
break;
case GL_FRAMEBUFFER_BINDING_EXT:
printf("framebuffer BINDING_EXT\n");
break;
default:
break;
/* programming error; will fail on all hardware */ \
/*assert(0);*/ \
}
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
#endif
ogl_glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
}
void DestroyGLSLCombiner() {
if (g_lod_tex > 0)
glDeleteTextures(1, &g_lod_tex);
#ifdef FBO
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
glDeleteFramebuffers(1, &g_lod_fbo);
#elif defined(FBO_OLD)
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
glDeleteFramebuffersEXT(1, &g_lod_fbo);
#endif
ogl_glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
ogl_glDeleteFramebuffers(1, &g_lod_fbo);
}
static
@ -824,6 +763,7 @@ void OGL_UpdateCullFace();
void OGL_UpdateViewport();
void OGL_ClearColorBuffer( float *color );
/*
void drawFBO()
{
glUseProgramObjectARB(0);
@ -867,36 +807,24 @@ void drawFBO()
OGL_UpdateViewport();
}
*/
void GLSL_CalcLOD() {
glDisable( GL_DEPTH_TEST );
#ifdef FBO
// bind a framebuffer object
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, g_lod_fbo);
ogl_glBindFramebuffer(GL_DRAW_FRAMEBUFFER, g_lod_fbo);
// Set Drawing buffers
GLuint attachments[1] = {GL_COLOR_ATTACHMENT0};
glDrawBuffers(1, attachments);
ogl_glDrawBuffers(1, attachments, g_lod_tex);
float clear_color[4] = {0.0f, 0.0f, 0.0f, 1.0f};
OGL_ClearColorBuffer(clear_color );
#elif defined(FBO_OLD)
// bind a framebuffer object
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, g_lod_fbo);
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, g_lod_tex, 0);
float clear_color[4] = {0.0f, 0.0f, 0.0f, 1.0f};
OGL_ClearColorBuffer(clear_color );
#endif
glUseProgramObjectARB(g_lod_program);
glDrawArrays( GL_TRIANGLES, 0, OGL.numVertices );
#ifdef FBO
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
#elif defined(FBO_OLD)
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
#endif
#if defined(FBO) || defined(FBO_OLD)
ogl_glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
// drawFBO();
#endif
#if defined(LOD_TEST)
glActiveTextureARB(GL_TEXTURE2_ARB);
@ -917,27 +845,16 @@ void GLSL_CalcLOD() {
void GLSL_PostCalcLOD() {
glDisable( GL_DEPTH_TEST );
#ifdef FBO
// bind a framebuffer object
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, g_lod_fbo);
ogl_glBindFramebuffer(GL_DRAW_FRAMEBUFFER, g_lod_fbo);
// Set Drawing buffers
GLuint attachments[1] = {GL_COLOR_ATTACHMENT0};
glDrawBuffers(1, attachments);
float clear_color[4] = {0.0f, 0.0f, 0.0f, 1.0f};
OGL_ClearColorBuffer(clear_color );
#elif defined(FBO_OLD)
// bind a framebuffer object
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, g_lod_fbo);
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, g_lod_tex, 0);
float clear_color[4] = {0.0f, 0.0f, 0.0f, 1.0f};
OGL_ClearColorBuffer(clear_color );
#endif
ogl_glDrawBuffers(1, attachments, g_lod_tex);
glUseProgramObjectARB(g_lod_clear_program);
glDrawArrays( GL_TRIANGLES, 0, OGL.numVertices );
#ifdef FBO
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
#elif defined(FBO_OLD)
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
#endif
ogl_glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
Combiner_SetCombine( gDP.combine.mux );
}

View File

@ -87,12 +87,16 @@ PFNGLSECONDARYCOLOR3USEXTPROC glSecondaryColor3usEXT;
PFNGLSECONDARYCOLOR3USVEXTPROC glSecondaryColor3usvEXT;
PFNGLSECONDARYCOLORPOINTEREXTPROC glSecondaryColorPointerEXT;
PFNGLGENBUFFERSPROC glGenBuffers;
PFNGLDRAWBUFFERSPROC glDrawBuffers;
PFNGLBINDFRAMEBUFFERPROC glBindFramebuffer;
PFNGLDELETEFRAMEBUFFERSPROC glDeleteFramebuffers;
PFNGLGENFRAMEBUFFERSPROC glGenFramebuffers;
PFNGLFRAMEBUFFERTEXTUREPROC glFramebufferTexture;
PFNGLGENRENDERBUFFERSPROC glGenRenderbuffers;
PFNGLBINDRENDERBUFFERPROC glBindRenderbuffer;
PFNGLRENDERBUFFERSTORAGEPROC glRenderbufferStorage;
PFNGLFRAMEBUFFERRENDERBUFFERPROC glFramebufferRenderbuffer;
PFNGLDELETERENDERBUFFERSPROC glDeleteRenderbuffers;
PFNGLCHECKFRAMEBUFFERSTATUSPROC glCheckFramebufferStatus;
PFNGLBINDFRAMEBUFFEREXTPROC glBindFramebufferEXT;
@ -241,12 +245,16 @@ void OGL_InitExtensions()
OGL.ATIX_texture_env_route = isExtensionSupported( "GL_ATIX_texture_env_route" );
OGL.NV_texture_env_combine4 = isExtensionSupported( "GL_NV_texture_env_combine4" );
glGenBuffers = (PFNGLGENBUFFERSPROC)wglGetProcAddress( "glGenBuffers" );
glDrawBuffers = (PFNGLDRAWBUFFERSPROC)wglGetProcAddress( "glDrawBuffers" );
glBindFramebuffer = (PFNGLBINDFRAMEBUFFERPROC)wglGetProcAddress( "glBindFramebuffer" );
glDeleteFramebuffers = (PFNGLDELETEFRAMEBUFFERSPROC)wglGetProcAddress( "glDeleteFramebuffers" );
glGenFramebuffers = (PFNGLGENFRAMEBUFFERSPROC)wglGetProcAddress( "glGenFramebuffers" );
glFramebufferTexture = (PFNGLFRAMEBUFFERTEXTUREPROC)wglGetProcAddress( "glFramebufferTexture" );
glGenRenderbuffers = (PFNGLGENRENDERBUFFERSPROC)wglGetProcAddress( "glGenRenderbuffers" );
glBindRenderbuffer = (PFNGLBINDRENDERBUFFERPROC)wglGetProcAddress( "glBindRenderbuffer" );
glRenderbufferStorage = (PFNGLRENDERBUFFERSTORAGEPROC)wglGetProcAddress( "glRenderbufferStorage" );
glFramebufferRenderbuffer = (PFNGLFRAMEBUFFERRENDERBUFFERPROC)wglGetProcAddress( "glFramebufferRenderbuffer" );
glDeleteRenderbuffers = (PFNGLDELETERENDERBUFFERSPROC)wglGetProcAddress( "glDeleteRenderbuffers" );
glCheckFramebufferStatus = (PFNGLCHECKFRAMEBUFFERSTATUSPROC)wglGetProcAddress( "glCheckFramebufferStatus" );
glBindFramebufferEXT = (PFNGLBINDFRAMEBUFFEREXTPROC)wglGetProcAddress("glBindFramebufferEXT");
@ -260,6 +268,13 @@ void OGL_InitExtensions()
glGenRenderbuffersEXT = (PFNGLGENRENDERBUFFERSEXTPROC)wglGetProcAddress("glGenRenderbuffersEXT");
glRenderbufferStorageEXT = (PFNGLRENDERBUFFERSTORAGEEXTPROC)wglGetProcAddress("glRenderbufferStorageEXT");
glFramebufferRenderbufferEXT = (PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC)wglGetProcAddress("glFramebufferRenderbufferEXT");
if (glGenFramebuffers != NULL)
OGL.framebuffer_mode = GLInfo::fbFBO;
else if (glBindFramebufferEXT != NULL)
OGL.framebuffer_mode = GLInfo::fbFBOEXT;
else
OGL.framebuffer_mode = GLInfo::fbNone;
}
void OGL_InitStates()
@ -1226,3 +1241,208 @@ OGL_SwapBuffers()
}
#endif // __LINUX__
void ogl_glGenFramebuffers (GLsizei n, GLuint *framebuffers) {
switch (OGL.framebuffer_mode) {
case GLInfo::fbFBO:
glGenFramebuffers(n, framebuffers);
break;
case GLInfo::fbFBOEXT:
glGenFramebuffersEXT(n, framebuffers);
break;
}
}
void ogl_glBindFramebuffer (GLenum target, GLuint framebuffer) {
switch (OGL.framebuffer_mode) {
case GLInfo::fbFBO:
glBindFramebuffer(target, framebuffer);
break;
case GLInfo::fbFBOEXT:
switch (target) {
case GL_DRAW_FRAMEBUFFER:
target = GL_FRAMEBUFFER_EXT;
break;
}
glBindFramebufferEXT(target, framebuffer);
break;
}
}
void ogl_glDeleteFramebuffers (GLsizei n, const GLuint *framebuffers) {
switch (OGL.framebuffer_mode) {
case GLInfo::fbFBO:
glDeleteFramebuffers(n, framebuffers);
break;
case GLInfo::fbFBOEXT:
glDeleteFramebuffersEXT(n, framebuffers);
break;
}
}
void ogl_glFramebufferTexture (GLenum target, GLenum attachment, GLuint texture, GLint level) {
switch (OGL.framebuffer_mode) {
case GLInfo::fbFBO:
glFramebufferTexture(target, attachment, texture, level);
break;
case GLInfo::fbFBOEXT:
switch (target) {
case GL_DRAW_FRAMEBUFFER:
target = GL_FRAMEBUFFER_EXT;
break;
}
switch (attachment) {
case GL_COLOR_ATTACHMENT0:
attachment = GL_COLOR_ATTACHMENT0_EXT;
break;
case GL_COLOR_ATTACHMENT1:
attachment = GL_COLOR_ATTACHMENT1_EXT;
break;
case GL_COLOR_ATTACHMENT2:
attachment = GL_COLOR_ATTACHMENT2_EXT;
break;
case GL_COLOR_ATTACHMENT3:
attachment = GL_COLOR_ATTACHMENT3_EXT;
break;
}
glFramebufferTexture2DEXT(target, attachment, GL_TEXTURE_2D, texture, level);
break;
}
}
void ogl_glGenRenderbuffers (GLsizei n, GLuint *renderbuffers) {
switch (OGL.framebuffer_mode) {
case GLInfo::fbFBO:
glGenRenderbuffers(n, renderbuffers);
break;
case GLInfo::fbFBOEXT:
glGenRenderbuffersEXT(n, renderbuffers);
break;
}
}
void ogl_glBindRenderbuffer (GLenum target, GLuint renderbuffer) {
switch (OGL.framebuffer_mode) {
case GLInfo::fbFBO:
glBindRenderbuffer(target, renderbuffer);
break;
case GLInfo::fbFBOEXT:
switch (target) {
case GL_RENDERBUFFER:
target = GL_RENDERBUFFER_EXT;
break;
}
glBindRenderbufferEXT(target, renderbuffer);
break;
}
}
void ogl_glRenderbufferStorage (GLenum target, GLenum internalformat, GLsizei width, GLsizei height) {
switch (OGL.framebuffer_mode) {
case GLInfo::fbFBO:
glRenderbufferStorage(target, internalformat, width, height);
break;
case GLInfo::fbFBOEXT:
switch (target) {
case GL_RENDERBUFFER:
target = GL_RENDERBUFFER_EXT;
break;
}
glRenderbufferStorageEXT(target, internalformat, width, height);
break;
}
}
void ogl_glDeleteRenderbuffers (GLsizei n, const GLuint *renderbuffers) {
switch (OGL.framebuffer_mode) {
case GLInfo::fbFBO:
glDeleteRenderbuffers(n, renderbuffers);
break;
case GLInfo::fbFBOEXT:
glDeleteRenderbuffersEXT(n, renderbuffers);
break;
}
}
void ogl_glFramebufferRenderbuffer (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer) {
switch (OGL.framebuffer_mode) {
case GLInfo::fbFBO:
glFramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer);
break;
case GLInfo::fbFBOEXT:
switch (target) {
case GL_DRAW_FRAMEBUFFER:
target = GL_FRAMEBUFFER_EXT;
break;
}
switch (attachment) {
case GL_COLOR_ATTACHMENT0:
attachment = GL_COLOR_ATTACHMENT0_EXT;
break;
case GL_COLOR_ATTACHMENT1:
attachment = GL_COLOR_ATTACHMENT1_EXT;
break;
case GL_COLOR_ATTACHMENT2:
attachment = GL_COLOR_ATTACHMENT2_EXT;
break;
case GL_COLOR_ATTACHMENT3:
attachment = GL_COLOR_ATTACHMENT3_EXT;
break;
case GL_DEPTH_ATTACHMENT:
attachment = GL_DEPTH_ATTACHMENT_EXT;
break;
}
switch (renderbuffertarget) {
case GL_RENDERBUFFER:
target = GL_RENDERBUFFER_EXT;
break;
}
glFramebufferRenderbufferEXT(target, attachment, renderbuffertarget, renderbuffer);
break;
}
}
void ogl_glDrawBuffers (GLsizei n, const GLenum *bufs, GLuint texture) {
switch (OGL.framebuffer_mode) {
case GLInfo::fbFBO:
glDrawBuffers(n, bufs);
break;
case GLInfo::fbFBOEXT:
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, texture, 0);
break;
}
}
GLenum ogl_glCheckFramebufferStatus (GLenum target) {
switch (OGL.framebuffer_mode) {
case GLInfo::fbFBO:
return glCheckFramebufferStatus(target);
case GLInfo::fbFBOEXT:
switch (target) {
case GL_DRAW_FRAMEBUFFER:
target = GL_FRAMEBUFFER_EXT;
break;
}
switch (glCheckFramebufferStatusEXT(target)) {
case GL_FRAMEBUFFER_COMPLETE_EXT:
return GL_FRAMEBUFFER_COMPLETE;
case GL_FRAMEBUFFER_UNSUPPORTED_EXT:
return GL_FRAMEBUFFER_UNSUPPORTED;
case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT:
return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT:
return GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT;
case GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT:
return GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT;
case GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT:
return GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT;
case GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT:
return GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER;
case GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT:
return GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER;
case GL_FRAMEBUFFER_BINDING_EXT:
return GL_FRAMEBUFFER_BINDING;
}
}
return GL_FRAMEBUFFER_UNSUPPORTED;
}

View File

@ -84,6 +84,11 @@ struct GLInfo
BYTE lastStipple;
BYTE combiner;
enum {
fbNone,
fbFBO,
fbFBOEXT
} framebuffer_mode;
};
extern GLInfo OGL;
@ -149,12 +154,16 @@ extern PFNGLSECONDARYCOLOR3USEXTPROC glSecondaryColor3usEXT;
extern PFNGLSECONDARYCOLOR3USVEXTPROC glSecondaryColor3usvEXT;
extern PFNGLSECONDARYCOLORPOINTEREXTPROC glSecondaryColorPointerEXT;
extern PFNGLGENBUFFERSPROC glGenBuffers;
extern PFNGLDRAWBUFFERSPROC glDrawBuffers;
extern PFNGLGENFRAMEBUFFERSPROC glGenFramebuffers;
extern PFNGLBINDFRAMEBUFFERPROC glBindFramebuffer;
extern PFNGLDELETEFRAMEBUFFERSPROC glDeleteFramebuffers;
extern PFNGLFRAMEBUFFERTEXTUREPROC glFramebufferTexture;
extern PFNGLGENRENDERBUFFERSPROC glGenRenderbuffers;
extern PFNGLBINDRENDERBUFFERPROC glBindRenderbuffer;
extern PFNGLRENDERBUFFERSTORAGEPROC glRenderbufferStorage;
extern PFNGLDELETERENDERBUFFERSPROC glDeleteRenderbuffers;
extern PFNGLFRAMEBUFFERRENDERBUFFERPROC glFramebufferRenderbuffer;
extern PFNGLCHECKFRAMEBUFFERSTATUSPROC glCheckFramebufferStatus;
extern PFNGLBINDFRAMEBUFFEREXTPROC glBindFramebufferEXT;
@ -186,4 +195,16 @@ void OGL_SwapBuffers();
#endif // __LINUX__
void OGL_ReadScreen( void **dest, long *width, long *height );
void ogl_glGenFramebuffers (GLsizei n, GLuint *framebuffers);
void ogl_glBindFramebuffer (GLenum target, GLuint framebuffer);
void ogl_glDeleteFramebuffers (GLsizei n, const GLuint *framebuffers);
void ogl_glFramebufferTexture (GLenum target, GLenum attachment, GLuint texture, GLint level);
void ogl_glGenRenderbuffers (GLsizei n, GLuint *renderbuffers);
void ogl_glBindRenderbuffer (GLenum target, GLuint renderbuffer);
void ogl_glRenderbufferStorage (GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
void ogl_glDeleteRenderbuffers (GLsizei n, const GLuint *renderbuffers);
void ogl_glFramebufferRenderbuffer (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
void ogl_glDrawBuffers (GLsizei n, const GLenum *bufs, GLuint texture);
GLenum ogl_glCheckFramebufferStatus (GLenum target);
#endif