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>
|
||||
//-----------------------------------------------------------------------------
|
||||
#include "gloffscreen.h"
|
||||
|
||||
#include <cstring>
|
||||
#include <cstdio>
|
||||
#include <cstdlib>
|
||||
|
||||
#include <GL/glew.h>
|
||||
|
||||
#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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user