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:
parent
e27c6b56c3
commit
88e4163970
@ -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;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user