{ "An " { $link index-elements } " value submits vertex array elements in an order specified by an array of indexes." }
{ "A " { $link multi-index-range } " value submits multiple sequential slices of a vertex array." }
{ "A " { $link multi-index-elements } " value submits multiple separate lists of indexed vertex array elements." }
+{ "Specialized arrays of " { $link c:uchar } ", " { $link c:ushort } ", or " { $link c:uint } " elements may also be used directly as arrays of indexes." }
} } ;
ARTICLE: "gpu.render" "Rendering"
vocabs.parser words math.vectors.simd ;
FROM: math => float ;
QUALIFIED-WITH: alien.c-types c
-SPECIALIZED-ARRAY: c:float
-SPECIALIZED-ARRAY: int
-SPECIALIZED-ARRAY: uint
-SPECIALIZED-ARRAY: void*
+SPECIALIZED-ARRAYS: c:float c:int c:uchar c:ushort c:uint c:void* ;
IN: gpu.render
UNION: ?integer integer POSTPONE: f ;
index-range
multi-index-range
index-elements
- multi-index-elements ;
+ multi-index-elements
+ uchar-array
+ ushort-array
+ uint-array ;
VARIANT: primitive-mode
points-mode
GENERIC# render-vertex-indexes-instanced 1 ( primitive-mode vertex-indexes instances -- )
+GENERIC: gl-array-element-type ( array -- type )
+M: uchar-array gl-array-element-type drop GL_UNSIGNED_BYTE ; inline
+M: ushort-array gl-array-element-type drop GL_UNSIGNED_SHORT ; inline
+M: uint-array gl-array-element-type drop GL_UNSIGNED_INT ; inline
+
M: index-range render-vertex-indexes
[ gl-primitive-mode ] [ [ start>> ] [ count>> ] bi ] bi* glDrawArrays ;
[ ] tri*
swap index-buffer [ swap glDrawElementsInstanced ] with-gpu-data-ptr ;
+M: specialized-array render-vertex-indexes
+ GL_ELEMENT_ARRAY_BUFFER 0 glBindBuffer
+ [ gl-primitive-mode ]
+ [ [ length ] [ gl-array-element-type ] [ >c-ptr ] tri ] bi*
+ glDrawElements ;
+
+M: specialized-array render-vertex-indexes-instanced
+ GL_ELEMENT_ARRAY_BUFFER 0 glBindBuffer
+ [ gl-primitive-mode ]
+ [ [ length ] [ gl-array-element-type ] [ >c-ptr ] tri ]
+ [ ] tri* glDrawElementsInstanced ;
+
M: multi-index-elements render-vertex-indexes
[ gl-primitive-mode ]
[ { [ counts>> ] [ index-type>> gl-index-type ] [ ptrs>> dup length ] [ buffer>> ] } cleave ]