factor/basis/opengl/gl/extensions/extensions.factor

59 lines
1.8 KiB
Factor
Raw Normal View History

USING: alien alien.syntax alien.parser combinators
2008-11-29 16:21:12 -05:00
kernel parser sequences system words namespaces hashtables init
math arrays assocs continuations lexer fry locals vocabs.parser ;
2008-04-06 22:07:21 -04:00
IN: opengl.gl.extensions
2008-04-02 19:25:33 -04:00
ERROR: unknown-gl-platform ;
<< {
2008-04-02 19:25:33 -04:00
{ [ os windows? ] [ "opengl.gl.windows" ] }
{ [ os macosx? ] [ "opengl.gl.macosx" ] }
{ [ os unix? ] [ "opengl.gl.unix" ] }
2008-04-11 13:56:48 -04:00
[ unknown-gl-platform ]
} cond use-vocab >>
SYMBOL: +gl-function-number-counter+
SYMBOL: +gl-function-pointers+
: reset-gl-function-number-counter ( -- )
0 +gl-function-number-counter+ set-global ;
: reset-gl-function-pointers ( -- )
100 <hashtable> +gl-function-pointers+ set-global ;
2008-02-27 20:24:50 -05:00
[ reset-gl-function-pointers ] "opengl.gl" add-init-hook
reset-gl-function-pointers
reset-gl-function-number-counter
: gl-function-number ( -- n )
+gl-function-number-counter+ get-global
dup 1 + +gl-function-number-counter+ set-global ;
: gl-function-pointer ( names n -- funptr )
gl-function-context 2array dup +gl-function-pointers+ get-global at
[ 2nip ] [
[
[ gl-function-address ] map [ ] find nip
dup [ "OpenGL function not available" throw ] unless
dup
] dip
+gl-function-pointers+ get-global set-at
] if* ;
2008-11-29 16:21:12 -05:00
: indirect-quot ( function-ptr-quot return types abi -- quot )
'[ @ _ _ _ alien-indirect ] ;
2008-11-29 16:21:12 -05:00
:: define-indirect ( abi return function-ptr-quot function-name parameters -- )
function-name create-in dup reset-generic
function-ptr-quot return
parameters return parse-arglist [ abi indirect-quot ] dip
define-declared ;
2008-11-29 16:21:12 -05:00
SYNTAX: GL-FUNCTION:
gl-function-calling-convention
scan
scan dup
scan drop "}" parse-tokens swap prefix
gl-function-number
[ gl-function-pointer ] 2curry swap
";" parse-tokens [ "()" subseq? not ] filter
define-indirect ;