From 90c675a6683da10e02abf2ac8acb34e4557f08dc Mon Sep 17 00:00:00 2001 From: havoc Date: Sun, 13 Sep 2009 04:16:46 +0000 Subject: [PATCH] added detection of GL_EXT_framebuffer_object extension git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@9186 d7cf8633-e32d-0410-b094-e92efae38249 --- gl_backend.c | 7 +++++ gl_rmain.c | 2 +- glquake.h | 73 ++++++++++++++++++++++++++++++++++++++++++++++++++++ vid_shared.c | 47 +++++++++++++++++++++++++++++++++ 4 files changed, 128 insertions(+), 1 deletion(-) diff --git a/gl_backend.c b/gl_backend.c index c0907b36..9647420f 100644 --- a/gl_backend.c +++ b/gl_backend.c @@ -16,6 +16,7 @@ cvar_t gl_dither = {CVAR_SAVE, "gl_dither", "1", "enables OpenGL dithering (16bi cvar_t gl_lockarrays = {0, "gl_lockarrays", "0", "enables use of glLockArraysEXT, may cause glitches with some broken drivers, and may be slower than normal"}; cvar_t gl_lockarrays_minimumvertices = {0, "gl_lockarrays_minimumvertices", "1", "minimum number of vertices required for use of glLockArraysEXT, setting this too low may reduce performance"}; cvar_t gl_vbo = {CVAR_SAVE, "gl_vbo", "3", "make use of GL_ARB_vertex_buffer_object extension to store static geometry in video memory for faster rendering, 0 disables VBO allocation or use, 1 enables VBOs for vertex and triangle data, 2 only for vertex data, 3 for vertex data and triangle data of simple meshes (ones with only one surface)"}; +cvar_t gl_fbo = {CVAR_SAVE, "gl_fbo", "1", "make use of GL_ARB_framebuffer_object extension to enable shadowmaps and other features using pixel formats different from the framebuffer"}; cvar_t v_flipped = {0, "v_flipped", "0", "mirror the screen (poor man's left handed mode)"}; qboolean v_flipped_state = false; @@ -696,6 +697,12 @@ void GL_Backend_ResetState(void) qglBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0); } + if (gl_support_ext_framebuffer_object) + { + qglBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0); + qglBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); + } + qglVertexPointer(3, GL_FLOAT, sizeof(float[3]), NULL);CHECKGLERROR qglEnableClientState(GL_VERTEX_ARRAY);CHECKGLERROR diff --git a/gl_rmain.c b/gl_rmain.c index 9a22c999..23351c76 100644 --- a/gl_rmain.c +++ b/gl_rmain.c @@ -3717,7 +3717,7 @@ void R_HDR_RenderBloomTexture(void) // TODO: support GL_EXT_framebuffer_object rather than reusing the framebuffer? it might improve SLI performance. // TODO: add exposure compensation features - // TODO: add fp16 framebuffer support + // TODO: add fp16 framebuffer support (using GL_EXT_framebuffer_object) r_refdef.view.showdebug = false; r_refdef.view.colorscale *= r_bloom_colorscale.value / bound(1, r_hdr_range.value, 16); diff --git a/glquake.h b/glquake.h index 4ff40cd3..b1fae147 100644 --- a/glquake.h +++ b/glquake.h @@ -491,6 +491,79 @@ extern GLboolean (GLAPIENTRY *qglUnmapBufferARB) (GLenum target); extern void (GLAPIENTRY *qglBufferDataARB) (GLenum target, GLsizeiptrARB size, const GLvoid *data, GLenum usage); extern void (GLAPIENTRY *qglBufferSubDataARB) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const GLvoid *data); +//GL_EXT_framebuffer_object +extern int gl_support_ext_framebuffer_object; +#ifndef GL_FRAMEBUFFER_EXT +#define GL_FRAMEBUFFER_EXT 0x8D40 +#define GL_RENDERBUFFER_EXT 0x8D41 +#define GL_STENCIL_INDEX1_EXT 0x8D46 +#define GL_STENCIL_INDEX4_EXT 0x8D47 +#define GL_STENCIL_INDEX8_EXT 0x8D48 +#define GL_STENCIL_INDEX16_EXT 0x8D49 +#define GL_RENDERBUFFER_WIDTH_EXT 0x8D42 +#define GL_RENDERBUFFER_HEIGHT_EXT 0x8D43 +#define GL_RENDERBUFFER_INTERNAL_FORMAT_EXT 0x8D44 +#define GL_RENDERBUFFER_RED_SIZE_EXT 0x8D50 +#define GL_RENDERBUFFER_GREEN_SIZE_EXT 0x8D51 +#define GL_RENDERBUFFER_BLUE_SIZE_EXT 0x8D52 +#define GL_RENDERBUFFER_ALPHA_SIZE_EXT 0x8D53 +#define GL_RENDERBUFFER_DEPTH_SIZE_EXT 0x8D54 +#define GL_RENDERBUFFER_STENCIL_SIZE_EXT 0x8D55 +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT 0x8CD0 +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT 0x8CD1 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT 0x8CD2 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT 0x8CD3 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT 0x8CD4 +#define GL_COLOR_ATTACHMENT0_EXT 0x8CE0 +#define GL_COLOR_ATTACHMENT1_EXT 0x8CE1 +#define GL_COLOR_ATTACHMENT2_EXT 0x8CE2 +#define GL_COLOR_ATTACHMENT3_EXT 0x8CE3 +#define GL_COLOR_ATTACHMENT4_EXT 0x8CE4 +#define GL_COLOR_ATTACHMENT5_EXT 0x8CE5 +#define GL_COLOR_ATTACHMENT6_EXT 0x8CE6 +#define GL_COLOR_ATTACHMENT7_EXT 0x8CE7 +#define GL_COLOR_ATTACHMENT8_EXT 0x8CE8 +#define GL_COLOR_ATTACHMENT9_EXT 0x8CE9 +#define GL_COLOR_ATTACHMENT10_EXT 0x8CEA +#define GL_COLOR_ATTACHMENT11_EXT 0x8CEB +#define GL_COLOR_ATTACHMENT12_EXT 0x8CEC +#define GL_COLOR_ATTACHMENT13_EXT 0x8CED +#define GL_COLOR_ATTACHMENT14_EXT 0x8CEE +#define GL_COLOR_ATTACHMENT15_EXT 0x8CEF +#define GL_DEPTH_ATTACHMENT_EXT 0x8D00 +#define GL_STENCIL_ATTACHMENT_EXT 0x8D20 +#define GL_FRAMEBUFFER_COMPLETE_EXT 0x8CD5 +#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT 0x8CD6 +#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT 0x8CD7 +#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT 0x8CD9 +#define GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT 0x8CDA +#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT 0x8CDB +#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT 0x8CDC +#define GL_FRAMEBUFFER_UNSUPPORTED_EXT 0x8CDD +#define GL_FRAMEBUFFER_BINDING_EXT 0x8CA6 +#define GL_RENDERBUFFER_BINDING_EXT 0x8CA7 +#define GL_MAX_COLOR_ATTACHMENTS_EXT 0x8CDF +#define GL_MAX_RENDERBUFFER_SIZE_EXT 0x84E8 +#define GL_INVALID_FRAMEBUFFER_OPERATION_EXT 0x0506 +#endif +extern GLboolean (GLAPIENTRY *qglIsRenderbufferEXT)(GLuint renderbuffer); +extern void (GLAPIENTRY *qglBindRenderbufferEXT)(GLenum target, GLuint renderbuffer); +extern void (GLAPIENTRY *qglDeleteRenderbuffersEXT)(GLsizei n, const GLuint *renderbuffers); +extern void (GLAPIENTRY *qglGenRenderbuffersEXT)(GLsizei n, GLuint *renderbuffers); +extern void (GLAPIENTRY *qglRenderbufferStorageEXT)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height); +extern void (GLAPIENTRY *qglGetRenderbufferParameterivEXT)(GLenum target, GLenum pname, GLint *params); +extern GLboolean (GLAPIENTRY *qglIsFramebufferEXT)(GLuint framebuffer); +extern void (GLAPIENTRY *qglBindFramebufferEXT)(GLenum target, GLuint framebuffer); +extern void (GLAPIENTRY *qglDeleteFramebuffersEXT)(GLsizei n, const GLuint *framebuffers); +extern void (GLAPIENTRY *qglGenFramebuffersEXT)(GLsizei n, GLuint *framebuffers); +extern GLenum (GLAPIENTRY *qglCheckFramebufferStatusEXT)(GLenum target); +extern void (GLAPIENTRY *qglFramebufferTexture1DEXT)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +extern void (GLAPIENTRY *qglFramebufferTexture2DEXT)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +extern void (GLAPIENTRY *qglFramebufferTexture3DEXT)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +extern void (GLAPIENTRY *qglFramebufferRenderbufferEXT)(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +extern void (GLAPIENTRY *qglGetFramebufferAttachmentParameterivEXT)(GLenum target, GLenum attachment, GLenum pname, GLint *params); +extern void (GLAPIENTRY *qglGenerateMipmapEXT)(GLenum target); + extern void (GLAPIENTRY *qglScissor)(GLint x, GLint y, GLsizei width, GLsizei height); extern void (GLAPIENTRY *qglClearColor)(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); diff --git a/vid_shared.c b/vid_shared.c index ce164b4d..7376fee8 100644 --- a/vid_shared.c +++ b/vid_shared.c @@ -61,6 +61,8 @@ int gl_support_vertex_shader = false; int gl_support_fragment_shader = false; //GL_ARB_vertex_buffer_object int gl_support_arb_vertex_buffer_object = false; +//GL_EXT_framebuffer_object +int gl_support_ext_framebuffer_object = false; //GL_ARB_texture_compression int gl_support_texture_compression = false; //GL_ARB_occlusion_query @@ -376,6 +378,25 @@ GLboolean (GLAPIENTRY *qglUnmapBufferARB) (GLenum target); void (GLAPIENTRY *qglBufferDataARB) (GLenum target, GLsizeiptrARB size, const GLvoid *data, GLenum usage); void (GLAPIENTRY *qglBufferSubDataARB) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const GLvoid *data); +//GL_EXT_framebuffer_object +GLboolean (GLAPIENTRY *qglIsRenderbufferEXT)(GLuint renderbuffer); +void (GLAPIENTRY *qglBindRenderbufferEXT)(GLenum target, GLuint renderbuffer); +void (GLAPIENTRY *qglDeleteRenderbuffersEXT)(GLsizei n, const GLuint *renderbuffers); +void (GLAPIENTRY *qglGenRenderbuffersEXT)(GLsizei n, GLuint *renderbuffers); +void (GLAPIENTRY *qglRenderbufferStorageEXT)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height); +void (GLAPIENTRY *qglGetRenderbufferParameterivEXT)(GLenum target, GLenum pname, GLint *params); +GLboolean (GLAPIENTRY *qglIsFramebufferEXT)(GLuint framebuffer); +void (GLAPIENTRY *qglBindFramebufferEXT)(GLenum target, GLuint framebuffer); +void (GLAPIENTRY *qglDeleteFramebuffersEXT)(GLsizei n, const GLuint *framebuffers); +void (GLAPIENTRY *qglGenFramebuffersEXT)(GLsizei n, GLuint *framebuffers); +GLenum (GLAPIENTRY *qglCheckFramebufferStatusEXT)(GLenum target); +void (GLAPIENTRY *qglFramebufferTexture1DEXT)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +void (GLAPIENTRY *qglFramebufferTexture2DEXT)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +void (GLAPIENTRY *qglFramebufferTexture3DEXT)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +void (GLAPIENTRY *qglFramebufferRenderbufferEXT)(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +void (GLAPIENTRY *qglGetFramebufferAttachmentParameterivEXT)(GLenum target, GLenum attachment, GLenum pname, GLint *params); +void (GLAPIENTRY *qglGenerateMipmapEXT)(GLenum target); + void (GLAPIENTRY *qglCompressedTexImage3DARB)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); void (GLAPIENTRY *qglCompressedTexImage2DARB)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); void (GLAPIENTRY *qglCompressedTexImage1DARB)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data); @@ -741,6 +762,28 @@ static dllfunction_t vbofuncs[] = {NULL, NULL} }; +static dllfunction_t fbofuncs[] = +{ + {"glIsRenderbufferEXT" , (void **) &qglIsRenderbufferEXT}, + {"glBindRenderbufferEXT" , (void **) &qglBindRenderbufferEXT}, + {"glDeleteRenderbuffersEXT" , (void **) &qglDeleteRenderbuffersEXT}, + {"glGenRenderbuffersEXT" , (void **) &qglGenRenderbuffersEXT}, + {"glRenderbufferStorageEXT" , (void **) &qglRenderbufferStorageEXT}, + {"glGetRenderbufferParameterivEXT" , (void **) &qglGetRenderbufferParameterivEXT}, + {"glIsFramebufferEXT" , (void **) &qglIsFramebufferEXT}, + {"glBindFramebufferEXT" , (void **) &qglBindFramebufferEXT}, + {"glDeleteFramebuffersEXT" , (void **) &qglDeleteFramebuffersEXT}, + {"glGenFramebuffersEXT" , (void **) &qglGenFramebuffersEXT}, + {"glCheckFramebufferStatusEXT" , (void **) &qglCheckFramebufferStatusEXT}, + {"glFramebufferTexture1DEXT" , (void **) &qglFramebufferTexture1DEXT}, + {"glFramebufferTexture2DEXT" , (void **) &qglFramebufferTexture2DEXT}, + {"glFramebufferTexture3DEXT" , (void **) &qglFramebufferTexture3DEXT}, + {"glFramebufferRenderbufferEXT" , (void **) &qglFramebufferRenderbufferEXT}, + {"glGetFramebufferAttachmentParameterivEXT" , (void **) &qglGetFramebufferAttachmentParameterivEXT}, + {"glGenerateMipmapEXT" , (void **) &qglGenerateMipmapEXT}, + {NULL, NULL} +}; + static dllfunction_t texturecompressionfuncs[] = { {"glCompressedTexImage3DARB", (void **) &qglCompressedTexImage3DARB}, @@ -794,6 +837,7 @@ void VID_CheckExtensions(void) gl_support_vertex_shader = false; gl_support_fragment_shader = false; gl_support_arb_vertex_buffer_object = false; + gl_support_ext_framebuffer_object = false; gl_support_texture_compression = false; gl_support_arb_occlusion_query = false; @@ -856,6 +900,9 @@ void VID_CheckExtensions(void) // COMMANDLINEOPTION: GL: -novbo disables GL_ARB_vertex_buffer_object (which accelerates rendering) gl_support_arb_vertex_buffer_object = GL_CheckExtension("GL_ARB_vertex_buffer_object", vbofuncs, "-novbo", false); +// COMMANDLINEOPTION: GL: -nofbo disables GL_EXT_framebuffer_object (which accelerates rendering) + gl_support_ext_framebuffer_object = GL_CheckExtension("GL_EXT_framebuffer_object", fbofuncs, "-nofbo", false); + // we don't care if it's an extension or not, they are identical functions, so keep it simple in the rendering code if (qglDrawRangeElements == NULL) qglDrawRangeElements = qglDrawRangeElementsEXT; -- 2.39.2