better error check (not tested)
fob has a new ctor (from context and stuff)
This commit is contained in:
parent
a47d652647
commit
3b94500617
4 changed files with 77 additions and 10 deletions
|
@ -9,6 +9,7 @@
|
||||||
/* Begin PBXBuildFile section */
|
/* Begin PBXBuildFile section */
|
||||||
425E9DF2140A74DA00A81A65 /* basic.h in Headers */ = {isa = PBXBuildFile; fileRef = 425E9DF1140A74DA00A81A65 /* basic.h */; };
|
425E9DF2140A74DA00A81A65 /* basic.h in Headers */ = {isa = PBXBuildFile; fileRef = 425E9DF1140A74DA00A81A65 /* basic.h */; };
|
||||||
425E9DF6140A774D00A81A65 /* basic.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 425E9DF5140A774D00A81A65 /* basic.cpp */; };
|
425E9DF6140A774D00A81A65 /* basic.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 425E9DF5140A774D00A81A65 /* basic.cpp */; };
|
||||||
|
425E9DF9140A7EB400A81A65 /* fbo.mm in Sources */ = {isa = PBXBuildFile; fileRef = 425E9DF8140A7EB400A81A65 /* fbo.mm */; };
|
||||||
42681369140A321800CBF943 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 42681368140A321800CBF943 /* Foundation.framework */; };
|
42681369140A321800CBF943 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 42681368140A321800CBF943 /* Foundation.framework */; };
|
||||||
4268136F140A321800CBF943 /* J.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4268136E140A321800CBF943 /* J.mm */; };
|
4268136F140A321800CBF943 /* J.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4268136E140A321800CBF943 /* J.mm */; };
|
||||||
42ED6A6B140A380000402F76 /* fbo.h in Headers */ = {isa = PBXBuildFile; fileRef = 42ED6A68140A380000402F76 /* fbo.h */; };
|
42ED6A6B140A380000402F76 /* fbo.h in Headers */ = {isa = PBXBuildFile; fileRef = 42ED6A68140A380000402F76 /* fbo.h */; };
|
||||||
|
@ -19,6 +20,7 @@
|
||||||
/* Begin PBXFileReference section */
|
/* Begin PBXFileReference section */
|
||||||
425E9DF1140A74DA00A81A65 /* basic.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = basic.h; sourceTree = "<group>"; };
|
425E9DF1140A74DA00A81A65 /* basic.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = basic.h; sourceTree = "<group>"; };
|
||||||
425E9DF5140A774D00A81A65 /* basic.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = basic.cpp; sourceTree = "<group>"; };
|
425E9DF5140A774D00A81A65 /* basic.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = basic.cpp; sourceTree = "<group>"; };
|
||||||
|
425E9DF8140A7EB400A81A65 /* fbo.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = fbo.mm; sourceTree = "<group>"; };
|
||||||
42681365140A321800CBF943 /* libJ.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libJ.a; sourceTree = BUILT_PRODUCTS_DIR; };
|
42681365140A321800CBF943 /* libJ.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libJ.a; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
42681368140A321800CBF943 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
|
42681368140A321800CBF943 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
|
||||||
4268136C140A321800CBF943 /* J-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "J-Prefix.pch"; sourceTree = "<group>"; };
|
4268136C140A321800CBF943 /* J-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "J-Prefix.pch"; sourceTree = "<group>"; };
|
||||||
|
@ -82,6 +84,7 @@
|
||||||
425E9DF1140A74DA00A81A65 /* basic.h */,
|
425E9DF1140A74DA00A81A65 /* basic.h */,
|
||||||
425E9DF5140A774D00A81A65 /* basic.cpp */,
|
425E9DF5140A774D00A81A65 /* basic.cpp */,
|
||||||
42ED6A68140A380000402F76 /* fbo.h */,
|
42ED6A68140A380000402F76 /* fbo.h */,
|
||||||
|
425E9DF8140A7EB400A81A65 /* fbo.mm */,
|
||||||
42ED6A69140A380000402F76 /* shader.h */,
|
42ED6A69140A380000402F76 /* shader.h */,
|
||||||
4268136D140A321800CBF943 /* J.h */,
|
4268136D140A321800CBF943 /* J.h */,
|
||||||
4268136E140A321800CBF943 /* J.mm */,
|
4268136E140A321800CBF943 /* J.mm */,
|
||||||
|
@ -164,6 +167,7 @@
|
||||||
files = (
|
files = (
|
||||||
4268136F140A321800CBF943 /* J.mm in Sources */,
|
4268136F140A321800CBF943 /* J.mm in Sources */,
|
||||||
425E9DF6140A774D00A81A65 /* basic.cpp in Sources */,
|
425E9DF6140A774D00A81A65 /* basic.cpp in Sources */,
|
||||||
|
425E9DF9140A7EB400A81A65 /* fbo.mm in Sources */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
|
|
16
J/basic.cpp
16
J/basic.cpp
|
@ -12,9 +12,19 @@ namespace J {
|
||||||
void check_error(){
|
void check_error(){
|
||||||
#if defined(DEBUG)
|
#if defined(DEBUG)
|
||||||
GLenum status = glGetError();
|
GLenum status = glGetError();
|
||||||
if(status != GL_NO_ERROR){
|
switch (status) {
|
||||||
throw std::runtime_error("GL Error: " + std::to_string(status));
|
case GL_NO_ERROR:
|
||||||
}
|
return;
|
||||||
|
#define c(x) case x: throw std::runtime_error("GL Error: "#x);
|
||||||
|
c(GL_INVALID_ENUM)
|
||||||
|
c(GL_INVALID_VALUE)
|
||||||
|
c(GL_INVALID_OPERATION)
|
||||||
|
c(GL_INVALID_FRAMEBUFFER_OPERATION)
|
||||||
|
c(GL_OUT_OF_MEMORY)
|
||||||
|
#undef c
|
||||||
|
default:
|
||||||
|
throw std::runtime_error("GL Error: UNKNOWN");
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
20
J/fbo.h
20
J/fbo.h
|
@ -16,6 +16,10 @@
|
||||||
|
|
||||||
#include "basic.h"
|
#include "basic.h"
|
||||||
|
|
||||||
|
@class EAGLContext;
|
||||||
|
@class CAEAGLLayer;
|
||||||
|
|
||||||
|
|
||||||
// TODO: more error checking in debug build.
|
// TODO: more error checking in debug build.
|
||||||
// TODO: make texture class? for easier switching between linear/nearest interpolation for example
|
// TODO: make texture class? for easier switching between linear/nearest interpolation for example
|
||||||
// NOTE: stencil attachment is not supported
|
// NOTE: stencil attachment is not supported
|
||||||
|
@ -32,6 +36,7 @@ public:
|
||||||
GLuint texture_id;
|
GLuint texture_id;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
// standard ctor, makes use of textures
|
||||||
fbo(int width, int height) : width(width), height(height), fbo_number(0), renderbuffers(), texture_id(0) {
|
fbo(int width, int height) : width(width), height(height), fbo_number(0), renderbuffers(), texture_id(0) {
|
||||||
glGenFramebuffers(1, &fbo_number);
|
glGenFramebuffers(1, &fbo_number);
|
||||||
bind();
|
bind();
|
||||||
|
@ -53,6 +58,10 @@ public:
|
||||||
|
|
||||||
unbind();
|
unbind();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ctor from EAGLContext, not using texture, so you cannot use it as lookup, only as renderer.
|
||||||
|
fbo(EAGLContext* context, CAEAGLLayer* layer);
|
||||||
|
|
||||||
~fbo() {
|
~fbo() {
|
||||||
end();
|
end();
|
||||||
|
|
||||||
|
@ -60,17 +69,18 @@ public:
|
||||||
|
|
||||||
for(RenderbuffersMap::const_iterator i = renderbuffers.begin(); i != renderbuffers.end(); ++i){
|
for(RenderbuffersMap::const_iterator i = renderbuffers.begin(); i != renderbuffers.end(); ++i){
|
||||||
RenderbuffersMap::value_type const & it = *i;
|
RenderbuffersMap::value_type const & it = *i;
|
||||||
glDeleteFramebuffers(1, &it.second);
|
glDeleteRenderbuffers(1, &it.second);
|
||||||
}
|
}
|
||||||
|
|
||||||
glDeleteTextures(1, &texture_id);
|
glDeleteTextures(1, &texture_id);
|
||||||
|
// NOTE: glDeleteTextures silently ignores 0's and names that do not correspond to existing textures.
|
||||||
}
|
}
|
||||||
|
|
||||||
void begin(){
|
void begin(){
|
||||||
bind();
|
bind();
|
||||||
// FIXME: this should be done, but also switching back should be done...
|
// FIXME: this should be done, but also switching back should be done...
|
||||||
//glPushAttrib(GL_VIEWPORT);
|
//glPushAttrib(GL_VIEWPORT);
|
||||||
//glViewport(0, 0, width, height);
|
glViewport(0, 0, width, height);
|
||||||
|
|
||||||
// NOTE: commented out, because we don't want fbo's to nest.
|
// NOTE: commented out, because we don't want fbo's to nest.
|
||||||
/*GLint savedFramebuffer = -1;
|
/*GLint savedFramebuffer = -1;
|
||||||
|
@ -80,11 +90,10 @@ public:
|
||||||
|
|
||||||
void end(){
|
void end(){
|
||||||
unbind();
|
unbind();
|
||||||
// FIXME: switch back to previous viewport.
|
// FIXME: switch back to previous viewport. See begin()
|
||||||
//glPopAttrib();
|
//glPopAttrib();
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
|
||||||
void bind(){
|
void bind(){
|
||||||
glBindFramebuffer(GL_FRAMEBUFFER, fbo_number);
|
glBindFramebuffer(GL_FRAMEBUFFER, fbo_number);
|
||||||
check_error();
|
check_error();
|
||||||
|
@ -94,6 +103,7 @@ private:
|
||||||
glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
void create_attach_renderbuffer(GLenum format, GLenum attachment_point) {
|
void create_attach_renderbuffer(GLenum format, GLenum attachment_point) {
|
||||||
GLuint buffer;
|
GLuint buffer;
|
||||||
glGenRenderbuffers(1, &buffer);
|
glGenRenderbuffers(1, &buffer);
|
||||||
|
|
43
J/fbo.mm
Normal file
43
J/fbo.mm
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
//
|
||||||
|
// fbo.mm
|
||||||
|
// J
|
||||||
|
//
|
||||||
|
// Created by Joshua Moerman on 8/28/11.
|
||||||
|
// Copyright 2011 Vadovas. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import "fbo.h"
|
||||||
|
|
||||||
|
#import <QuartzCore/QuartzCore.h>
|
||||||
|
|
||||||
|
namespace J {
|
||||||
|
fbo::fbo(EAGLContext* context, CAEAGLLayer* layer) : width(0), height(0), fbo_number(0), renderbuffers(), texture_id(0){
|
||||||
|
glGenFramebuffers(1, &fbo_number);
|
||||||
|
bind();
|
||||||
|
|
||||||
|
// much like create_attach_renderbuffer(), but it's not created, but given by the context.
|
||||||
|
{
|
||||||
|
GLuint buffer;
|
||||||
|
glGenRenderbuffers(1, &buffer);
|
||||||
|
glBindRenderbuffer(GL_RENDERBUFFER, buffer);
|
||||||
|
[context renderbufferStorage:GL_RENDERBUFFER fromDrawable:layer];
|
||||||
|
glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &width);
|
||||||
|
glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &height);
|
||||||
|
|
||||||
|
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, buffer);
|
||||||
|
|
||||||
|
renderbuffers[GL_COLOR_ATTACHMENT0] = buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
//this will cause a INVALID_OPERATION in bind().
|
||||||
|
//create_attach_renderbuffer(GL_DEPTH_COMPONENT16, GL_DEPTH_ATTACHMENT);
|
||||||
|
|
||||||
|
check_error();
|
||||||
|
check_status();
|
||||||
|
|
||||||
|
glClearColor(0.0, 0.0, 0.0, 0.0);
|
||||||
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||||
|
|
||||||
|
unbind();
|
||||||
|
}
|
||||||
|
}
|
Reference in a new issue