2008-02-03 18:59:47 -05:00
|
|
|
! Copyright (C) 2008 Joe Groff.
|
|
|
|
! See http://factorcode.org/license.txt for BSD license.
|
|
|
|
USING: kernel opengl.gl alien.c-types continuations namespaces
|
2010-12-25 19:54:45 -05:00
|
|
|
assocs alien alien.data alien.strings libc opengl math sequences
|
|
|
|
combinators macros arrays io.encodings.ascii fry
|
|
|
|
specialized-arrays destructors accessors ;
|
2009-09-09 23:33:34 -04:00
|
|
|
SPECIALIZED-ARRAY: uint
|
2008-02-03 18:59:47 -05:00
|
|
|
IN: opengl.shaders
|
|
|
|
|
|
|
|
: with-gl-shader-source-ptr ( string quot -- )
|
2010-10-25 16:54:42 -04:00
|
|
|
swap ascii malloc-string [ void* <ref> swap call ] keep free ; inline
|
2008-02-03 18:59:47 -05:00
|
|
|
|
|
|
|
: <gl-shader> ( source kind -- shader )
|
|
|
|
glCreateShader dup rot
|
|
|
|
[ 1 swap f glShaderSource ] with-gl-shader-source-ptr
|
|
|
|
[ glCompileShader ] keep
|
|
|
|
gl-error ;
|
|
|
|
|
|
|
|
: (gl-shader?) ( object -- ? )
|
|
|
|
dup integer? [ glIsShader c-bool> ] [ drop f ] if ;
|
|
|
|
|
|
|
|
: gl-shader-get-int ( shader enum -- value )
|
2010-07-16 17:32:05 -04:00
|
|
|
{ int } [ glGetShaderiv ] with-out-parameters ;
|
2008-02-03 18:59:47 -05:00
|
|
|
|
|
|
|
: gl-shader-ok? ( shader -- ? )
|
|
|
|
GL_COMPILE_STATUS gl-shader-get-int c-bool> ;
|
|
|
|
|
|
|
|
: <vertex-shader> ( source -- vertex-shader )
|
|
|
|
GL_VERTEX_SHADER <gl-shader> ; inline
|
|
|
|
|
|
|
|
: (vertex-shader?) ( object -- ? )
|
|
|
|
dup (gl-shader?)
|
|
|
|
[ GL_SHADER_TYPE gl-shader-get-int GL_VERTEX_SHADER = ]
|
|
|
|
[ drop f ] if ;
|
|
|
|
|
|
|
|
: <fragment-shader> ( source -- fragment-shader )
|
|
|
|
GL_FRAGMENT_SHADER <gl-shader> ; inline
|
|
|
|
|
|
|
|
: (fragment-shader?) ( object -- ? )
|
|
|
|
dup (gl-shader?)
|
|
|
|
[ GL_SHADER_TYPE gl-shader-get-int GL_FRAGMENT_SHADER = ]
|
|
|
|
[ drop f ] if ;
|
|
|
|
|
|
|
|
: gl-shader-info-log-length ( shader -- log-length )
|
|
|
|
GL_INFO_LOG_LENGTH gl-shader-get-int ; inline
|
|
|
|
|
|
|
|
: gl-shader-info-log ( shader -- log )
|
|
|
|
dup gl-shader-info-log-length dup [
|
2008-12-02 22:51:21 -05:00
|
|
|
1 calloc &free
|
2010-10-20 18:42:53 -04:00
|
|
|
[ 0 int <ref> swap glGetShaderInfoLog ] keep
|
2008-04-20 06:15:46 -04:00
|
|
|
ascii alien>string
|
2008-12-02 22:51:21 -05:00
|
|
|
] with-destructors ;
|
2008-02-03 18:59:47 -05:00
|
|
|
|
2008-03-11 22:01:39 -04:00
|
|
|
: check-gl-shader ( shader -- shader )
|
2008-02-03 18:59:47 -05:00
|
|
|
dup gl-shader-ok? [ dup gl-shader-info-log throw ] unless ;
|
|
|
|
|
|
|
|
: delete-gl-shader ( shader -- ) glDeleteShader ; inline
|
|
|
|
|
2008-03-26 19:23:19 -04:00
|
|
|
PREDICATE: gl-shader < integer (gl-shader?) ;
|
|
|
|
PREDICATE: vertex-shader < gl-shader (vertex-shader?) ;
|
|
|
|
PREDICATE: fragment-shader < gl-shader (fragment-shader?) ;
|
2008-02-03 18:59:47 -05:00
|
|
|
|
|
|
|
! Programs
|
|
|
|
|
2009-07-25 22:19:56 -04:00
|
|
|
: (gl-program) ( shaders quot: ( gl-program -- ) -- program )
|
2015-06-29 19:43:15 -04:00
|
|
|
glCreateProgram
|
2009-06-16 19:14:22 -04:00
|
|
|
[
|
|
|
|
[ swap [ glAttachShader ] with each ]
|
2009-07-25 22:19:56 -04:00
|
|
|
[ swap call ] bi-curry bi*
|
|
|
|
] [ glLinkProgram ] [ ] tri gl-error ; inline
|
|
|
|
|
|
|
|
: <mrt-gl-program> ( shaders frag-data-locations -- program )
|
|
|
|
[ [ first2 swap glBindFragDataLocation ] with each ] curry (gl-program) ;
|
2009-06-16 19:14:22 -04:00
|
|
|
|
2008-02-03 18:59:47 -05:00
|
|
|
: <gl-program> ( shaders -- program )
|
2009-07-25 22:19:56 -04:00
|
|
|
[ drop ] (gl-program) ;
|
2015-06-29 19:43:15 -04:00
|
|
|
|
2008-02-03 18:59:47 -05:00
|
|
|
: (gl-program?) ( object -- ? )
|
|
|
|
dup integer? [ glIsProgram c-bool> ] [ drop f ] if ;
|
|
|
|
|
|
|
|
: gl-program-get-int ( program enum -- value )
|
2010-07-16 17:32:05 -04:00
|
|
|
{ int } [ glGetProgramiv ] with-out-parameters ;
|
2008-02-03 18:59:47 -05:00
|
|
|
|
|
|
|
: gl-program-ok? ( program -- ? )
|
|
|
|
GL_LINK_STATUS gl-program-get-int c-bool> ;
|
|
|
|
|
|
|
|
: gl-program-info-log-length ( program -- log-length )
|
|
|
|
GL_INFO_LOG_LENGTH gl-program-get-int ; inline
|
|
|
|
|
|
|
|
: gl-program-info-log ( program -- log )
|
|
|
|
dup gl-program-info-log-length dup [
|
2008-12-02 22:51:21 -05:00
|
|
|
1 calloc &free
|
2010-10-20 18:42:53 -04:00
|
|
|
[ 0 int <ref> swap glGetProgramInfoLog ] keep
|
2008-04-20 06:15:46 -04:00
|
|
|
ascii alien>string
|
2008-12-02 22:51:21 -05:00
|
|
|
] with-destructors ;
|
2008-02-03 18:59:47 -05:00
|
|
|
|
2008-03-11 22:01:39 -04:00
|
|
|
: check-gl-program ( program -- program )
|
2008-02-03 18:59:47 -05:00
|
|
|
dup gl-program-ok? [ dup gl-program-info-log throw ] unless ;
|
|
|
|
|
|
|
|
: gl-program-shaders-length ( program -- shaders-length )
|
|
|
|
GL_ATTACHED_SHADERS gl-program-get-int ; inline
|
|
|
|
|
2009-05-04 16:15:36 -04:00
|
|
|
! On some macosx-x86-64 graphics drivers, glGetAttachedShaders tries to treat the
|
|
|
|
! shaders parameter as a ulonglong array rather than a GLuint array as documented.
|
|
|
|
! We hack around this by allocating a buffer twice the size and sifting out the zero
|
|
|
|
! values
|
|
|
|
|
2008-02-03 18:59:47 -05:00
|
|
|
: gl-program-shaders ( program -- shaders )
|
2009-05-04 16:15:36 -04:00
|
|
|
dup gl-program-shaders-length 2 *
|
2010-10-20 18:42:53 -04:00
|
|
|
0 int <ref>
|
2011-09-25 14:49:27 -04:00
|
|
|
over uint <c-array>
|
2015-05-12 21:50:34 -04:00
|
|
|
[ glGetAttachedShaders ] keep [ zero? ] reject ;
|
2008-02-03 18:59:47 -05:00
|
|
|
|
|
|
|
: delete-gl-program-only ( program -- )
|
|
|
|
glDeleteProgram ; inline
|
|
|
|
|
|
|
|
: detach-gl-program-shader ( program shader -- )
|
|
|
|
glDetachShader ; inline
|
|
|
|
|
|
|
|
: delete-gl-program ( program -- )
|
|
|
|
dup gl-program-shaders [
|
|
|
|
2dup detach-gl-program-shader delete-gl-shader
|
|
|
|
] each delete-gl-program-only ;
|
|
|
|
|
2008-08-03 20:41:21 -04:00
|
|
|
: with-gl-program ( program quot -- )
|
|
|
|
over glUseProgram [ 0 glUseProgram ] [ ] cleanup ; inline
|
2008-02-03 18:59:47 -05:00
|
|
|
|
2008-03-26 19:23:19 -04:00
|
|
|
PREDICATE: gl-program < integer (gl-program?) ;
|
2008-02-03 18:59:47 -05:00
|
|
|
|
|
|
|
: <simple-gl-program> ( vertex-shader-source fragment-shader-source -- program )
|
2008-12-17 20:17:37 -05:00
|
|
|
[ <vertex-shader> check-gl-shader ]
|
|
|
|
[ <fragment-shader> check-gl-shader ] bi*
|
2008-02-03 18:59:47 -05:00
|
|
|
2array <gl-program> check-gl-program ;
|