made Framebuffer Volatile and fixed a few bugs

This commit is contained in:
Bill Meltsner
2010-08-28 13:02:28 -05:00
parent ee3b74e66d
commit 769842ce6e
2 changed files with 23 additions and 8 deletions
+18 -7
View File
@@ -99,9 +99,9 @@ namespace {
} }
virtual void deleteFBO(GLuint framebuffer, GLuint depthbuffer, GLuint img) virtual void deleteFBO(GLuint framebuffer, GLuint depthbuffer, GLuint img)
{ {
glDeleteTextures(1, &framebuffer); glDeleteTextures(1, &img);
glDeleteRenderbuffers(1, &depthbuffer); glDeleteRenderbuffers(1, &depthbuffer);
glDeleteFramebuffers(1, &img); glDeleteFramebuffers(1, &framebuffer);
} }
virtual void bindFBO(GLuint framebuffer) virtual void bindFBO(GLuint framebuffer)
@@ -117,7 +117,7 @@ namespace {
{ {
// generate depth buffer // generate depth buffer
glGenRenderbuffersEXT(1, &depthbuffer); glGenRenderbuffersEXT(1, &depthbuffer);
glBindRenderbuffer(GL_RENDERBUFFER_EXT, depthbuffer); glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, depthbuffer);
glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT16, width, height); glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT16, width, height);
glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0); glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0);
@@ -146,9 +146,9 @@ namespace {
virtual void deleteFBO(GLuint framebuffer, GLuint depthbuffer, GLuint img) virtual void deleteFBO(GLuint framebuffer, GLuint depthbuffer, GLuint img)
{ {
glDeleteTextures(1, &framebuffer); glDeleteTextures(1, &img);
glDeleteRenderbuffersEXT(1, &depthbuffer); glDeleteRenderbuffersEXT(1, &depthbuffer);
glDeleteFramebuffersEXT(1, &img); glDeleteFramebuffersEXT(1, &framebuffer);
} }
virtual void bindFBO(GLuint framebuffer) virtual void bindFBO(GLuint framebuffer)
@@ -205,7 +205,7 @@ namespace opengl
} }
status = strategy->createFBO(fbo, depthbuffer, img, width, height); loadVolatile();
} }
Framebuffer::~Framebuffer() Framebuffer::~Framebuffer()
@@ -214,7 +214,7 @@ namespace opengl
if (current == this) if (current == this)
stopGrab(); stopGrab();
strategy->deleteFBO(fbo, depthbuffer, img); unloadVolatile();
} }
void Framebuffer::bindDefaultBuffer() void Framebuffer::bindDefaultBuffer()
@@ -308,6 +308,17 @@ namespace opengl
return img; return img;
} }
bool Framebuffer::loadVolatile()
{
status = strategy->createFBO(fbo, depthbuffer, img, width, height);
return (status == GL_FRAMEBUFFER_COMPLETE);
}
void Framebuffer::unloadVolatile()
{
strategy->deleteFBO(fbo, depthbuffer, img);
}
} // opengl } // opengl
} // graphics } // graphics
} // love } // love
+5 -1
View File
@@ -2,6 +2,7 @@
#define LOVE_GRAPHICS_FRAMEBUFFER_H #define LOVE_GRAPHICS_FRAMEBUFFER_H
#include <graphics/Drawable.h> #include <graphics/Drawable.h>
#include <graphics/Volatile.h>
#include <image/Image.h> #include <image/Image.h>
#include <image/ImageData.h> #include <image/ImageData.h>
#include <common/math.h> #include <common/math.h>
@@ -15,7 +16,7 @@ namespace graphics
namespace opengl namespace opengl
{ {
class Framebuffer : public Drawable class Framebuffer : public Drawable, public Volatile
{ {
public: public:
Framebuffer(int width, int height); Framebuffer(int width, int height);
@@ -32,6 +33,9 @@ namespace opengl
virtual void draw(float x, float y, float angle, float sx, float sy, float ox, float oy) const; virtual void draw(float x, float y, float angle, float sx, float sy, float ox, float oy) const;
love::image::ImageData * getImageData(love::image::Image * image); love::image::ImageData * getImageData(love::image::Image * image);
bool loadVolatile();
void unloadVolatile();
private: private:
GLsizei width; GLsizei width;
GLsizei height; GLsizei height;