From 88e416397084438170697e8d604583786395c83d Mon Sep 17 00:00:00 2001 From: whitequark Date: Fri, 20 Mar 2015 22:53:44 +0300 Subject: [PATCH] Use the extension version of FBO extension instead of core. This will allow solvespace to run on pre-OpenGL 3.0 implementations, such as VirtualBox (and possibly others). However, VirtualBox's handling of framebuffer objects is buggy; it tries to draw over our X window and fails to do either. I hate OpenGL. --- src/unix/gloffscreen.cpp | 50 ++++++++++++++++++++-------------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/src/unix/gloffscreen.cpp b/src/unix/gloffscreen.cpp index 2a734e5..3426315 100644 --- a/src/unix/gloffscreen.cpp +++ b/src/unix/gloffscreen.cpp @@ -3,27 +3,27 @@ // // Copyright 2015 //----------------------------------------------------------------------------- -#include "gloffscreen.h" - -#include -#include -#include - #include +#include "gloffscreen.h" +#include "solvespace.h" + GLOffscreen::GLOffscreen() : _pixels(NULL), _pixels_inv(NULL) { if(glewInit() != GLEW_OK) - abort(); + oops(); - glGenFramebuffers(1, &_framebuffer); - glGenRenderbuffers(1, &_color_renderbuffer); - glGenRenderbuffers(1, &_depth_renderbuffer); + if(!GL_EXT_framebuffer_object) + oops(); + + glGenFramebuffersEXT(1, &_framebuffer); + glGenRenderbuffersEXT(1, &_color_renderbuffer); + glGenRenderbuffersEXT(1, &_depth_renderbuffer); } GLOffscreen::~GLOffscreen() { - glDeleteRenderbuffers(1, &_depth_renderbuffer); - glDeleteRenderbuffers(1, &_color_renderbuffer); - glDeleteFramebuffers(1, &_framebuffer); + glDeleteRenderbuffersEXT(1, &_depth_renderbuffer); + glDeleteRenderbuffersEXT(1, &_color_renderbuffer); + glDeleteFramebuffersEXT(1, &_framebuffer); } bool GLOffscreen::begin(int width, int height) { @@ -38,22 +38,22 @@ bool GLOffscreen::begin(int width, int height) { _height = height; } - glBindFramebuffer(GL_FRAMEBUFFER, _framebuffer); + glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, _framebuffer); - glBindRenderbuffer(GL_RENDERBUFFER, _color_renderbuffer); - glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, _width, _height); - glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, - GL_RENDERBUFFER, _color_renderbuffer); + glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, _color_renderbuffer); + glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_RGBA8, _width, _height); + glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, + GL_RENDERBUFFER_EXT, _color_renderbuffer); - glBindRenderbuffer(GL_RENDERBUFFER, _depth_renderbuffer); - glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, _width, _height); - glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, - GL_RENDERBUFFER, _depth_renderbuffer); + glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, _depth_renderbuffer); + glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT24, _width, _height); + glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, + GL_RENDERBUFFER_EXT, _depth_renderbuffer); - if(glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE) + if(glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT) == GL_FRAMEBUFFER_COMPLETE_EXT) return true; - glBindFramebuffer(GL_FRAMEBUFFER, 0); + glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); return false; } @@ -70,7 +70,7 @@ uint8_t *GLOffscreen::end() { for(int i = 0; i < _height; i++) memcpy(&_pixels[_width * i], &_pixels_inv[_width * (_height - i - 1)], _width * 4); - glBindFramebuffer(GL_FRAMEBUFFER, 0); + glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); return (uint8_t*) _pixels; }