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
|
2010-05-23 03:07:47 -04:00
|
|
|
alien.c-types alien.data ;
|
2008-02-03 18:59:47 -05:00
|
|
|
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 -- * )
|
2015-06-29 19:43:15 -04:00
|
|
|
{
|
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
|
2015-06-29 19:43:15 -04:00
|
|
|
[
|
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
|
2010-07-16 17:32:05 -04:00
|
|
|
{ uint } [ glGetFramebufferAttachmentParameteriv ] with-out-parameters ;
|