gpu.render: allow uniform-tuples to hand off specialized-arrays, structs, simd types, etc. directly to glUniform*v functions when binding uniforms
							parent
							
								
									09a4080772
								
							
						
					
					
						commit
						a173171e34
					
				| 
						 | 
				
			
			@ -62,7 +62,7 @@ $nl
 | 
			
		|||
    { "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
 | 
			
		||||
    { { $link mat2-uniform } ", " { $link mat2x3-uniform } ", " { $link mat2x4-uniform } }
 | 
			
		||||
    { { $link mat3x2-uniform } ", " { $link mat3-uniform } ", " { $link mat3x4-uniform } }
 | 
			
		||||
| 
						 | 
				
			
			@ -71,7 +71,7 @@ $nl
 | 
			
		|||
"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." }
 | 
			
		||||
{ "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
 | 
			
		||||
"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."
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,6 +1,6 @@
 | 
			
		|||
! (c)2009 Joe Groff bsd license
 | 
			
		||||
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
 | 
			
		||||
generic generic.parser gpu gpu.buffers gpu.framebuffers
 | 
			
		||||
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
 | 
			
		||||
opengl.gl parser quotations sequences slots sorting
 | 
			
		||||
specialized-arrays strings ui.gadgets.worlds variants
 | 
			
		||||
vocabs.parser words ;
 | 
			
		||||
vocabs.parser words math.vectors.simd ;
 | 
			
		||||
FROM: math => float ;
 | 
			
		||||
QUALIFIED-WITH: alien.c-types c
 | 
			
		||||
SPECIALIZED-ARRAY: c:float
 | 
			
		||||
| 
						 | 
				
			
			@ -235,6 +235,109 @@ DEFER: uniform-texture-accessors
 | 
			
		|||
    0 swap [ texture-accessor>cleave ] map nip
 | 
			
		||||
    \ 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]
 | 
			
		||||
 | 
			
		||||
:: [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
 | 
			
		||||
 | 
			
		||||
    type H{
 | 
			
		||||
        { bool-uniform  { dim swap [ >c-bool ] int-array{ } map-as glUniform1iv  } }
 | 
			
		||||
        { int-uniform   { dim swap >int-array   glUniform1iv  } }
 | 
			
		||||
        { uint-uniform  { dim swap >uint-array  glUniform1uiv } }
 | 
			
		||||
        { float-uniform { dim swap >float-array glUniform1fv  } }
 | 
			
		||||
        { bool-uniform  { dim swap >uniform-bool-array  glUniform1iv  } }
 | 
			
		||||
        { int-uniform   { dim swap >uniform-int-array   glUniform1iv  } }
 | 
			
		||||
        { uint-uniform  { dim swap >uniform-uint-array  glUniform1uiv } }
 | 
			
		||||
        { float-uniform { dim swap >uniform-float-array glUniform1fv  } }
 | 
			
		||||
 | 
			
		||||
        { bvec2-uniform { dim swap [ [ >c-bool ] map ] map int-array{ } concat-as glUniform2iv  } }
 | 
			
		||||
        { ivec2-uniform { dim swap int-array{ }   concat-as glUniform2i  } }
 | 
			
		||||
        { uvec2-uniform { dim swap uint-array{ }  concat-as glUniform2ui } }
 | 
			
		||||
        { vec2-uniform  { dim swap float-array{ } concat-as glUniform2f  } }
 | 
			
		||||
        { bvec2-uniform { dim swap 2 >uniform-bvec-array glUniform2iv  } }
 | 
			
		||||
        { ivec2-uniform { dim swap 2 >uniform-ivec-array glUniform2i  } }
 | 
			
		||||
        { uvec2-uniform { dim swap 2 >uniform-uvec-array glUniform2ui } }
 | 
			
		||||
        { vec2-uniform  { dim swap 2 >uniform-vec-array  glUniform2f  } }
 | 
			
		||||
 | 
			
		||||
        { bvec3-uniform { dim swap [ [ >c-bool ] map ] map int-array{ } concat-as glUniform3iv  } }
 | 
			
		||||
        { ivec3-uniform { dim swap int-array{ }   concat-as glUniform3i  } }
 | 
			
		||||
        { uvec3-uniform { dim swap uint-array{ }  concat-as glUniform3ui } }
 | 
			
		||||
        { vec3-uniform  { dim swap float-array{ } concat-as glUniform3f  } }
 | 
			
		||||
        { bvec3-uniform { dim swap 3 >uniform-bvec-array glUniform3iv  } }
 | 
			
		||||
        { ivec3-uniform { dim swap 3 >uniform-ivec-array glUniform3i  } }
 | 
			
		||||
        { uvec3-uniform { dim swap 3 >uniform-uvec-array glUniform3ui } }
 | 
			
		||||
        { vec3-uniform  { dim swap 3 >uniform-vec-array  glUniform3f  } }
 | 
			
		||||
 | 
			
		||||
        { bvec4-uniform { dim swap [ [ >c-bool ] map ] map int-array{ } concat-as glUniform4iv  } }
 | 
			
		||||
        { ivec4-uniform { dim swap int-array{ }   concat-as glUniform4iv  } }
 | 
			
		||||
        { uvec4-uniform { dim swap uint-array{ }  concat-as glUniform4uiv } }
 | 
			
		||||
        { vec4-uniform  { dim swap float-array{ } concat-as glUniform4fv  } }
 | 
			
		||||
        { bvec4-uniform { dim swap 4 >uniform-bvec-array glUniform4iv  } }
 | 
			
		||||
        { ivec4-uniform { dim swap 4 >uniform-ivec-array glUniform4iv  } }
 | 
			
		||||
        { uvec4-uniform { dim swap 4 >uniform-uvec-array glUniform4uiv } }
 | 
			
		||||
        { vec4-uniform  { dim swap 4 >uniform-vec-array  glUniform4fv  } }
 | 
			
		||||
 | 
			
		||||
        { mat2-uniform   { [ dim 1 ] dip float-array{ } concat-as concat glUniformMatrix2fv   } }
 | 
			
		||||
        { mat2x3-uniform { [ dim 1 ] dip float-array{ } concat-as concat glUniformMatrix2x3fv } }
 | 
			
		||||
        { mat2x4-uniform { [ dim 1 ] dip float-array{ } concat-as concat glUniformMatrix2x4fv } }
 | 
			
		||||
        { mat2-uniform   { [ dim 0 ] dip 2 2 >uniform-matrix-array glUniformMatrix2fv   } }
 | 
			
		||||
        { mat2x3-uniform { [ dim 0 ] dip 2 3 >uniform-matrix-array glUniformMatrix2x3fv } }
 | 
			
		||||
        { mat2x4-uniform { [ dim 0 ] dip 2 4 >uniform-matrix-array glUniformMatrix2x4fv } }
 | 
			
		||||
 | 
			
		||||
        { mat3x2-uniform { [ dim 1 ] dip float-array{ } concat-as concat glUniformMatrix3x2fv } }
 | 
			
		||||
        { mat3-uniform   { [ dim 1 ] dip float-array{ } concat-as concat glUniformMatrix3fv   } }
 | 
			
		||||
        { mat3x4-uniform { [ dim 1 ] dip float-array{ } concat-as concat glUniformMatrix3x4fv } }
 | 
			
		||||
        { mat3x2-uniform { [ dim 0 ] dip 3 2 >uniform-matrix-array glUniformMatrix3x2fv } }
 | 
			
		||||
        { mat3-uniform   { [ dim 0 ] dip 3 3 >uniform-matrix-array glUniformMatrix3fv   } }
 | 
			
		||||
        { mat3x4-uniform { [ dim 0 ] dip 3 4 >uniform-matrix-array glUniformMatrix3x4fv } }
 | 
			
		||||
 | 
			
		||||
        { mat4x2-uniform { [ dim 1 ] dip float-array{ } concat-as concat glUniformMatrix4x2fv } }
 | 
			
		||||
        { mat4x3-uniform { [ dim 1 ] dip float-array{ } concat-as concat glUniformMatrix4x3fv } }
 | 
			
		||||
        { mat4-uniform   { [ dim 1 ] dip float-array{ } concat-as concat glUniformMatrix4fv   } }
 | 
			
		||||
        { mat4x2-uniform { [ dim 0 ] dip 4 2 >uniform-matrix-array glUniformMatrix4x2fv } }
 | 
			
		||||
        { mat4x3-uniform { [ dim 0 ] dip 4 3 >uniform-matrix-array glUniformMatrix4x3fv } }
 | 
			
		||||
        { mat4-uniform   { [ dim 0 ] dip 4 4 >uniform-matrix-array glUniformMatrix4fv   } }
 | 
			
		||||
 | 
			
		||||
        { texture-uniform { drop dim dup iota [ texture-unit + ] int-array{ } map-as glUniform1iv } }
 | 
			
		||||
    } at [ uniform invalid-uniform-type ] unless* >quotation :> value-quot
 | 
			
		||||
| 
						 | 
				
			
			@ -290,32 +393,32 @@ DEFER: [bind-uniform-tuple]
 | 
			
		|||
        { uint-uniform  [ glUniform1ui ] }
 | 
			
		||||
        { float-uniform [ glUniform1f  ] }
 | 
			
		||||
 | 
			
		||||
        { bvec2-uniform [ [ >c-bool ] map first2 glUniform2i  ] }
 | 
			
		||||
        { ivec2-uniform [ first2 glUniform2i  ] }
 | 
			
		||||
        { uvec2-uniform [ first2 glUniform2ui ] }
 | 
			
		||||
        { vec2-uniform  [ first2 glUniform2f  ] }
 | 
			
		||||
        { bvec2-uniform [ bind-uniform-bvec2 ] }
 | 
			
		||||
        { ivec2-uniform [ bind-uniform-ivec2 ] }
 | 
			
		||||
        { uvec2-uniform [ bind-uniform-uvec2 ] }
 | 
			
		||||
        { vec2-uniform  [ bind-uniform-vec2  ] }
 | 
			
		||||
 | 
			
		||||
        { bvec3-uniform [ [ >c-bool ] map first3 glUniform3i  ] }
 | 
			
		||||
        { ivec3-uniform [ first3 glUniform3i  ] }
 | 
			
		||||
        { uvec3-uniform [ first3 glUniform3ui ] }
 | 
			
		||||
        { vec3-uniform  [ first3 glUniform3f  ] }
 | 
			
		||||
        { bvec3-uniform [ bind-uniform-bvec3 ] }
 | 
			
		||||
        { ivec3-uniform [ bind-uniform-ivec3 ] }
 | 
			
		||||
        { uvec3-uniform [ bind-uniform-uvec3 ] }
 | 
			
		||||
        { vec3-uniform  [ bind-uniform-vec3  ] }
 | 
			
		||||
 | 
			
		||||
        { bvec4-uniform [ [ >c-bool ] map first4 glUniform4i  ] }
 | 
			
		||||
        { ivec4-uniform [ first4 glUniform4i  ] }
 | 
			
		||||
        { uvec4-uniform [ first4 glUniform4ui ] }
 | 
			
		||||
        { vec4-uniform  [ first4 glUniform4f  ] }
 | 
			
		||||
        { bvec4-uniform [ bind-uniform-bvec4 ] }
 | 
			
		||||
        { ivec4-uniform [ bind-uniform-ivec4 ] }
 | 
			
		||||
        { uvec4-uniform [ bind-uniform-uvec4 ] }
 | 
			
		||||
        { vec4-uniform  [ bind-uniform-vec4  ] }
 | 
			
		||||
 | 
			
		||||
        { mat2-uniform   [ [ 1 1 ] dip float-array{ } concat-as glUniformMatrix2fv   ] }
 | 
			
		||||
        { mat2x3-uniform [ [ 1 1 ] dip float-array{ } concat-as glUniformMatrix2x3fv ] }
 | 
			
		||||
        { mat2x4-uniform [ [ 1 1 ] dip float-array{ } concat-as glUniformMatrix2x4fv ] }
 | 
			
		||||
        { mat2-uniform   [ [ 1 0 ] dip 2 2 >uniform-matrix glUniformMatrix2fv   ] }
 | 
			
		||||
        { mat2x3-uniform [ [ 1 0 ] dip 2 3 >uniform-matrix glUniformMatrix2x3fv ] }
 | 
			
		||||
        { mat2x4-uniform [ [ 1 0 ] dip 2 4 >uniform-matrix glUniformMatrix2x4fv ] }
 | 
			
		||||
 | 
			
		||||
        { mat3x2-uniform [ [ 1 1 ] dip float-array{ } concat-as glUniformMatrix3x2fv ] }
 | 
			
		||||
        { mat3-uniform   [ [ 1 1 ] dip float-array{ } concat-as glUniformMatrix3fv   ] }
 | 
			
		||||
        { mat3x4-uniform [ [ 1 1 ] dip float-array{ } concat-as glUniformMatrix3x4fv ] }
 | 
			
		||||
        { mat3x2-uniform [ [ 1 0 ] dip 3 2 >uniform-matrix glUniformMatrix3x2fv ] }
 | 
			
		||||
        { mat3-uniform   [ [ 1 0 ] dip 3 3 >uniform-matrix glUniformMatrix3fv   ] }
 | 
			
		||||
        { mat3x4-uniform [ [ 1 0 ] dip 3 4 >uniform-matrix glUniformMatrix3x4fv ] }
 | 
			
		||||
 | 
			
		||||
        { mat4x2-uniform [ [ 1 1 ] dip float-array{ } concat-as glUniformMatrix4x2fv ] }
 | 
			
		||||
        { mat4x3-uniform [ [ 1 1 ] dip float-array{ } concat-as glUniformMatrix4x3fv ] }
 | 
			
		||||
        { mat4-uniform   [ [ 1 1 ] dip float-array{ } concat-as glUniformMatrix4fv   ] }
 | 
			
		||||
        { mat4x2-uniform [ [ 1 0 ] dip 4 2 >uniform-matrix glUniformMatrix4x2fv ] }
 | 
			
		||||
        { mat4x3-uniform [ [ 1 0 ] dip 4 3 >uniform-matrix glUniformMatrix4x3fv ] }
 | 
			
		||||
        { mat4-uniform   [ [ 1 0 ] dip 4 4 >uniform-matrix glUniformMatrix4fv   ] }
 | 
			
		||||
 | 
			
		||||
        { texture-uniform { drop texture-unit glUniform1i } }
 | 
			
		||||
    } at [ uniform invalid-uniform-type ] unless* >quotation :> value-quot
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue