gpu.render: allow uniform-tuples to hand off specialized-arrays, structs, simd types, etc. directly to glUniform*v functions when binding uniforms

db4
Joe Groff 2010-02-10 11:24:36 -08:00
parent 09a4080772
commit a173171e34
2 changed files with 155 additions and 52 deletions

View File

@ -62,7 +62,7 @@ $nl
{ "Boolean vector types: " { $link bvec2-uniform } ", " { $link bvec3-uniform } ", " { $link bvec4-uniform } } { "Boolean vector types: " { $link bvec2-uniform } ", " { $link bvec3-uniform } ", " { $link bvec4-uniform } }
} }
} }
{ "Matrix uniforms take their values from row-major Factor " { $link sequence } "s of sequences of floats. Matrix types are:" { "Matrix uniforms take their values either from row-major Factor " { $link sequence } "s of sequences of floats, or from " { $link alien } "s or " { $link float-array } "s referencing packed column-major arrays of floats. Matrix types are:"
{ $list { $list
{ { $link mat2-uniform } ", " { $link mat2x3-uniform } ", " { $link mat2x4-uniform } } { { $link mat2-uniform } ", " { $link mat2x3-uniform } ", " { $link mat2x4-uniform } }
{ { $link mat3x2-uniform } ", " { $link mat3-uniform } ", " { $link mat3x4-uniform } } { { $link mat3x2-uniform } ", " { $link mat3-uniform } ", " { $link mat3x4-uniform } }
@ -71,7 +71,7 @@ $nl
"Rectangular matrix type names are column x row." "Rectangular matrix type names are column x row."
} }
{ "Uniform slots can also be defined as other " { $snippet "uniform-tuple" } " types to bind uniform structures. The uniform structure will take its value from the slots of a tuple of the given type." } { "Uniform slots can also be defined as other " { $snippet "uniform-tuple" } " types to bind uniform structures. The uniform structure will take its value from the slots of a tuple of the given type." }
{ "Array uniforms are passed as Factor sequences of the corresponding value type above." } { "Array uniforms are passed either as Factor sequences of the corresponding type specified above, or as " { $link alien } "s or " { $vocab-link "specialized-arrays" } " that reference pre-packed binary arrays of " { $link c:int } "s or " { $link c:float } "s." }
} }
$nl $nl
"A value of a uniform tuple type is a standard Factor tuple. Uniform tuples are constructed with " { $link new } " or " { $link boa } ", and values are placed inside them using standard slot accessors." "A value of a uniform tuple type is a standard Factor tuple. Uniform tuples are constructed with " { $link new } " or " { $link boa } ", and values are placed inside them using standard slot accessors."

View File

@ -1,6 +1,6 @@
! (c)2009 Joe Groff bsd license ! (c)2009 Joe Groff bsd license
USING: accessors alien alien.c-types alien.data arrays USING: accessors alien alien.c-types alien.data arrays
assocs classes classes.mixin classes.parser classes.singleton assocs classes classes.mixin classes.parser classes.singleton classes.struct
classes.tuple classes.tuple.private combinators combinators.tuple destructors fry classes.tuple classes.tuple.private combinators combinators.tuple destructors fry
generic generic.parser gpu gpu.buffers gpu.framebuffers generic generic.parser gpu gpu.buffers gpu.framebuffers
gpu.framebuffers.private gpu.shaders gpu.shaders.private gpu.state gpu.framebuffers.private gpu.shaders gpu.shaders.private gpu.state
@ -8,7 +8,7 @@ gpu.textures gpu.textures.private half-floats images kernel
lexer locals math math.order math.parser namespaces opengl lexer locals math math.order math.parser namespaces opengl
opengl.gl parser quotations sequences slots sorting opengl.gl parser quotations sequences slots sorting
specialized-arrays strings ui.gadgets.worlds variants specialized-arrays strings ui.gadgets.worlds variants
vocabs.parser words ; vocabs.parser words math.vectors.simd ;
FROM: math => float ; FROM: math => float ;
QUALIFIED-WITH: alien.c-types c QUALIFIED-WITH: alien.c-types c
SPECIALIZED-ARRAY: c:float SPECIALIZED-ARRAY: c:float
@ -235,6 +235,109 @@ DEFER: uniform-texture-accessors
0 swap [ texture-accessor>cleave ] map nip 0 swap [ texture-accessor>cleave ] map nip
\ nip swap \ cleave [ ] 3sequence ; \ nip swap \ cleave [ ] 3sequence ;
UNION: binary-data
c-ptr specialized-array struct simd-128 ;
GENERIC: >uniform-bool-array ( sequence -- c-array )
GENERIC: >uniform-int-array ( sequence -- c-array )
GENERIC: >uniform-uint-array ( sequence -- c-array )
GENERIC: >uniform-float-array ( sequence -- c-array )
GENERIC# >uniform-bvec-array 1 ( sequence dim -- c-array )
GENERIC# >uniform-ivec-array 1 ( sequence dim -- c-array )
GENERIC# >uniform-uvec-array 1 ( sequence dim -- c-array )
GENERIC# >uniform-vec-array 1 ( sequence dim -- c-array )
GENERIC# >uniform-matrix 2 ( sequence cols rows -- c-array )
GENERIC# >uniform-matrix-array 2 ( sequence cols rows -- c-array )
GENERIC: bind-uniform-bvec2 ( index sequence -- )
GENERIC: bind-uniform-bvec3 ( index sequence -- )
GENERIC: bind-uniform-bvec4 ( index sequence -- )
GENERIC: bind-uniform-ivec2 ( index sequence -- )
GENERIC: bind-uniform-ivec3 ( index sequence -- )
GENERIC: bind-uniform-ivec4 ( index sequence -- )
GENERIC: bind-uniform-uvec2 ( index sequence -- )
GENERIC: bind-uniform-uvec3 ( index sequence -- )
GENERIC: bind-uniform-uvec4 ( index sequence -- )
GENERIC: bind-uniform-vec2 ( index sequence -- )
GENERIC: bind-uniform-vec3 ( index sequence -- )
GENERIC: bind-uniform-vec4 ( index sequence -- )
M: object >uniform-bool-array [ >c-bool ] int-array{ } map-as ; inline
M: binary-data >uniform-bool-array ; inline
M: object >uniform-int-array >int-array ; inline
M: binary-data >uniform-int-array ; inline
M: object >uniform-uint-array >uint-array ; inline
M: binary-data >uniform-uint-array ; inline
M: object >uniform-float-array >float-array ; inline
M: binary-data >uniform-float-array ; inline
M: object >uniform-bvec-array '[ _ head-slice [ >c-bool ] int-array{ } map-as ] map concat ; inline
M: binary-data >uniform-bvec-array drop ; inline
M: object >uniform-ivec-array '[ _ head ] map int-array{ } concat-as ; inline
M: binary-data >uniform-ivec-array drop ; inline
M: object >uniform-uvec-array '[ _ head ] map uint-array{ } concat-as ; inline
M: binary-data >uniform-uvec-array drop ; inline
M: object >uniform-vec-array '[ _ head ] map float-array{ } concat-as ; inline
M: binary-data >uniform-vec-array drop ; inline
M:: object >uniform-matrix ( sequence cols rows -- c-array )
sequence flip cols head-slice
[ rows head-slice >float-array ] { } map-as concat ; inline
M: binary-data >uniform-matrix 2drop ; inline
M: object >uniform-matrix-array
'[ _ _ >uniform-matrix ] map concat ; inline
M: binary-data >uniform-matrix-array 2drop ; inline
M: object bind-uniform-bvec2 ( index sequence -- )
1 swap 2 head-slice [ >c-bool ] int-array{ } map-as glUniform2iv ; inline
M: binary-data bind-uniform-bvec2 ( index sequence -- )
1 swap glUniform2iv ; inline
M: object bind-uniform-bvec3 ( index sequence -- )
1 swap 3 head-slice [ >c-bool ] int-array{ } map-as glUniform3iv ; inline
M: binary-data bind-uniform-bvec3 ( index sequence -- )
1 swap glUniform3iv ; inline
M: object bind-uniform-bvec4 ( index sequence -- )
1 swap 4 head-slice [ >c-bool ] int-array{ } map-as glUniform4iv ; inline
M: binary-data bind-uniform-bvec4 ( index sequence -- )
1 swap glUniform4iv ; inline
M: object bind-uniform-ivec2 ( index sequence -- ) first2 glUniform2i ; inline
M: binary-data bind-uniform-ivec2 ( index sequence -- ) 1 swap glUniform2iv ; inline
M: object bind-uniform-ivec3 ( index sequence -- ) first3 glUniform3i ; inline
M: binary-data bind-uniform-ivec3 ( index sequence -- ) 1 swap glUniform3iv ; inline
M: object bind-uniform-ivec4 ( index sequence -- ) first4 glUniform4i ; inline
M: binary-data bind-uniform-ivec4 ( index sequence -- ) 1 swap glUniform4iv ; inline
M: object bind-uniform-uvec2 ( index sequence -- ) first2 glUniform2ui ; inline
M: binary-data bind-uniform-uvec2 ( index sequence -- ) 1 swap glUniform2uiv ; inline
M: object bind-uniform-uvec3 ( index sequence -- ) first3 glUniform3ui ; inline
M: binary-data bind-uniform-uvec3 ( index sequence -- ) 1 swap glUniform3uiv ; inline
M: object bind-uniform-uvec4 ( index sequence -- ) first4 glUniform4ui ; inline
M: binary-data bind-uniform-uvec4 ( index sequence -- ) 1 swap glUniform4uiv ; inline
M: object bind-uniform-vec2 ( index sequence -- ) first2 glUniform2f ; inline
M: binary-data bind-uniform-vec2 ( index sequence -- ) 1 swap glUniform2fv ; inline
M: object bind-uniform-vec3 ( index sequence -- ) first3 glUniform3f ; inline
M: binary-data bind-uniform-vec3 ( index sequence -- ) 1 swap glUniform3fv ; inline
M: object bind-uniform-vec4 ( index sequence -- ) first4 glUniform4f ; inline
M: binary-data bind-uniform-vec4 ( index sequence -- ) 1 swap glUniform4fv ; inline
DEFER: [bind-uniform-tuple] DEFER: [bind-uniform-tuple]
:: [bind-uniform-array] ( value>>-quot type texture-unit name dim -- texture-unit' quot ) :: [bind-uniform-array] ( value>>-quot type texture-unit name dim -- texture-unit' quot )
@ -242,37 +345,37 @@ DEFER: [bind-uniform-tuple]
{ index-quot value>>-quot bi* } >quotation :> pre-quot { index-quot value>>-quot bi* } >quotation :> pre-quot
type H{ type H{
{ bool-uniform { dim swap [ >c-bool ] int-array{ } map-as glUniform1iv } } { bool-uniform { dim swap >uniform-bool-array glUniform1iv } }
{ int-uniform { dim swap >int-array glUniform1iv } } { int-uniform { dim swap >uniform-int-array glUniform1iv } }
{ uint-uniform { dim swap >uint-array glUniform1uiv } } { uint-uniform { dim swap >uniform-uint-array glUniform1uiv } }
{ float-uniform { dim swap >float-array glUniform1fv } } { float-uniform { dim swap >uniform-float-array glUniform1fv } }
{ bvec2-uniform { dim swap [ [ >c-bool ] map ] map int-array{ } concat-as glUniform2iv } } { bvec2-uniform { dim swap 2 >uniform-bvec-array glUniform2iv } }
{ ivec2-uniform { dim swap int-array{ } concat-as glUniform2i } } { ivec2-uniform { dim swap 2 >uniform-ivec-array glUniform2i } }
{ uvec2-uniform { dim swap uint-array{ } concat-as glUniform2ui } } { uvec2-uniform { dim swap 2 >uniform-uvec-array glUniform2ui } }
{ vec2-uniform { dim swap float-array{ } concat-as glUniform2f } } { vec2-uniform { dim swap 2 >uniform-vec-array glUniform2f } }
{ bvec3-uniform { dim swap [ [ >c-bool ] map ] map int-array{ } concat-as glUniform3iv } } { bvec3-uniform { dim swap 3 >uniform-bvec-array glUniform3iv } }
{ ivec3-uniform { dim swap int-array{ } concat-as glUniform3i } } { ivec3-uniform { dim swap 3 >uniform-ivec-array glUniform3i } }
{ uvec3-uniform { dim swap uint-array{ } concat-as glUniform3ui } } { uvec3-uniform { dim swap 3 >uniform-uvec-array glUniform3ui } }
{ vec3-uniform { dim swap float-array{ } concat-as glUniform3f } } { vec3-uniform { dim swap 3 >uniform-vec-array glUniform3f } }
{ bvec4-uniform { dim swap [ [ >c-bool ] map ] map int-array{ } concat-as glUniform4iv } } { bvec4-uniform { dim swap 4 >uniform-bvec-array glUniform4iv } }
{ ivec4-uniform { dim swap int-array{ } concat-as glUniform4iv } } { ivec4-uniform { dim swap 4 >uniform-ivec-array glUniform4iv } }
{ uvec4-uniform { dim swap uint-array{ } concat-as glUniform4uiv } } { uvec4-uniform { dim swap 4 >uniform-uvec-array glUniform4uiv } }
{ vec4-uniform { dim swap float-array{ } concat-as glUniform4fv } } { vec4-uniform { dim swap 4 >uniform-vec-array glUniform4fv } }
{ mat2-uniform { [ dim 1 ] dip float-array{ } concat-as concat glUniformMatrix2fv } } { mat2-uniform { [ dim 0 ] dip 2 2 >uniform-matrix-array glUniformMatrix2fv } }
{ mat2x3-uniform { [ dim 1 ] dip float-array{ } concat-as concat glUniformMatrix2x3fv } } { mat2x3-uniform { [ dim 0 ] dip 2 3 >uniform-matrix-array glUniformMatrix2x3fv } }
{ mat2x4-uniform { [ dim 1 ] dip float-array{ } concat-as concat glUniformMatrix2x4fv } } { mat2x4-uniform { [ dim 0 ] dip 2 4 >uniform-matrix-array glUniformMatrix2x4fv } }
{ mat3x2-uniform { [ dim 1 ] dip float-array{ } concat-as concat glUniformMatrix3x2fv } } { mat3x2-uniform { [ dim 0 ] dip 3 2 >uniform-matrix-array glUniformMatrix3x2fv } }
{ mat3-uniform { [ dim 1 ] dip float-array{ } concat-as concat glUniformMatrix3fv } } { mat3-uniform { [ dim 0 ] dip 3 3 >uniform-matrix-array glUniformMatrix3fv } }
{ mat3x4-uniform { [ dim 1 ] dip float-array{ } concat-as concat glUniformMatrix3x4fv } } { mat3x4-uniform { [ dim 0 ] dip 3 4 >uniform-matrix-array glUniformMatrix3x4fv } }
{ mat4x2-uniform { [ dim 1 ] dip float-array{ } concat-as concat glUniformMatrix4x2fv } } { mat4x2-uniform { [ dim 0 ] dip 4 2 >uniform-matrix-array glUniformMatrix4x2fv } }
{ mat4x3-uniform { [ dim 1 ] dip float-array{ } concat-as concat glUniformMatrix4x3fv } } { mat4x3-uniform { [ dim 0 ] dip 4 3 >uniform-matrix-array glUniformMatrix4x3fv } }
{ mat4-uniform { [ dim 1 ] dip float-array{ } concat-as concat glUniformMatrix4fv } } { mat4-uniform { [ dim 0 ] dip 4 4 >uniform-matrix-array glUniformMatrix4fv } }
{ texture-uniform { drop dim dup iota [ texture-unit + ] int-array{ } map-as glUniform1iv } } { texture-uniform { drop dim dup iota [ texture-unit + ] int-array{ } map-as glUniform1iv } }
} at [ uniform invalid-uniform-type ] unless* >quotation :> value-quot } at [ uniform invalid-uniform-type ] unless* >quotation :> value-quot
@ -290,32 +393,32 @@ DEFER: [bind-uniform-tuple]
{ uint-uniform [ glUniform1ui ] } { uint-uniform [ glUniform1ui ] }
{ float-uniform [ glUniform1f ] } { float-uniform [ glUniform1f ] }
{ bvec2-uniform [ [ >c-bool ] map first2 glUniform2i ] } { bvec2-uniform [ bind-uniform-bvec2 ] }
{ ivec2-uniform [ first2 glUniform2i ] } { ivec2-uniform [ bind-uniform-ivec2 ] }
{ uvec2-uniform [ first2 glUniform2ui ] } { uvec2-uniform [ bind-uniform-uvec2 ] }
{ vec2-uniform [ first2 glUniform2f ] } { vec2-uniform [ bind-uniform-vec2 ] }
{ bvec3-uniform [ [ >c-bool ] map first3 glUniform3i ] } { bvec3-uniform [ bind-uniform-bvec3 ] }
{ ivec3-uniform [ first3 glUniform3i ] } { ivec3-uniform [ bind-uniform-ivec3 ] }
{ uvec3-uniform [ first3 glUniform3ui ] } { uvec3-uniform [ bind-uniform-uvec3 ] }
{ vec3-uniform [ first3 glUniform3f ] } { vec3-uniform [ bind-uniform-vec3 ] }
{ bvec4-uniform [ [ >c-bool ] map first4 glUniform4i ] } { bvec4-uniform [ bind-uniform-bvec4 ] }
{ ivec4-uniform [ first4 glUniform4i ] } { ivec4-uniform [ bind-uniform-ivec4 ] }
{ uvec4-uniform [ first4 glUniform4ui ] } { uvec4-uniform [ bind-uniform-uvec4 ] }
{ vec4-uniform [ first4 glUniform4f ] } { vec4-uniform [ bind-uniform-vec4 ] }
{ mat2-uniform [ [ 1 1 ] dip float-array{ } concat-as glUniformMatrix2fv ] } { mat2-uniform [ [ 1 0 ] dip 2 2 >uniform-matrix glUniformMatrix2fv ] }
{ mat2x3-uniform [ [ 1 1 ] dip float-array{ } concat-as glUniformMatrix2x3fv ] } { mat2x3-uniform [ [ 1 0 ] dip 2 3 >uniform-matrix glUniformMatrix2x3fv ] }
{ mat2x4-uniform [ [ 1 1 ] dip float-array{ } concat-as glUniformMatrix2x4fv ] } { mat2x4-uniform [ [ 1 0 ] dip 2 4 >uniform-matrix glUniformMatrix2x4fv ] }
{ mat3x2-uniform [ [ 1 1 ] dip float-array{ } concat-as glUniformMatrix3x2fv ] } { mat3x2-uniform [ [ 1 0 ] dip 3 2 >uniform-matrix glUniformMatrix3x2fv ] }
{ mat3-uniform [ [ 1 1 ] dip float-array{ } concat-as glUniformMatrix3fv ] } { mat3-uniform [ [ 1 0 ] dip 3 3 >uniform-matrix glUniformMatrix3fv ] }
{ mat3x4-uniform [ [ 1 1 ] dip float-array{ } concat-as glUniformMatrix3x4fv ] } { mat3x4-uniform [ [ 1 0 ] dip 3 4 >uniform-matrix glUniformMatrix3x4fv ] }
{ mat4x2-uniform [ [ 1 1 ] dip float-array{ } concat-as glUniformMatrix4x2fv ] } { mat4x2-uniform [ [ 1 0 ] dip 4 2 >uniform-matrix glUniformMatrix4x2fv ] }
{ mat4x3-uniform [ [ 1 1 ] dip float-array{ } concat-as glUniformMatrix4x3fv ] } { mat4x3-uniform [ [ 1 0 ] dip 4 3 >uniform-matrix glUniformMatrix4x3fv ] }
{ mat4-uniform [ [ 1 1 ] dip float-array{ } concat-as glUniformMatrix4fv ] } { mat4-uniform [ [ 1 0 ] dip 4 4 >uniform-matrix glUniformMatrix4fv ] }
{ texture-uniform { drop texture-unit glUniform1i } } { texture-uniform { drop texture-unit glUniform1i } }
} at [ uniform invalid-uniform-type ] unless* >quotation :> value-quot } at [ uniform invalid-uniform-type ] unless* >quotation :> value-quot