add a buffer-range tuple to represent a subset of a buffer. add support for specifying a transform feedback format to GLSL-PROGRAM: syntax
parent
33395eeabd
commit
01f172b5be
|
@ -54,6 +54,12 @@ TUPLE: buffer < gpu-object
|
||||||
{ pixel-pack-buffer [ GL_PIXEL_PACK_BUFFER ] }
|
{ pixel-pack-buffer [ GL_PIXEL_PACK_BUFFER ] }
|
||||||
} case ; inline
|
} case ; inline
|
||||||
|
|
||||||
|
: get-buffer-int ( target enum -- value )
|
||||||
|
0 <int> [ glGetBufferParameteriv ] keep *int ;
|
||||||
|
|
||||||
|
: bind-buffer ( buffer -- target )
|
||||||
|
[ kind>> gl-target dup ] [ handle>> glBindBuffer ] bi ;
|
||||||
|
|
||||||
PRIVATE>
|
PRIVATE>
|
||||||
|
|
||||||
M: buffer dispose
|
M: buffer dispose
|
||||||
|
@ -64,11 +70,17 @@ TUPLE: buffer-ptr
|
||||||
{ offset integer read-only } ;
|
{ offset integer read-only } ;
|
||||||
C: <buffer-ptr> buffer-ptr
|
C: <buffer-ptr> buffer-ptr
|
||||||
|
|
||||||
|
TUPLE: buffer-range < buffer-ptr
|
||||||
|
{ size integer read-only } ;
|
||||||
|
C: <buffer-range> buffer-range
|
||||||
|
|
||||||
UNION: gpu-data-ptr buffer-ptr c-ptr ;
|
UNION: gpu-data-ptr buffer-ptr c-ptr ;
|
||||||
|
|
||||||
|
: buffer-size ( buffer -- size )
|
||||||
|
bind-buffer GL_BUFFER_SIZE get-buffer-int ;
|
||||||
|
|
||||||
:: allocate-buffer ( buffer size initial-data -- )
|
:: allocate-buffer ( buffer size initial-data -- )
|
||||||
buffer kind>> gl-target :> target
|
buffer bind-buffer :> target
|
||||||
target buffer handle>> glBindBuffer
|
|
||||||
target size initial-data buffer gl-buffer-usage glBufferData ;
|
target size initial-data buffer gl-buffer-usage glBufferData ;
|
||||||
|
|
||||||
: <buffer> ( upload usage kind size initial-data -- buffer )
|
: <buffer> ( upload usage kind size initial-data -- buffer )
|
||||||
|
@ -81,15 +93,13 @@ UNION: gpu-data-ptr buffer-ptr c-ptr ;
|
||||||
|
|
||||||
:: update-buffer ( buffer-ptr size data -- )
|
:: update-buffer ( buffer-ptr size data -- )
|
||||||
buffer-ptr buffer>> :> buffer
|
buffer-ptr buffer>> :> buffer
|
||||||
buffer kind>> gl-target :> target
|
buffer bind-buffer :> target
|
||||||
target buffer handle>> glBindBuffer
|
|
||||||
target buffer-ptr offset>> size data glBufferSubData ;
|
target buffer-ptr offset>> size data glBufferSubData ;
|
||||||
|
|
||||||
:: read-buffer ( buffer-ptr size -- data )
|
:: read-buffer ( buffer-ptr size -- data )
|
||||||
buffer-ptr buffer>> :> buffer
|
buffer-ptr buffer>> :> buffer
|
||||||
buffer kind>> gl-target :> target
|
buffer bind-buffer :> target
|
||||||
size <byte-array> :> data
|
size <byte-array> :> data
|
||||||
target buffer handle>> glBindBuffer
|
|
||||||
target buffer-ptr offset>> size data glGetBufferSubData
|
target buffer-ptr offset>> size data glGetBufferSubData
|
||||||
data ;
|
data ;
|
||||||
|
|
||||||
|
@ -102,9 +112,7 @@ UNION: gpu-data-ptr buffer-ptr c-ptr ;
|
||||||
size glCopyBufferSubData ;
|
size glCopyBufferSubData ;
|
||||||
|
|
||||||
:: with-mapped-buffer ( buffer access quot: ( alien -- ) -- )
|
:: with-mapped-buffer ( buffer access quot: ( alien -- ) -- )
|
||||||
buffer kind>> gl-target :> target
|
buffer bind-buffer :> target
|
||||||
|
|
||||||
target buffer handle>> glBindBuffer
|
|
||||||
target access gl-access glMapBuffer
|
target access gl-access glMapBuffer
|
||||||
|
|
||||||
quot call
|
quot call
|
||||||
|
|
|
@ -386,33 +386,6 @@ TR: hyphens>underscores "-" "_" ;
|
||||||
] }
|
] }
|
||||||
} case ;
|
} case ;
|
||||||
|
|
||||||
: component-type>c-type ( component-type -- c-type )
|
|
||||||
{
|
|
||||||
{ ubyte-components [ "uchar" ] }
|
|
||||||
{ ushort-components [ "ushort" ] }
|
|
||||||
{ uint-components [ "uint" ] }
|
|
||||||
{ half-components [ "half" ] }
|
|
||||||
{ float-components [ "float" ] }
|
|
||||||
{ byte-integer-components [ "char" ] }
|
|
||||||
{ ubyte-integer-components [ "uchar" ] }
|
|
||||||
{ short-integer-components [ "short" ] }
|
|
||||||
{ ushort-integer-components [ "ushort" ] }
|
|
||||||
{ int-integer-components [ "int" ] }
|
|
||||||
{ uint-integer-components [ "uint" ] }
|
|
||||||
} case ;
|
|
||||||
|
|
||||||
: c-array-dim ( dim -- string )
|
|
||||||
dup 1 = [ drop "" ] [ number>string "[" "]" surround ] if ;
|
|
||||||
|
|
||||||
SYMBOL: padding-no
|
|
||||||
padding-no [ 0 ] initialize
|
|
||||||
|
|
||||||
: padding-name ( -- name )
|
|
||||||
"padding-"
|
|
||||||
padding-no get number>string append
|
|
||||||
"(" ")" surround
|
|
||||||
padding-no inc ;
|
|
||||||
|
|
||||||
: (define-uniform-tuple) ( class superclass uniforms -- )
|
: (define-uniform-tuple) ( class superclass uniforms -- )
|
||||||
{
|
{
|
||||||
[ [ uniform>slot ] map define-tuple-class ]
|
[ [ uniform>slot ] map define-tuple-class ]
|
||||||
|
@ -490,7 +463,7 @@ TUPLE: render-set
|
||||||
[
|
[
|
||||||
framebuffer>>
|
framebuffer>>
|
||||||
[ GL_DRAW_FRAMEBUFFER swap framebuffer-handle glBindFramebuffer ]
|
[ GL_DRAW_FRAMEBUFFER swap framebuffer-handle glBindFramebuffer ]
|
||||||
[ GL_RASTERIZER_DISCARD glEnable ] if*
|
[ GL_DRAW_FRAMEBUFFER 0 glBindFramebuffer GL_RASTERIZER_DISCARD glEnable ] if*
|
||||||
]
|
]
|
||||||
[
|
[
|
||||||
[ vertex-array>> program-instance>> ]
|
[ vertex-array>> program-instance>> ]
|
||||||
|
|
|
@ -3,10 +3,14 @@ IN: gpu.shaders.prettyprint
|
||||||
|
|
||||||
M: compile-shader-error error.
|
M: compile-shader-error error.
|
||||||
"The GLSL shader " write
|
"The GLSL shader " write
|
||||||
[ shader>> name>> pprint-short " failed to compile." write nl ]
|
[ shader>> name>> pprint-short " failed to compile." print ]
|
||||||
[ log>> write nl ] bi ;
|
[ log>> print ] bi ;
|
||||||
|
|
||||||
M: link-program-error error.
|
M: link-program-error error.
|
||||||
"The GLSL program " write
|
"The GLSL program " write
|
||||||
[ shader>> name>> pprint-short " failed to link." write nl ]
|
[ shader>> name>> pprint-short " failed to link." print ]
|
||||||
[ log>> write nl ] bi ;
|
[ log>> print ] bi ;
|
||||||
|
|
||||||
|
M: too-many-feedback-formats-error error.
|
||||||
|
drop
|
||||||
|
"Only one transform feedback format can be specified for a program." print ;
|
||||||
|
|
|
@ -16,6 +16,8 @@ VARIANT: shader-kind
|
||||||
|
|
||||||
UNION: ?string string POSTPONE: f ;
|
UNION: ?string string POSTPONE: f ;
|
||||||
|
|
||||||
|
ERROR: too-many-feedback-formats-error formats ;
|
||||||
|
|
||||||
TUPLE: vertex-attribute
|
TUPLE: vertex-attribute
|
||||||
{ name ?string read-only initial: f }
|
{ name ?string read-only initial: f }
|
||||||
{ component-type component-type read-only initial: float-components }
|
{ component-type component-type read-only initial: float-components }
|
||||||
|
@ -23,6 +25,7 @@ TUPLE: vertex-attribute
|
||||||
{ normalize? boolean read-only initial: f } ;
|
{ normalize? boolean read-only initial: f } ;
|
||||||
|
|
||||||
MIXIN: vertex-format
|
MIXIN: vertex-format
|
||||||
|
UNION: ?vertex-format vertex-format POSTPONE: f ;
|
||||||
|
|
||||||
TUPLE: shader
|
TUPLE: shader
|
||||||
{ name word read-only initial: t }
|
{ name word read-only initial: t }
|
||||||
|
@ -37,7 +40,7 @@ TUPLE: program
|
||||||
{ filename read-only }
|
{ filename read-only }
|
||||||
{ line integer read-only }
|
{ line integer read-only }
|
||||||
{ shaders array read-only }
|
{ shaders array read-only }
|
||||||
{ feedback-format vertex-format read-only }
|
{ feedback-format ?vertex-format read-only }
|
||||||
{ instances hashtable read-only } ;
|
{ instances hashtable read-only } ;
|
||||||
|
|
||||||
TUPLE: shader-instance < gpu-object
|
TUPLE: shader-instance < gpu-object
|
||||||
|
@ -316,6 +319,14 @@ DEFER: <shader-instance>
|
||||||
world get over instances>> at*
|
world get over instances>> at*
|
||||||
[ nip ] [ drop link-program ] if ;
|
[ nip ] [ drop link-program ] if ;
|
||||||
|
|
||||||
|
: shaders-and-feedback-format ( words -- shaders feedback-format )
|
||||||
|
[ vertex-format? ] partition swap
|
||||||
|
[ [ def>> first ] map ] [
|
||||||
|
dup length 1 <=
|
||||||
|
[ [ f ] [ first ] if-empty ]
|
||||||
|
[ too-many-feedback-formats-error ] if
|
||||||
|
] bi* ;
|
||||||
|
|
||||||
PRIVATE>
|
PRIVATE>
|
||||||
|
|
||||||
:: refresh-program ( program -- )
|
:: refresh-program ( program -- )
|
||||||
|
@ -368,7 +379,7 @@ SYNTAX: GLSL-PROGRAM:
|
||||||
CREATE-WORD dup
|
CREATE-WORD dup
|
||||||
f
|
f
|
||||||
lexer get line>>
|
lexer get line>>
|
||||||
\ ; parse-until >array [ def>> first ] map
|
\ ; parse-until >array shaders-and-feedback-format
|
||||||
H{ } clone
|
H{ } clone
|
||||||
program boa
|
program boa
|
||||||
define-constant ;
|
define-constant ;
|
||||||
|
|
|
@ -151,7 +151,7 @@ M: cube-map-face texture-data-gl-target
|
||||||
|
|
||||||
: get-texture-float ( target level enum -- value )
|
: get-texture-float ( target level enum -- value )
|
||||||
0 <float> [ glGetTexLevelParameterfv ] keep *float ;
|
0 <float> [ glGetTexLevelParameterfv ] keep *float ;
|
||||||
: get-texture-int ( texture level enum -- value )
|
: get-texture-int ( target level enum -- value )
|
||||||
0 <int> [ glGetTexLevelParameteriv ] keep *int ;
|
0 <int> [ glGetTexLevelParameteriv ] keep *int ;
|
||||||
|
|
||||||
: ?product ( x -- y )
|
: ?product ( x -- y )
|
||||||
|
|
Loading…
Reference in New Issue