Max 5 API Reference
00001 /* 00002 * Copyright 2001-2005 - Cycling '74 00003 * Derek Gerstmann - derek@cycling74.com 00004 * 00005 * Struct and associated methods for maintaining an OpenGL 00006 * renderbuffer object (RBO) which can be attached to a framebuffer 00007 * object (FBO) for performing a direct readback via an offscreen 00008 * framebuffer. 00009 * 00010 * Valid internal formats are any of the following: 00011 * 00012 * - Any format starting with: 00013 * RGB, RGBA, DEPTH_COMPONENT, (RGBA8, etc) 00014 * 00015 * - Any of the following stencil buffer formats (not working on NV): 00016 * STENCIL_INDEX1_EXT 00017 * STENCIL_INDEX4_EXT 00018 * STENCIL_INDEX8_EXT 00019 * STENCIL_INDEX16_EXT 00020 */ 00021 00022 /****************************************************************************/ 00023 00024 #include "jit.gl.rbo.h" 00025 00026 /****************************************************************************/ 00027 00028 t_jit_gl_rbo *jit_gl_rbo_new() 00029 { 00030 t_jit_gl_rbo *x = NULL; 00031 00032 if(x = jit_getbytes(sizeof(t_jit_gl_rbo))) 00033 { 00034 jit_gl_rbo_reset(x); 00035 } 00036 00037 return x; 00038 } 00039 00040 void jit_gl_rbo_free(t_jit_gl_rbo *x) 00041 { 00042 if(x) 00043 { 00044 jit_gl_rbo_destroy(x); 00045 jit_freebytes(x, sizeof(t_jit_gl_rbo)); 00046 } 00047 } 00048 00049 t_jit_err jit_gl_rbo_create(t_jit_gl_rbo *x, GLenum internal, GLint width, GLint height) 00050 { 00051 GLuint id; 00052 GLint bound; 00053 GLint maxw, maxh; 00054 t_jit_err err; 00055 00056 // get max renderbuffer size 00057 err = jit_gl_rbo_query_max_size(x, &maxw, &maxh); 00058 if(err) return err; 00059 00060 // verify requested size is within system limits 00061 if (width > maxw || height > maxh ) 00062 { 00063 jit_object_error((t_object *)x,"jit.gl.rbo: unable to create renderbuffer, requested size exceeds system capabilites: [%d,%d] > [%d,%d]", width, height, maxw, maxh); 00064 return JIT_ERR_GENERIC; 00065 } 00066 00067 // generate a new renderbuffer 00068 if(!x->id) 00069 { 00070 glGenRenderbuffersEXT(1, &id); 00071 x->id = id; 00072 } 00073 00074 // get current renderbuffer id 00075 glGetIntegerv( GL_RENDERBUFFER_BINDING_EXT, &bound ); 00076 00077 // only bind if renderbuffer is not active 00078 if (x->id != bound) 00079 { 00080 err = jit_gl_rbo_bind(x); 00081 if(err) return err; 00082 } 00083 00084 // allocate renderbuffer storage 00085 glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, internal, width, height ); 00086 00087 // only unbind if renderbuffer is not active 00088 if (x->id != bound) 00089 { 00090 err = jit_gl_rbo_unbind(x); 00091 if(err) return err; 00092 } 00093 00094 // save data members 00095 x->width = width; 00096 x->height = height; 00097 x->internal = internal; 00098 return JIT_ERR_NONE; 00099 } 00100 00101 t_jit_err jit_gl_rbo_bind(t_jit_gl_rbo *x) 00102 { 00103 GLint id; 00104 00105 if(!x) 00106 return JIT_ERR_INVALID_PTR; 00107 00108 // bind the renderbuffer 00109 if(x->id) 00110 { 00111 glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, x->id); 00112 jit_gl_report_error("jit.gl: error binding renderbuffer object!"); 00113 } 00114 return JIT_ERR_NONE; 00115 } 00116 00117 t_jit_err jit_gl_rbo_unbind(t_jit_gl_rbo *x) 00118 { 00119 if(!x) 00120 return JIT_ERR_INVALID_PTR; 00121 00122 if(x->id) 00123 { 00124 glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0); 00125 jit_gl_report_error("jit.gl.rbo: error unbinding renderbuffer object!"); 00126 } 00127 return JIT_ERR_NONE; 00128 } 00129 00130 t_jit_err jit_gl_rbo_destroy(t_jit_gl_rbo *x) 00131 { 00132 GLuint id; 00133 00134 if(!x) 00135 return JIT_ERR_INVALID_PTR; 00136 00137 if(x->id) 00138 { 00139 id = x->id; 00140 glDeleteRenderbuffersEXT(1, &id); 00141 x->id = 0; 00142 } 00143 00144 jit_gl_rbo_reset(x); 00145 return JIT_ERR_NONE; 00146 } 00147 00148 t_jit_err jit_gl_rbo_reset(t_jit_gl_rbo *x) 00149 { 00150 if(!x) 00151 return JIT_ERR_INVALID_PTR; 00152 00153 x->id = 0; 00154 x->width = 0; 00155 x->height = 0; 00156 x->internal = -1; 00157 return JIT_ERR_NONE; 00158 } 00159 00160 t_jit_err jit_gl_rbo_query_max_size(t_jit_gl_rbo *x, GLint *width, GLint *height) 00161 { 00162 GLint max = 0; 00163 glGetIntegerv( GL_MAX_RENDERBUFFER_SIZE_EXT, &max ); 00164 00165 *width = max; 00166 *height = max; 00167 00168 return JIT_ERR_NONE; 00169 } 00170 /****************************************************************************/ 00171
Copyright © 2008, Cycling '74