diff --git a/extra/gpu/render/render-docs.factor b/extra/gpu/render/render-docs.factor index 95187b6ce7..4891a2601a 100644 --- a/extra/gpu/render/render-docs.factor +++ b/extra/gpu/render/render-docs.factor @@ -293,6 +293,7 @@ HELP: vertex-indexes { "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" diff --git a/extra/gpu/render/render.factor b/extra/gpu/render/render.factor index d1cb0357ed..1d80a86cf6 100755 --- a/extra/gpu/render/render.factor +++ b/extra/gpu/render/render.factor @@ -11,10 +11,7 @@ specialized-arrays strings ui.gadgets.worlds variants 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 ; @@ -98,7 +95,10 @@ UNION: vertex-indexes index-range multi-index-range index-elements - multi-index-elements ; + multi-index-elements + uchar-array + ushort-array + uint-array ; VARIANT: primitive-mode points-mode @@ -145,6 +145,11 @@ GENERIC: render-vertex-indexes ( primitive-mode vertex-indexes -- ) 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 ; @@ -167,6 +172,18 @@ M: index-elements render-vertex-indexes-instanced [ ] 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 ]