diff --git a/extra/gpu/buffers/buffers.factor b/extra/gpu/buffers/buffers.factor index c4f85bb5af..3de5a03d35 100644 --- a/extra/gpu/buffers/buffers.factor +++ b/extra/gpu/buffers/buffers.factor @@ -15,7 +15,8 @@ VARIANT: buffer-access-mode VARIANT: buffer-kind vertex-buffer index-buffer - pixel-unpack-buffer pixel-pack-buffer ; + pixel-unpack-buffer pixel-pack-buffer + transform-feedback-buffer ; TUPLE: buffer < gpu-object { upload-pattern buffer-upload-pattern } @@ -52,6 +53,7 @@ TUPLE: buffer < gpu-object { index-buffer [ GL_ELEMENT_ARRAY_BUFFER ] } { pixel-unpack-buffer [ GL_PIXEL_UNPACK_BUFFER ] } { pixel-pack-buffer [ GL_PIXEL_PACK_BUFFER ] } + { transform-feedback-buffer [ GL_TRANSFORM_FEEDBACK_BUFFER ] } } case ; inline : 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>> ] [ offset>> ] bi 2dup [ buffer-size ] dip - - buffer-range boa ; + buffer-range boa ; inline :: allocate-buffer ( buffer size initial-data -- ) buffer bind-buffer :> target diff --git a/extra/gpu/render/render.factor b/extra/gpu/render/render.factor index 6ea72d53a5..ce6e0e25ff 100644 --- a/extra/gpu/render/render.factor +++ b/extra/gpu/render/render.factor @@ -431,9 +431,33 @@ SYNTAX: UNIFORM-TUPLE: dup first sequence? [ 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> UNION: ?any-framebuffer any-framebuffer POSTPONE: f ; +UNION: transform-feedback-output buffer buffer-range POSTPONE: f ; TUPLE: render-set { primitive-mode primitive-mode read-only } @@ -442,7 +466,8 @@ TUPLE: render-set { indexes vertex-indexes initial: T{ index-range } read-only } { instances ?integer initial: f 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 } ; : ( x quot-assoc -- render-set ) render-set swap make-tuple ; inline @@ -472,11 +497,20 @@ TUPLE: render-set bind-output-attachments ] [ 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 [ render-vertex-indexes-instanced ] [ render-vertex-indexes ] if* ] + + [ transform-feedback-output>> [ glEndTransformFeedback ] when ] [ framebuffer>> [ GL_RASTERIZER_DISCARD glDisable ] unless ] } cleave ; inline diff --git a/extra/gpu/shaders/shaders.factor b/extra/gpu/shaders/shaders.factor index fd31e8b279..f38d95a118 100755 --- a/extra/gpu/shaders/shaders.factor +++ b/extra/gpu/shaders/shaders.factor @@ -301,7 +301,8 @@ DEFER: [ compile-shader-error ] if ; : (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? [ swap world get \ program-instance boa window-resource ] [ link-program-error ] if ;