| 
									
										
										
										
											2008-02-03 18:59:47 -05:00
										 |  |  | ! Copyright (C) 2008 Joe Groff. | 
					
						
							|  |  |  | ! See http://factorcode.org/license.txt for BSD license. | 
					
						
							|  |  |  | USING: opengl opengl.gl combinators continuations kernel | 
					
						
							|  |  |  | alien.c-types ;
 | 
					
						
							|  |  |  | IN: opengl.framebuffers | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : gen-framebuffer ( -- id )
 | 
					
						
							| 
									
										
										
										
											2009-06-24 18:59:25 -04:00
										 |  |  |     [ glGenFramebuffers ] (gen-gl-object) ;
 | 
					
						
							| 
									
										
										
										
											2008-02-03 18:59:47 -05:00
										 |  |  | : gen-renderbuffer ( -- id )
 | 
					
						
							| 
									
										
										
										
											2009-06-24 18:59:25 -04:00
										 |  |  |     [ glGenRenderbuffers ] (gen-gl-object) ;
 | 
					
						
							| 
									
										
										
										
											2008-02-03 18:59:47 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | : delete-framebuffer ( id -- )
 | 
					
						
							| 
									
										
										
										
											2009-06-24 18:59:25 -04:00
										 |  |  |     [ glDeleteFramebuffers ] (delete-gl-object) ;
 | 
					
						
							| 
									
										
										
										
											2008-02-03 18:59:47 -05:00
										 |  |  | : delete-renderbuffer ( id -- )
 | 
					
						
							| 
									
										
										
										
											2009-06-24 18:59:25 -04:00
										 |  |  |     [ glDeleteRenderbuffers ] (delete-gl-object) ;
 | 
					
						
							| 
									
										
										
										
											2008-02-03 18:59:47 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | : framebuffer-incomplete? ( -- status/f )
 | 
					
						
							| 
									
										
										
										
											2009-06-24 18:59:25 -04:00
										 |  |  |     GL_DRAW_FRAMEBUFFER glCheckFramebufferStatus | 
					
						
							|  |  |  |     dup GL_FRAMEBUFFER_COMPLETE = f rot ? ;
 | 
					
						
							| 
									
										
										
										
											2008-02-03 18:59:47 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | : framebuffer-error ( status -- * )
 | 
					
						
							|  |  |  |     {  | 
					
						
							| 
									
										
										
										
											2009-06-24 18:59:25 -04:00
										 |  |  |         { GL_FRAMEBUFFER_COMPLETE [ "framebuffer complete" ] } | 
					
						
							|  |  |  |         { GL_FRAMEBUFFER_UNSUPPORTED [ "framebuffer configuration unsupported" ] } | 
					
						
							|  |  |  |         { GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT [ "framebuffer incomplete (incomplete attachment)" ] } | 
					
						
							|  |  |  |         { GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT [ "framebuffer incomplete (missing attachment)" ] } | 
					
						
							| 
									
										
										
										
											2008-02-03 18:59:47 -05:00
										 |  |  |         { GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT [ "framebuffer incomplete (dimension mismatch)" ] } | 
					
						
							|  |  |  |         { GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT [ "framebuffer incomplete (format mismatch)" ] } | 
					
						
							| 
									
										
										
										
											2009-06-24 18:59:25 -04:00
										 |  |  |         { GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER [ "framebuffer incomplete (draw buffer(s) have no attachment)" ] } | 
					
						
							|  |  |  |         { GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER [ "framebuffer incomplete (read buffer has no attachment)" ] } | 
					
						
							|  |  |  |         { GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE [ "framebuffer incomplete (multisample counts don't match)" ] } | 
					
						
							| 
									
										
										
										
											2008-02-03 18:59:47 -05:00
										 |  |  |         [ drop gl-error "unknown framebuffer error" ] | 
					
						
							|  |  |  |     } case throw ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : check-framebuffer ( -- )
 | 
					
						
							|  |  |  |     framebuffer-incomplete? [ framebuffer-error ] when* ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : with-framebuffer ( id quot -- )
 | 
					
						
							| 
									
										
										
										
											2009-06-24 18:59:25 -04:00
										 |  |  |     [ GL_DRAW_FRAMEBUFFER swap glBindFramebuffer ] dip
 | 
					
						
							|  |  |  |     [ GL_DRAW_FRAMEBUFFER 0 glBindFramebuffer ] [ ] cleanup ; inline
 | 
					
						
							| 
									
										
										
										
											2008-02-03 18:59:47 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-15 12:00:39 -04:00
										 |  |  | : with-draw-read-framebuffers ( draw-id read-id quot -- )
 | 
					
						
							|  |  |  |     [ | 
					
						
							| 
									
										
										
										
											2009-06-24 18:59:25 -04:00
										 |  |  |         [ GL_DRAW_FRAMEBUFFER swap glBindFramebuffer ] | 
					
						
							|  |  |  |         [ GL_READ_FRAMEBUFFER swap glBindFramebuffer ] bi*
 | 
					
						
							| 
									
										
										
										
											2009-05-15 12:00:39 -04:00
										 |  |  |     ] dip
 | 
					
						
							|  |  |  |     [  | 
					
						
							| 
									
										
										
										
											2009-06-24 18:59:25 -04:00
										 |  |  |         GL_DRAW_FRAMEBUFFER 0 glBindFramebuffer | 
					
						
							|  |  |  |         GL_READ_FRAMEBUFFER 0 glBindFramebuffer | 
					
						
							| 
									
										
										
										
											2009-05-15 12:00:39 -04:00
										 |  |  |     ] [ ] cleanup ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-02-03 18:59:47 -05:00
										 |  |  | : framebuffer-attachment ( attachment -- id )
 | 
					
						
							| 
									
										
										
										
											2009-06-24 18:59:25 -04:00
										 |  |  |     GL_FRAMEBUFFER swap GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME | 
					
						
							|  |  |  |     0 <uint> [ glGetFramebufferAttachmentParameteriv ] keep *uint ;
 |