diff --git a/glutils.cpp b/glutils.cpp index eb74c6cd08..d2883a470f 100644 --- a/glutils.cpp +++ b/glutils.cpp @@ -34,13 +34,31 @@ glXQueryDrawable_func glXQueryDrawable; // texture_from_pixmap extension functions glXReleaseTexImageEXT_func glXReleaseTexImageEXT; glXBindTexImageEXT_func glXBindTexImageEXT; -// glActiveTexture -glActiveTexture_func glActiveTexture; // glXCopySubBufferMESA glXCopySubBuffer_func glXCopySubBuffer; // video_sync extension functions glXGetVideoSync_func glXGetVideoSync; glXWaitVideoSync_func glXWaitVideoSync; +// glActiveTexture +glActiveTexture_func glActiveTexture; +// framebuffer_object extension functions +glIsRenderbuffer_func glIsRenderbuffer; +glBindRenderbuffer_func glBindRenderbuffer; +glDeleteRenderbuffers_func glDeleteRenderbuffers; +glGenRenderbuffers_func glGenRenderbuffers; +glRenderbufferStorage_func glRenderbufferStorage; +glGetRenderbufferParameteriv_func glGetRenderbufferParameteriv; +glIsFramebuffer_func glIsFramebuffer; +glBindFramebuffer_func glBindFramebuffer; +glDeleteFramebuffers_func glDeleteFramebuffers; +glGenFramebuffers_func glGenFramebuffers; +glCheckFramebufferStatus_func glCheckFramebufferStatus; +glFramebufferTexture1D_func glFramebufferTexture1D; +glFramebufferTexture2D_func glFramebufferTexture2D; +glFramebufferTexture3D_func glFramebufferTexture3D; +glFramebufferRenderbuffer_func glFramebufferRenderbuffer; +glGetFramebufferAttachmentParameteriv_func glGetFramebufferAttachmentParameteriv; +glGenerateMipmap_func glGenerateMipmap; // Functions @@ -119,6 +137,54 @@ void initGL() glActiveTexture = NULL; glTextureUnitsCount = 0; } + if( hasGLExtension( "GL_EXT_framebuffer_object" )) + { + glIsRenderbuffer = (glIsRenderbuffer_func) getProcAddress( "glIsRenderbufferEXT" ); + glBindRenderbuffer = (glBindRenderbuffer_func) getProcAddress( "glBindRenderbufferEXT" ); + glDeleteRenderbuffers = (glDeleteRenderbuffers_func) getProcAddress( "glDeleteRenderbuffersEXT" ); + glGenRenderbuffers = (glGenRenderbuffers_func) getProcAddress( "glGenRenderbuffersEXT" ); + + glRenderbufferStorage = (glRenderbufferStorage_func) getProcAddress( "glRenderbufferStorageEXT" ); + + glGetRenderbufferParameteriv = (glGetRenderbufferParameteriv_func) getProcAddress( "glGetRenderbufferParameterivEXT" ); + + glIsFramebuffer = (glIsFramebuffer_func) getProcAddress( "glIsFramebufferEXT" ); + glBindFramebuffer = (glBindFramebuffer_func) getProcAddress( "glBindFramebufferEXT" ); + glDeleteFramebuffers = (glDeleteFramebuffers_func) getProcAddress( "glDeleteFramebuffersEXT" ); + glGenFramebuffers = (glGenFramebuffers_func) getProcAddress( "glGenFramebuffersEXT" ); + + glCheckFramebufferStatus = (glCheckFramebufferStatus_func) getProcAddress( "glCheckFramebufferStatusEXT" ); + + glFramebufferTexture1D = (glFramebufferTexture1D_func) getProcAddress( "glFramebufferTexture1DEXT" ); + glFramebufferTexture2D = (glFramebufferTexture2D_func) getProcAddress( "glFramebufferTexture2DEXT" ); + glFramebufferTexture3D = (glFramebufferTexture3D_func) getProcAddress( "glFramebufferTexture3DEXT" ); + + glFramebufferRenderbuffer = (glFramebufferRenderbuffer_func) getProcAddress( "glFramebufferRenderbufferEXT" ); + + glGetFramebufferAttachmentParameteriv = (glGetFramebufferAttachmentParameteriv_func) getProcAddress( "glGetFramebufferAttachmentParameterivEXT" ); + + glGenerateMipmap = (glGenerateMipmap_func) getProcAddress( "glGenerateMipmapEXT" ); + } + else + { + glIsRenderbuffer = NULL; + glBindRenderbuffer = NULL; + glDeleteRenderbuffers = NULL; + glGenRenderbuffers = NULL; + glRenderbufferStorage = NULL; + glGetRenderbufferParameteriv = NULL; + glIsFramebuffer = NULL; + glBindFramebuffer = NULL; + glDeleteFramebuffers = NULL; + glGenFramebuffers = NULL; + glCheckFramebufferStatus = NULL; + glFramebufferTexture1D = NULL; + glFramebufferTexture2D = NULL; + glFramebufferTexture3D = NULL; + glFramebufferRenderbuffer = NULL; + glGetFramebufferAttachmentParameteriv = NULL; + glGenerateMipmap = NULL; + } } bool hasGLVersion(int major, int minor, int release) diff --git a/glutils.h b/glutils.h index eb3372f81d..362825ab41 100644 --- a/glutils.h +++ b/glutils.h @@ -88,9 +88,6 @@ typedef void (*glXBindTexImageEXT_func)( Display* dpy, GLXDrawable drawable, typedef void (*glXReleaseTexImageEXT_func)( Display* dpy, GLXDrawable drawable, int buffer ); extern glXReleaseTexImageEXT_func glXReleaseTexImageEXT; extern glXBindTexImageEXT_func glXBindTexImageEXT; -// glActiveTexture -typedef void (*glActiveTexture_func)(GLenum); -extern glActiveTexture_func glActiveTexture; // glXCopySubBufferMESA typedef void (*glXCopySubBuffer_func) ( Display* , GLXDrawable, int, int, int, int ); extern glXCopySubBuffer_func glXCopySubBuffer; @@ -99,6 +96,44 @@ typedef void (*glXGetVideoSync_func)( unsigned int *count ); typedef void (*glXWaitVideoSync_func)( int divisor, int remainder, unsigned int *count ); extern glXGetVideoSync_func glXGetVideoSync; extern glXWaitVideoSync_func glXWaitVideoSync; +// glActiveTexture +typedef void (*glActiveTexture_func)(GLenum); +extern glActiveTexture_func glActiveTexture; +// framebuffer_object extension functions +typedef bool (*glIsRenderbuffer_func)( GLuint renderbuffer ); +typedef void (*glBindRenderbuffer_func)( GLenum target, GLuint renderbuffer ); +typedef void (*glDeleteRenderbuffers_func)( GLsizei n, const GLuint *renderbuffers ); +typedef void (*glGenRenderbuffers_func)( GLsizei n, GLuint *renderbuffers ); +typedef void (*glRenderbufferStorage_func)( GLenum target, GLenum internalformat, GLsizei width, GLsizei height ); +typedef void (*glGetRenderbufferParameteriv_func)( GLenum target, GLenum pname, GLint *params ); +typedef bool (*glIsFramebuffer_func)( GLuint framebuffer ); +typedef void (*glBindFramebuffer_func)( GLenum target, GLuint framebuffer ); +typedef void (*glDeleteFramebuffers_func)( GLsizei n, const GLuint *framebuffers ); +typedef void (*glGenFramebuffers_func)( GLsizei n, GLuint *framebuffers ); +typedef void (*glCheckFramebufferStatus_func)( GLenum target ); +typedef void (*glFramebufferTexture1D_func)( GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level ); +typedef void (*glFramebufferTexture2D_func)( GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level ); +typedef void (*glFramebufferTexture3D_func)( GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset ); +typedef void (*glFramebufferRenderbuffer_func)( GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer ); +typedef void (*glGetFramebufferAttachmentParameteriv_func)( GLenum target, GLenum attachment, GLenum pname, GLint *params ); +typedef void (*glGenerateMipmap_func)( GLenum target ); +extern glIsRenderbuffer_func glIsRenderbuffer; +extern glBindRenderbuffer_func glBindRenderbuffer; +extern glDeleteRenderbuffers_func glDeleteRenderbuffers; +extern glGenRenderbuffers_func glGenRenderbuffers; +extern glRenderbufferStorage_func glRenderbufferStorage; +extern glGetRenderbufferParameteriv_func glGetRenderbufferParameteriv; +extern glIsFramebuffer_func glIsFramebuffer; +extern glBindFramebuffer_func glBindFramebuffer; +extern glDeleteFramebuffers_func glDeleteFramebuffers; +extern glGenFramebuffers_func glGenFramebuffers; +extern glCheckFramebufferStatus_func glCheckFramebufferStatus; +extern glFramebufferTexture1D_func glFramebufferTexture1D; +extern glFramebufferTexture2D_func glFramebufferTexture2D; +extern glFramebufferTexture3D_func glFramebufferTexture3D; +extern glFramebufferRenderbuffer_func glFramebufferRenderbuffer; +extern glGetFramebufferAttachmentParameteriv_func glGetFramebufferAttachmentParameteriv; +extern glGenerateMipmap_func glGenerateMipmap; } // namespace diff --git a/scene_opengl.cpp b/scene_opengl.cpp index 40ec577461..12ad479c75 100644 --- a/scene_opengl.cpp +++ b/scene_opengl.cpp @@ -90,6 +90,7 @@ bool SceneOpenGL::strict_binding; // intended for AIGLX bool SceneOpenGL::db; // destination drawable is double-buffered bool SceneOpenGL::copy_buffer_hack; // workaround for nvidia < 1.0-9xxx drivers bool SceneOpenGL::supports_npot_textures; +bool SceneOpenGL::supports_fbo; bool SceneOpenGL::supports_saturation; bool SceneOpenGL::shm_mode; XShmSegmentInfo SceneOpenGL::shm; @@ -138,6 +139,7 @@ SceneOpenGL::SceneOpenGL( Workspace* ws ) // Check whether certain features are supported supports_npot_textures = hasGLExtension( "GL_ARB_texture_non_power_of_two" ) || hasGLVersion(2, 0); + supports_fbo = hasGLExtension( "GL_EXT_framebuffer_object" ); supports_saturation = ((hasGLExtension("GL_ARB_texture_env_crossbar") && hasGLExtension("GL_ARB_texture_env_dot3")) || hasGLVersion(1, 4)) && (glTextureUnitsCount >= 4) && glActiveTexture != NULL; diff --git a/scene_opengl.h b/scene_opengl.h index fb924a572c..449a4c27a1 100644 --- a/scene_opengl.h +++ b/scene_opengl.h @@ -73,6 +73,7 @@ class SceneOpenGL static bool strict_binding; static bool copy_buffer_hack; static bool supports_npot_textures; + static bool supports_fbo; static bool supports_saturation; QMap< Toplevel*, Window > windows; static XShmSegmentInfo shm;