gpu: add geometry shader support
parent
ffafafd951
commit
63bb6c4e42
|
@ -3,6 +3,7 @@ H{
|
||||||
{ deploy-name "Raytrace" }
|
{ deploy-name "Raytrace" }
|
||||||
{ deploy-ui? t }
|
{ deploy-ui? t }
|
||||||
{ deploy-c-types? f }
|
{ deploy-c-types? f }
|
||||||
|
{ deploy-console? f }
|
||||||
{ deploy-unicode? f }
|
{ deploy-unicode? f }
|
||||||
{ "stop-after-last-window?" t }
|
{ "stop-after-last-window?" t }
|
||||||
{ deploy-io 2 }
|
{ deploy-io 2 }
|
||||||
|
|
|
@ -104,9 +104,13 @@ VARIANT: primitive-mode
|
||||||
points-mode
|
points-mode
|
||||||
lines-mode
|
lines-mode
|
||||||
line-strip-mode
|
line-strip-mode
|
||||||
|
lines-with-adjacency-mode
|
||||||
|
line-strip-with-adjacency-mode
|
||||||
line-loop-mode
|
line-loop-mode
|
||||||
triangles-mode
|
triangles-mode
|
||||||
triangle-strip-mode
|
triangle-strip-mode
|
||||||
|
triangles-with-adjacency-mode
|
||||||
|
triangle-strip-with-adjacency-mode
|
||||||
triangle-fan-mode ;
|
triangle-fan-mode ;
|
||||||
|
|
||||||
TUPLE: uniform-tuple ;
|
TUPLE: uniform-tuple ;
|
||||||
|
@ -131,6 +135,10 @@ ERROR: invalid-uniform-type uniform ;
|
||||||
{ triangles-mode [ GL_TRIANGLES ] }
|
{ triangles-mode [ GL_TRIANGLES ] }
|
||||||
{ triangle-strip-mode [ GL_TRIANGLE_STRIP ] }
|
{ triangle-strip-mode [ GL_TRIANGLE_STRIP ] }
|
||||||
{ triangle-fan-mode [ GL_TRIANGLE_FAN ] }
|
{ triangle-fan-mode [ GL_TRIANGLE_FAN ] }
|
||||||
|
{ lines-with-adjacency-mode [ GL_LINES_ADJACENCY ] }
|
||||||
|
{ line-strip-with-adjacency-mode [ GL_LINE_STRIP_ADJACENCY ] }
|
||||||
|
{ triangles-with-adjacency-mode [ GL_TRIANGLES_ADJACENCY ] }
|
||||||
|
{ triangle-strip-with-adjacency-mode [ GL_TRIANGLE_STRIP_ADJACENCY ] }
|
||||||
} case ; inline
|
} case ; inline
|
||||||
|
|
||||||
GENERIC: render-vertex-indexes ( primitive-mode vertex-indexes -- )
|
GENERIC: render-vertex-indexes ( primitive-mode vertex-indexes -- )
|
||||||
|
|
|
@ -15,7 +15,18 @@ SPECIALIZED-ARRAY: void*
|
||||||
IN: gpu.shaders
|
IN: gpu.shaders
|
||||||
|
|
||||||
VARIANT: shader-kind
|
VARIANT: shader-kind
|
||||||
vertex-shader fragment-shader ;
|
vertex-shader fragment-shader geometry-shader ;
|
||||||
|
|
||||||
|
VARIANT: geometry-shader-input
|
||||||
|
points-input
|
||||||
|
lines-input
|
||||||
|
lines-with-adjacency-input
|
||||||
|
triangles-input
|
||||||
|
triangles-with-adjacency-input ;
|
||||||
|
VARIANT: geometry-shader-output
|
||||||
|
points-output
|
||||||
|
line-strips-output
|
||||||
|
triangle-strips-output ;
|
||||||
|
|
||||||
UNION: ?string string POSTPONE: f ;
|
UNION: ?string string POSTPONE: f ;
|
||||||
|
|
||||||
|
@ -47,6 +58,7 @@ TUPLE: program
|
||||||
{ shaders array read-only }
|
{ shaders array read-only }
|
||||||
{ vertex-formats array read-only }
|
{ vertex-formats array read-only }
|
||||||
{ feedback-format ?vertex-format read-only }
|
{ feedback-format ?vertex-format read-only }
|
||||||
|
{ geometry-shader-parameters array read-only }
|
||||||
{ instances hashtable read-only } ;
|
{ instances hashtable read-only } ;
|
||||||
|
|
||||||
TUPLE: shader-instance < gpu-object
|
TUPLE: shader-instance < gpu-object
|
||||||
|
@ -197,6 +209,31 @@ TR: hyphens>underscores "-" "_" ;
|
||||||
vertex-attributes [ [verify-feedback-attribute] ] map-index :> verify-cleave
|
vertex-attributes [ [verify-feedback-attribute] ] map-index :> verify-cleave
|
||||||
{ drop verify-cleave cleave } >quotation ;
|
{ drop verify-cleave cleave } >quotation ;
|
||||||
|
|
||||||
|
: gl-geometry-shader-input ( input -- input )
|
||||||
|
{
|
||||||
|
{ points-input [ GL_POINTS ] }
|
||||||
|
{ lines-input [ GL_LINES ] }
|
||||||
|
{ lines-with-adjacency-input [ GL_LINES_ADJACENCY ] }
|
||||||
|
{ triangles-input [ GL_TRIANGLES ] }
|
||||||
|
{ triangles-with-adjacency-input [ GL_TRIANGLES_ADJACENCY ] }
|
||||||
|
} case ; inline
|
||||||
|
|
||||||
|
: gl-geometry-shader-output ( output -- output )
|
||||||
|
{
|
||||||
|
{ points-output [ GL_POINTS ] }
|
||||||
|
{ line-strips-output [ GL_LINE_STRIP ] }
|
||||||
|
{ triangle-strips-output [ GL_TRIANGLE_STRIP ] }
|
||||||
|
} case ; inline
|
||||||
|
|
||||||
|
TUPLE: geometry-shader-vertices-out
|
||||||
|
{ count integer read-only } ;
|
||||||
|
|
||||||
|
UNION: geometry-shader-parameter
|
||||||
|
geometry-shader-input
|
||||||
|
geometry-shader-output
|
||||||
|
geometry-shader-vertices-out ;
|
||||||
|
|
||||||
|
|
||||||
GENERIC: bind-vertex-format ( program-instance buffer-ptr format -- )
|
GENERIC: bind-vertex-format ( program-instance buffer-ptr format -- )
|
||||||
|
|
||||||
GENERIC: link-feedback-format ( program-handle format -- )
|
GENERIC: link-feedback-format ( program-handle format -- )
|
||||||
|
@ -208,6 +245,18 @@ M: f link-feedback-format
|
||||||
[ vertex-format-attributes [ name>> ] map sift ] map concat
|
[ vertex-format-attributes [ name>> ] map sift ] map concat
|
||||||
swap '[ [ _ ] 2dip swap glBindAttribLocation ] each-index ;
|
swap '[ [ _ ] 2dip swap glBindAttribLocation ] each-index ;
|
||||||
|
|
||||||
|
GENERIC: link-geometry-shader-parameter ( program-handle parameter -- )
|
||||||
|
|
||||||
|
M: geometry-shader-input link-geometry-shader-parameter
|
||||||
|
[ GL_GEOMETRY_INPUT_TYPE ] dip gl-geometry-shader-input glProgramParameteriARB ;
|
||||||
|
M: geometry-shader-output link-geometry-shader-parameter
|
||||||
|
[ GL_GEOMETRY_OUTPUT_TYPE ] dip gl-geometry-shader-output glProgramParameteriARB ;
|
||||||
|
M: geometry-shader-vertices-out link-geometry-shader-parameter
|
||||||
|
[ GL_GEOMETRY_VERTICES_OUT ] dip count>> glProgramParameteriARB ;
|
||||||
|
|
||||||
|
: link-geometry-shader-parameters ( program-handle parameters -- )
|
||||||
|
[ link-geometry-shader-parameter ] with each ;
|
||||||
|
|
||||||
GENERIC: (verify-feedback-format) ( program-instance format -- )
|
GENERIC: (verify-feedback-format) ( program-instance format -- )
|
||||||
|
|
||||||
M: f (verify-feedback-format)
|
M: f (verify-feedback-format)
|
||||||
|
@ -293,7 +342,8 @@ padding-no [ 0 ] initialize
|
||||||
{
|
{
|
||||||
{ vertex-shader [ GL_VERTEX_SHADER ] }
|
{ vertex-shader [ GL_VERTEX_SHADER ] }
|
||||||
{ fragment-shader [ GL_FRAGMENT_SHADER ] }
|
{ fragment-shader [ GL_FRAGMENT_SHADER ] }
|
||||||
} case ;
|
{ geometry-shader [ GL_GEOMETRY_SHADER ] }
|
||||||
|
} case ; inline
|
||||||
|
|
||||||
PRIVATE>
|
PRIVATE>
|
||||||
|
|
||||||
|
@ -433,8 +483,12 @@ DEFER: <shader-instance>
|
||||||
: (link-program) ( program shader-instances -- program-instance )
|
: (link-program) ( program shader-instances -- program-instance )
|
||||||
'[ _ [ handle>> ] map ]
|
'[ _ [ handle>> ] map ]
|
||||||
[
|
[
|
||||||
[ vertex-formats>> ] [ feedback-format>> ] bi
|
[ vertex-formats>> ] [ feedback-format>> ] [ geometry-shader-parameters>> ] tri
|
||||||
'[ [ _ link-vertex-formats ] [ _ link-feedback-format ] bi ]
|
'[
|
||||||
|
[ _ link-vertex-formats ]
|
||||||
|
[ _ link-feedback-format ]
|
||||||
|
[ _ link-geometry-shader-parameters ] tri
|
||||||
|
]
|
||||||
] bi (gl-program)
|
] bi (gl-program)
|
||||||
dup gl-program-ok? [
|
dup gl-program-ok? [
|
||||||
[ swap world get \ program-instance boa |dispose dup verify-feedback-format ]
|
[ swap world get \ program-instance boa |dispose dup verify-feedback-format ]
|
||||||
|
@ -485,15 +539,20 @@ TUPLE: feedback-format
|
||||||
: ?shader ( object -- shader/f )
|
: ?shader ( object -- shader/f )
|
||||||
dup word? [ def>> first dup shader? [ drop f ] unless ] [ drop f ] if ;
|
dup word? [ def>> first dup shader? [ drop f ] unless ] [ drop f ] if ;
|
||||||
|
|
||||||
: shaders-and-formats ( words -- shaders vertex-formats feedback-format )
|
: shaders-and-formats ( words -- shaders vertex-formats feedback-format geom-parameters )
|
||||||
[ [ ?shader ] map sift ]
|
{
|
||||||
[ [ vertex-format-attributes ] filter ]
|
[ [ ?shader ] map sift ]
|
||||||
[ [ feedback-format? ] filter validate-feedback-format ] tri ;
|
[ [ vertex-format-attributes ] filter ]
|
||||||
|
[ [ feedback-format? ] filter validate-feedback-format ]
|
||||||
|
[ [ geometry-shader-parameter? ] filter ]
|
||||||
|
} cleave ;
|
||||||
|
|
||||||
PRIVATE>
|
PRIVATE>
|
||||||
|
|
||||||
SYNTAX: feedback-format:
|
SYNTAX: feedback-format:
|
||||||
scan-object feedback-format boa suffix! ;
|
scan-object feedback-format boa suffix! ;
|
||||||
|
SYNTAX: geometry-shader-vertices-out:
|
||||||
|
scan-object geometry-shader-vertices-out boa suffix! ;
|
||||||
|
|
||||||
TYPED:: refresh-program ( program: program -- )
|
TYPED:: refresh-program ( program: program -- )
|
||||||
program shaders>> [ refresh-shader-source ] each
|
program shaders>> [ refresh-shader-source ] each
|
||||||
|
|
Loading…
Reference in New Issue