From 5142e912cc7494da047547b485cfb04931abfc43 Mon Sep 17 00:00:00 2001 From: Eduardo Bart Date: Fri, 18 Mar 2011 21:22:29 -0300 Subject: [PATCH] use ARB extensions --- src/framework/framebuffer.cpp | 38 +++++++++++++++++------------------ src/framework/graphics.cpp | 29 ++++++++++++++++++++++++++ src/framework/graphics.h | 2 ++ 3 files changed, 50 insertions(+), 19 deletions(-) diff --git a/src/framework/framebuffer.cpp b/src/framework/framebuffer.cpp index c7f42e1b..8dbf3c35 100644 --- a/src/framework/framebuffer.cpp +++ b/src/framework/framebuffer.cpp @@ -25,11 +25,11 @@ #include "platform.h" #include "graphics.h" -PFNGLGENFRAMEBUFFERSEXTPROC oglGenFramebuffersEXT = 0; -PFNGLBINDFRAMEBUFFEREXTPROC oglBindFramebufferEXT = 0; -PFNGLFRAMEBUFFERTEXTURE2DEXTPROC oglFramebufferTexture2DEXT = 0; -PFNGLDELETEFRAMEBUFFERSEXTPROC oglDeleteFramebuffersEXT = 0; -PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC oglCheckFramebufferStatusEXT = 0; +PFNGLGENFRAMEBUFFERSPROC oglGenFramebuffers = 0; +PFNGLBINDFRAMEBUFFERPROC oglBindFramebuffer = 0; +PFNGLFRAMEBUFFERTEXTURE2DPROC oglFramebufferTexture2D = 0; +PFNGLDELETEFRAMEBUFFERSPROC oglDeleteFramebuffers = 0; +PFNGLCHECKFRAMEBUFFERSTATUSPROC oglCheckFramebufferStatus = 0; FrameBuffer::FrameBuffer(int width, int height) { @@ -49,24 +49,24 @@ FrameBuffer::FrameBuffer(int width, int height) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); // use FBO ext only if supported - if(Platform::isExtensionSupported("EXT_framebuffer_object")) { + if(g_graphics.isExtensionSupported("ARB_framebuffer_object")) { m_fallbackOldImp = false; - if(!oglGenFramebuffersEXT) { - oglGenFramebuffersEXT = (PFNGLGENFRAMEBUFFERSEXTPROC)Platform::getExtensionProcAddress("glGenFramebuffersEXT"); - oglBindFramebufferEXT = (PFNGLBINDFRAMEBUFFEREXTPROC)Platform::getExtensionProcAddress("glBindFramebufferEXT"); - oglFramebufferTexture2DEXT = (PFNGLFRAMEBUFFERTEXTURE2DEXTPROC)Platform::getExtensionProcAddress("glFramebufferTexture2DEXT"); - oglDeleteFramebuffersEXT = (PFNGLDELETEFRAMEBUFFERSEXTPROC)Platform::getExtensionProcAddress("glDeleteFramebuffersEXT"); - oglCheckFramebufferStatusEXT = (PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC)Platform::getExtensionProcAddress("glCheckFramebufferStatusEXT"); + if(!oglGenFramebuffers) { + oglGenFramebuffers = (PFNGLGENFRAMEBUFFERSPROC)Platform::getExtensionProcAddress("glGenFramebuffers"); + oglBindFramebuffer = (PFNGLBINDFRAMEBUFFERPROC)Platform::getExtensionProcAddress("glBindFramebuffer"); + oglFramebufferTexture2D = (PFNGLFRAMEBUFFERTEXTURE2DPROC)Platform::getExtensionProcAddress("glFramebufferTexture2D"); + oglDeleteFramebuffers = (PFNGLDELETEFRAMEBUFFERSPROC)Platform::getExtensionProcAddress("glDeleteFramebuffers"); + oglCheckFramebufferStatus = (PFNGLCHECKFRAMEBUFFERSTATUSPROC)Platform::getExtensionProcAddress("glCheckFramebufferStatus"); } // generate FBO - oglGenFramebuffersEXT(1, &m_fbo); - oglBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_fbo); + oglGenFramebuffers(1, &m_fbo); + oglBindFramebuffer(GL_FRAMEBUFFER_EXT, m_fbo); // attach 2D texture to this FBO - oglFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, m_fboTexture, 0); + oglFramebufferTexture2D(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, m_fboTexture, 0); - GLenum status = oglCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT); + GLenum status = oglCheckFramebufferStatus(GL_FRAMEBUFFER_EXT); switch(status) { case GL_FRAMEBUFFER_COMPLETE_EXT: //ok @@ -85,14 +85,14 @@ FrameBuffer::~FrameBuffer() { glDeleteTextures(1, &m_fboTexture); if(m_fbo) - oglDeleteFramebuffersEXT(1, &m_fbo); + oglDeleteFramebuffers(1, &m_fbo); } void FrameBuffer::bind() { if(!m_fallbackOldImp) { // bind framebuffer - oglBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_fbo); + oglBindFramebuffer(GL_FRAMEBUFFER_EXT, m_fbo); } // setup framebuffer viewport @@ -114,7 +114,7 @@ void FrameBuffer::unbind() { if(!m_fallbackOldImp) { // bind back buffer again - oglBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); + oglBindFramebuffer(GL_FRAMEBUFFER_EXT, 0); glDrawBuffer(GL_BACK); glReadBuffer(GL_BACK); diff --git a/src/framework/graphics.cpp b/src/framework/graphics.cpp index cf3ee40a..d1acd2a5 100644 --- a/src/framework/graphics.cpp +++ b/src/framework/graphics.cpp @@ -58,6 +58,35 @@ void Graphics::terminate() } +bool Graphics::isExtensionSupported(const char *extension) +{ + const GLubyte *extensions = NULL; + const GLubyte *start; + GLubyte *where, *terminator; + where = (GLubyte *)strchr(extension, ' '); + + if(where || *extension == '\0') + return 0; + + extensions = glGetString(GL_EXTENSIONS); + + start = extensions; + while(true) { + where = (GLubyte *) strstr((const char *)start, extension); + if(!where) + break; + + terminator = where + strlen(extension); + + if(where == start || *(where - 1) == ' ') + if(*terminator == ' ' || *terminator == '\0') + return 1; + + start = terminator; + } + return 0; +} + void Graphics::resize(int width, int height) { m_screenSize.setWidth(width); diff --git a/src/framework/graphics.h b/src/framework/graphics.h index ea544be8..0b8a7319 100644 --- a/src/framework/graphics.h +++ b/src/framework/graphics.h @@ -41,6 +41,8 @@ public: void init(); void terminate(); + bool isExtensionSupported(const char *extension); + /// Called after every window resize void resize(int width, int height);