1 ! Copyright (C) 2008 Joe Groff.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: opengl opengl.gl combinators continuations kernel
5 IN: opengl.framebuffers
7 : gen-framebuffer ( -- id )
8 [ glGenFramebuffersEXT ] (gen-gl-object) ;
9 : gen-renderbuffer ( -- id )
10 [ glGenRenderbuffersEXT ] (gen-gl-object) ;
12 : delete-framebuffer ( id -- )
13 [ glDeleteFramebuffersEXT ] (delete-gl-object) ;
14 : delete-renderbuffer ( id -- )
15 [ glDeleteRenderbuffersEXT ] (delete-gl-object) ;
17 : framebuffer-incomplete? ( -- status/f )
18 GL_FRAMEBUFFER_EXT glCheckFramebufferStatusEXT
19 dup GL_FRAMEBUFFER_COMPLETE_EXT = f rot ? ;
21 : framebuffer-error ( status -- * )
23 { GL_FRAMEBUFFER_COMPLETE_EXT [ "framebuffer complete" ] }
24 { GL_FRAMEBUFFER_UNSUPPORTED_EXT [ "framebuffer configuration unsupported" ] }
25 { GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT [ "framebuffer incomplete (incomplete attachment)" ] }
26 { GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT [ "framebuffer incomplete (missing attachment)" ] }
27 { GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT [ "framebuffer incomplete (dimension mismatch)" ] }
28 { GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT [ "framebuffer incomplete (format mismatch)" ] }
29 { GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT [ "framebuffer incomplete (draw buffer(s) have no attachment)" ] }
30 { GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT [ "framebuffer incomplete (read buffer has no attachment)" ] }
31 { GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT [ "framebuffer incomplete (multisample counts don't match)" ] }
32 [ drop gl-error "unknown framebuffer error" ]
35 : check-framebuffer ( -- )
36 framebuffer-incomplete? [ framebuffer-error ] when* ;
38 : with-framebuffer ( id quot -- )
39 [ GL_FRAMEBUFFER_EXT swap glBindFramebufferEXT ] dip
40 [ GL_FRAMEBUFFER_EXT 0 glBindFramebufferEXT ] [ ] cleanup ; inline
42 : with-draw-read-framebuffers ( draw-id read-id quot -- )
44 [ GL_DRAW_FRAMEBUFFER_EXT swap glBindFramebufferEXT ]
45 [ GL_READ_FRAMEBUFFER_EXT swap glBindFramebufferEXT ] bi*
48 GL_DRAW_FRAMEBUFFER_EXT 0 glBindFramebufferEXT
49 GL_READ_FRAMEBUFFER_EXT 0 glBindFramebufferEXT
50 ] [ ] cleanup ; inline
52 : framebuffer-attachment ( attachment -- id )
53 GL_FRAMEBUFFER_EXT swap GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT
54 0 <uint> [ glGetFramebufferAttachmentParameterivEXT ] keep *uint ;