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.
This commit is contained in:
whitequark 2015-03-20 22:53:44 +03:00
parent e27c6b56c3
commit 88e4163970

View File

@ -3,27 +3,27 @@
// //
// Copyright 2015 <whitequark@whitequark.org> // Copyright 2015 <whitequark@whitequark.org>
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
#include "gloffscreen.h"
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <GL/glew.h> #include <GL/glew.h>
#include "gloffscreen.h"
#include "solvespace.h"
GLOffscreen::GLOffscreen() : _pixels(NULL), _pixels_inv(NULL) { GLOffscreen::GLOffscreen() : _pixels(NULL), _pixels_inv(NULL) {
if(glewInit() != GLEW_OK) if(glewInit() != GLEW_OK)
abort(); oops();
glGenFramebuffers(1, &_framebuffer); if(!GL_EXT_framebuffer_object)
glGenRenderbuffers(1, &_color_renderbuffer); oops();
glGenRenderbuffers(1, &_depth_renderbuffer);
glGenFramebuffersEXT(1, &_framebuffer);
glGenRenderbuffersEXT(1, &_color_renderbuffer);
glGenRenderbuffersEXT(1, &_depth_renderbuffer);
} }
GLOffscreen::~GLOffscreen() { GLOffscreen::~GLOffscreen() {
glDeleteRenderbuffers(1, &_depth_renderbuffer); glDeleteRenderbuffersEXT(1, &_depth_renderbuffer);
glDeleteRenderbuffers(1, &_color_renderbuffer); glDeleteRenderbuffersEXT(1, &_color_renderbuffer);
glDeleteFramebuffers(1, &_framebuffer); glDeleteFramebuffersEXT(1, &_framebuffer);
} }
bool GLOffscreen::begin(int width, int height) { bool GLOffscreen::begin(int width, int height) {
@ -38,22 +38,22 @@ bool GLOffscreen::begin(int width, int height) {
_height = height; _height = height;
} }
glBindFramebuffer(GL_FRAMEBUFFER, _framebuffer); glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, _framebuffer);
glBindRenderbuffer(GL_RENDERBUFFER, _color_renderbuffer); glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, _color_renderbuffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, _width, _height); glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_RGBA8, _width, _height);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT,
GL_RENDERBUFFER, _color_renderbuffer); GL_RENDERBUFFER_EXT, _color_renderbuffer);
glBindRenderbuffer(GL_RENDERBUFFER, _depth_renderbuffer); glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, _depth_renderbuffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, _width, _height); glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT24, _width, _height);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT,
GL_RENDERBUFFER, _depth_renderbuffer); GL_RENDERBUFFER_EXT, _depth_renderbuffer);
if(glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE) if(glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT) == GL_FRAMEBUFFER_COMPLETE_EXT)
return true; return true;
glBindFramebuffer(GL_FRAMEBUFFER, 0); glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
return false; return false;
} }
@ -70,7 +70,7 @@ uint8_t *GLOffscreen::end() {
for(int i = 0; i < _height; i++) for(int i = 0; i < _height; i++)
memcpy(&_pixels[_width * i], &_pixels_inv[_width * (_height - i - 1)], _width * 4); 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; return (uint8_t*) _pixels;
} }