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:
parent
c7e089bcaf
commit
a03636b92f
|
@ -218,9 +218,5 @@ void Combiner_EndTextureUpdate();
|
|||
void Combiner_CalcLOD();
|
||||
void Combiner_PostCalcLOD();
|
||||
|
||||
#define FBO
|
||||
//#define LOD_TEST
|
||||
//#define FBO_OLD
|
||||
|
||||
#endif
|
||||
|
||||
|
|
139
GLSLCombiner.cpp
139
GLSLCombiner.cpp
|
@ -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 );
|
||||
}
|
||||
|
|
224
OpenGL.cpp
224
OpenGL.cpp
|
@ -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;
|
||||
}
|
||||
|
|
23
OpenGL.h
23
OpenGL.h
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue
Block a user