accept transform-feedback-output target from render
parent
eeb02815bc
commit
bfcb95edaf
extra/gpu
|
@ -15,7 +15,8 @@ VARIANT: buffer-access-mode
|
||||||
|
|
||||||
VARIANT: buffer-kind
|
VARIANT: buffer-kind
|
||||||
vertex-buffer index-buffer
|
vertex-buffer index-buffer
|
||||||
pixel-unpack-buffer pixel-pack-buffer ;
|
pixel-unpack-buffer pixel-pack-buffer
|
||||||
|
transform-feedback-buffer ;
|
||||||
|
|
||||||
TUPLE: buffer < gpu-object
|
TUPLE: buffer < gpu-object
|
||||||
{ upload-pattern buffer-upload-pattern }
|
{ upload-pattern buffer-upload-pattern }
|
||||||
|
@ -52,6 +53,7 @@ TUPLE: buffer < gpu-object
|
||||||
{ index-buffer [ GL_ELEMENT_ARRAY_BUFFER ] }
|
{ index-buffer [ GL_ELEMENT_ARRAY_BUFFER ] }
|
||||||
{ pixel-unpack-buffer [ GL_PIXEL_UNPACK_BUFFER ] }
|
{ pixel-unpack-buffer [ GL_PIXEL_UNPACK_BUFFER ] }
|
||||||
{ pixel-pack-buffer [ GL_PIXEL_PACK_BUFFER ] }
|
{ pixel-pack-buffer [ GL_PIXEL_PACK_BUFFER ] }
|
||||||
|
{ transform-feedback-buffer [ GL_TRANSFORM_FEEDBACK_BUFFER ] }
|
||||||
} case ; inline
|
} case ; inline
|
||||||
|
|
||||||
: get-buffer-int ( target enum -- value )
|
: get-buffer-int ( target enum -- value )
|
||||||
|
@ -82,7 +84,7 @@ UNION: gpu-data-ptr buffer-ptr c-ptr ;
|
||||||
: buffer-ptr>range ( buffer-ptr -- buffer-range )
|
: buffer-ptr>range ( buffer-ptr -- buffer-range )
|
||||||
[ buffer>> ] [ offset>> ] bi
|
[ buffer>> ] [ offset>> ] bi
|
||||||
2dup [ buffer-size ] dip -
|
2dup [ buffer-size ] dip -
|
||||||
buffer-range boa ;
|
buffer-range boa ; inline
|
||||||
|
|
||||||
:: allocate-buffer ( buffer size initial-data -- )
|
:: allocate-buffer ( buffer size initial-data -- )
|
||||||
buffer bind-buffer :> target
|
buffer bind-buffer :> target
|
||||||
|
|
|
@ -431,9 +431,33 @@ SYNTAX: UNIFORM-TUPLE:
|
||||||
dup first sequence?
|
dup first sequence?
|
||||||
[ bind-named-output-attachments ] [ [ drop ] 2dip bind-unnamed-output-attachments ] if ;
|
[ bind-named-output-attachments ] [ [ drop ] 2dip bind-unnamed-output-attachments ] if ;
|
||||||
|
|
||||||
|
GENERIC: bind-transform-feedback-output ( output -- )
|
||||||
|
|
||||||
|
M: buffer bind-transform-feedback-output
|
||||||
|
[ GL_TRANSFORM_FEEDBACK_BUFFER 0 ] dip handle>> glBindBufferBase ; inline
|
||||||
|
|
||||||
|
M: buffer-range bind-transform-feedback-output
|
||||||
|
[ GL_TRANSFORM_FEEDBACK_BUFFER 0 ] dip
|
||||||
|
[ handle>> ] [ offset>> ] [ size>> ] tri glBindBufferRange ; inline
|
||||||
|
|
||||||
|
M: buffer-ptr bind-transform-feedback-output
|
||||||
|
buffer-ptr>range bind-transform-feedback-output ; inline
|
||||||
|
|
||||||
|
: gl-feedback-primitive-mode ( primitive-mode -- gl-mode )
|
||||||
|
{
|
||||||
|
{ points-mode [ GL_POINTS ] }
|
||||||
|
{ lines-mode [ GL_LINES ] }
|
||||||
|
{ line-strip-mode [ GL_LINES ] }
|
||||||
|
{ line-loop-mode [ GL_LINES ] }
|
||||||
|
{ triangles-mode [ GL_TRIANGLES ] }
|
||||||
|
{ triangle-strip-mode [ GL_TRIANGLES ] }
|
||||||
|
{ triangle-fan-mode [ GL_TRIANGLES ] }
|
||||||
|
} case ;
|
||||||
|
|
||||||
PRIVATE>
|
PRIVATE>
|
||||||
|
|
||||||
UNION: ?any-framebuffer any-framebuffer POSTPONE: f ;
|
UNION: ?any-framebuffer any-framebuffer POSTPONE: f ;
|
||||||
|
UNION: transform-feedback-output buffer buffer-range POSTPONE: f ;
|
||||||
|
|
||||||
TUPLE: render-set
|
TUPLE: render-set
|
||||||
{ primitive-mode primitive-mode read-only }
|
{ primitive-mode primitive-mode read-only }
|
||||||
|
@ -442,7 +466,8 @@ TUPLE: render-set
|
||||||
{ indexes vertex-indexes initial: T{ index-range } read-only }
|
{ indexes vertex-indexes initial: T{ index-range } read-only }
|
||||||
{ instances ?integer initial: f read-only }
|
{ instances ?integer initial: f read-only }
|
||||||
{ framebuffer ?any-framebuffer initial: system-framebuffer read-only }
|
{ framebuffer ?any-framebuffer initial: system-framebuffer read-only }
|
||||||
{ output-attachments sequence initial: { default-attachment } read-only } ;
|
{ output-attachments sequence initial: { default-attachment } read-only }
|
||||||
|
{ transform-feedback-output transform-feedback-output initial: f read-only } ;
|
||||||
|
|
||||||
: <render-set> ( x quot-assoc -- render-set )
|
: <render-set> ( x quot-assoc -- render-set )
|
||||||
render-set swap make-tuple ; inline
|
render-set swap make-tuple ; inline
|
||||||
|
@ -472,11 +497,20 @@ TUPLE: render-set
|
||||||
bind-output-attachments
|
bind-output-attachments
|
||||||
]
|
]
|
||||||
[ vertex-array>> bind-vertex-array ]
|
[ vertex-array>> bind-vertex-array ]
|
||||||
|
[
|
||||||
|
dup transform-feedback-output>> [
|
||||||
|
[ primitive-mode>> gl-feedback-primitive-mode glBeginTransformFeedback ]
|
||||||
|
[ bind-transform-feedback-output ] bi*
|
||||||
|
] [ drop ] if*
|
||||||
|
]
|
||||||
|
|
||||||
[
|
[
|
||||||
[ primitive-mode>> ] [ indexes>> ] [ instances>> ] tri
|
[ primitive-mode>> ] [ indexes>> ] [ instances>> ] tri
|
||||||
[ render-vertex-indexes-instanced ]
|
[ render-vertex-indexes-instanced ]
|
||||||
[ render-vertex-indexes ] if*
|
[ render-vertex-indexes ] if*
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[ transform-feedback-output>> [ glEndTransformFeedback ] when ]
|
||||||
[ framebuffer>> [ GL_RASTERIZER_DISCARD glDisable ] unless ]
|
[ framebuffer>> [ GL_RASTERIZER_DISCARD glDisable ] unless ]
|
||||||
} cleave ; inline
|
} cleave ; inline
|
||||||
|
|
||||||
|
|
|
@ -301,7 +301,8 @@ DEFER: <shader-instance>
|
||||||
[ compile-shader-error ] if ;
|
[ compile-shader-error ] if ;
|
||||||
|
|
||||||
: (link-program) ( program shader-instances -- program-instance )
|
: (link-program) ( program shader-instances -- program-instance )
|
||||||
[ [ handle>> ] map ] [ feedback-format>> [ link-feedback-format ] curry ] bi (gl-program)
|
[ [ handle>> ] map ] curry
|
||||||
|
[ feedback-format>> [ link-feedback-format ] curry ] bi (gl-program)
|
||||||
dup gl-program-ok?
|
dup gl-program-ok?
|
||||||
[ swap world get \ program-instance boa window-resource ]
|
[ swap world get \ program-instance boa window-resource ]
|
||||||
[ link-program-error ] if ;
|
[ link-program-error ] if ;
|
||||||
|
|
Loading…
Reference in New Issue