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 (RB) 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.renderbuffer.h" 00025 00026 /****************************************************************************/ 00027 00028 t_jit_gl_renderbuffer *jit_gl_renderbuffer_new() 00029 { 00030 t_jit_gl_renderbuffer *x = NULL; 00031 00032 if(x = jit_getbytes(sizeof(t_jit_gl_renderbuffer))) 00033 { 00034 jit_gl_renderbuffer_reset(x); 00035 } 00036 00037 return x; 00038 } 00039 00040 void jit_gl_renderbuffer_free(t_jit_gl_renderbuffer *x) 00041 { 00042 if(x) 00043 { 00044 jit_gl_renderbuffer_destroy(x); 00045 jit_freebytes(x, sizeof(t_jit_gl_renderbuffer)); 00046 } 00047 } 00048 00049 t_jit_err jit_gl_renderbuffer_create(t_jit_gl_renderbuffer *x, GLenum internal, GLint width, GLint height) 00050 { 00051 GLuint id; 00052 GLint maxw, maxh; 00053 t_jit_err err; 00054 00055 // get max renderbuffer size 00056 err = jit_gl_renderbuffer_query_max_size(x, &maxw, &maxh); 00057 if(err) return err; 00058 00059 // verify requested size is within system limits 00060 if (width > maxw || height > maxh ) 00061 { 00062 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); 00063 return JIT_ERR_GENERIC; 00064 } 00065 00066 // destroy existing renderbuffer 00067 err = jit_gl_renderbuffer_destroy(x); 00068 if(err) return err; 00069 00070 // generate a new renderbuffer 00071 glGenRenderbuffersEXT(1, &id); 00072 x->id = id; 00073 00074 // bind renderbuffer 00075 err = jit_gl_renderbuffer_bind(x); 00076 if(err) return err; 00077 00078 // allocate renderbuffer storage 00079 glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, internal, width, height ); 00080 00081 // unbind renderbuffer 00082 err = jit_gl_renderbuffer_unbind(x); 00083 if(err) return err; 00084 00085 // save data members 00086 x->width = width; 00087 x->height = height; 00088 x->internal = internal; 00089 return JIT_ERR_NONE; 00090 } 00091 00092 t_jit_err jit_gl_renderbuffer_bind(t_jit_gl_renderbuffer *x) 00093 { 00094 GLint id; 00095 00096 if(!x) 00097 return JIT_ERR_INVALID_PTR; 00098 00099 // bind the renderbuffer 00100 glGetIntegerv( GL_RENDERBUFFER_BINDING_EXT, &id ); 00101 if(x->id != id) 00102 { 00103 glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, x->id); 00104 jit_gl_report_error("jit.gl: error binding renderbuffer object!"); 00105 } 00106 return JIT_ERR_NONE; 00107 } 00108 00109 t_jit_err jit_gl_renderbuffer_unbind(t_jit_gl_renderbuffer *x) 00110 { 00111 if(!x) 00112 return JIT_ERR_INVALID_PTR; 00113 00114 glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0); 00115 return JIT_ERR_NONE; 00116 } 00117 00118 t_jit_err jit_gl_renderbuffer_destroy(t_jit_gl_renderbuffer *x) 00119 { 00120 GLuint id; 00121 00122 if(!x) 00123 return JIT_ERR_INVALID_PTR; 00124 00125 glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0); 00126 00127 if(x->id) 00128 { 00129 id = x->id; 00130 glDeleteRenderbuffersEXT(1, &id); 00131 x->id = 0; 00132 } 00133 00134 jit_gl_renderbuffer_reset(x); 00135 return JIT_ERR_NONE; 00136 } 00137 00138 t_jit_err jit_gl_renderbuffer_reset(t_jit_gl_renderbuffer *x) 00139 { 00140 if(!x) 00141 return JIT_ERR_INVALID_PTR; 00142 00143 x->id = 0; 00144 x->width = 0; 00145 x->height = 0; 00146 x->internal = -1; 00147 return JIT_ERR_NONE; 00148 } 00149 00150 t_jit_err jit_gl_renderbuffer_query_max_size(t_jit_gl_renderbuffer *x, GLint *width, GLint *height) 00151 { 00152 GLint max = 0; 00153 glGetIntegerv( GL_MAX_RENDERBUFFER_SIZE_EXT, &max ); 00154 00155 *width = max; 00156 *height = max; 00157 00158 return JIT_ERR_NONE; 00159 } 00160 00161 t_jit_err jit_gl_renderbuffer_query_width(t_jit_gl_renderbuffer *x, GLint *value) 00162 { 00163 int width; 00164 t_jit_err err = JIT_ERR_NONE; 00165 00166 // bind renderbuffer 00167 jit_gl_renderbuffer_bind(x); 00168 if(err) return err; 00169 00170 //perform width query 00171 glGetRenderbufferParameterivEXT(GL_RENDERBUFFER_EXT, GL_RENDERBUFFER_WIDTH_EXT, (long *)&width); 00172 00173 // unbind renderbuffer 00174 err = jit_gl_renderbuffer_unbind(x); 00175 if(err) return err; 00176 00177 *value = width; 00178 return JIT_ERR_NONE; 00179 } 00180 00181 t_jit_err jit_gl_renderbuffer_query_height(t_jit_gl_renderbuffer *x, GLint *value) 00182 { 00183 int height; 00184 t_jit_err err = JIT_ERR_NONE; 00185 00186 // bind renderbuffer 00187 jit_gl_renderbuffer_bind(x); 00188 if(err) return err; 00189 00190 //perform width query 00191 glGetRenderbufferParameterivEXT(GL_RENDERBUFFER_EXT, GL_RENDERBUFFER_HEIGHT_EXT, (long *)&height); 00192 00193 // unbind renderbuffer 00194 err = jit_gl_renderbuffer_unbind(x); 00195 if(err) return err; 00196 00197 *value = height; 00198 return JIT_ERR_NONE; 00199 } 00200 00201 t_jit_err jit_gl_renderbuffer_query_internal_format(t_jit_gl_renderbuffer *x, GLint *value) 00202 { 00203 int format; 00204 t_jit_err err = JIT_ERR_NONE; 00205 00206 // bind renderbuffer 00207 jit_gl_renderbuffer_bind(x); 00208 if(err) return err; 00209 00210 //perform width query 00211 glGetRenderbufferParameterivEXT(GL_RENDERBUFFER_EXT, GL_RENDERBUFFER_INTERNAL_FORMAT_EXT, (long *)&format); 00212 00213 // unbind renderbuffer 00214 err = jit_gl_renderbuffer_unbind(x); 00215 if(err) return err; 00216 00217 *value = format; 00218 return JIT_ERR_NONE; 00219 } 00220 /****************************************************************************/
Copyright © 2008, Cycling '74