Simd
Batched geometry kernels operating on raw pointers (native C++).
Every function is a leaf call: no allocation, no callback into haxe, so no GC collection can happen while the provided pointers are in use. Callers must acquire pointers right before the call, keep the owning haxe objects alive on the stack for the duration of the call, and never cache raw pointers across calls.
The vectorized implementations (SSE2 on x86, NEON on ARM) are picked
at compile time, with a plain C++ fallback. Define
linc_simd_force_scalar to force the plain C++ path everywhere
(useful to measure batching gains without vectorization).
Static Members
mode(): IntWhich implementation was compiled in: 0 = scalar, 1 = SSE2, 2 = NEON
| Returns |
|---|
| Int |
transformAffineIndexedF32(dst: cpp.RawPointer<cpp.Float32>, dstStrideFloats: Int, verts: cpp.RawPointer<cpp.Float32>, vertStrideFloats: Int, indices: cpp.RawPointer<Int>, indexCount: Int, a: cpp.Float32, b: cpp.Float32, c: cpp.Float32, d: cpp.Float32, tx: cpp.Float32, ty: cpp.Float32, z: cpp.Float32, textureSlot: cpp.Float32, writeSlot: Bool): VoidTransforms indexCount points gathered from verts (32-bit floats)
via indices with the 2x3 affine matrix (a,b,c,d,tx,ty), writing
sequential strided vertices [x y z (slot)] into dst.
| Name | Type |
|---|---|
dst |
cpp.RawPointer<cpp.Float32> |
dstStrideFloats |
Int |
verts |
cpp.RawPointer<cpp.Float32> |
vertStrideFloats |
Int |
indices |
cpp.RawPointer<Int> |
indexCount |
Int |
a |
cpp.Float32 |
b |
cpp.Float32 |
c |
cpp.Float32 |
d |
cpp.Float32 |
tx |
cpp.Float32 |
ty |
cpp.Float32 |
z |
cpp.Float32 |
textureSlot |
cpp.Float32 |
writeSlot |
Bool |
transformAffineIndexedF64(dst: cpp.RawPointer<cpp.Float32>, dstStrideFloats: Int, verts: cpp.RawPointer<Float>, vertStrideFloats: Int, indices: cpp.RawPointer<Int>, indexCount: Int, a: cpp.Float32, b: cpp.Float32, c: cpp.Float32, d: cpp.Float32, tx: cpp.Float32, ty: cpp.Float32, z: cpp.Float32, textureSlot: cpp.Float32, writeSlot: Bool): VoidSame as transformAffineIndexedF32 with a 64-bit float source
(haxe Array<Float> holds 64-bit values on this target).
| Name | Type |
|---|---|
dst |
cpp.RawPointer<cpp.Float32> |
dstStrideFloats |
Int |
verts |
cpp.RawPointer<Float> |
vertStrideFloats |
Int |
indices |
cpp.RawPointer<Int> |
indexCount |
Int |
a |
cpp.Float32 |
b |
cpp.Float32 |
c |
cpp.Float32 |
d |
cpp.Float32 |
tx |
cpp.Float32 |
ty |
cpp.Float32 |
z |
cpp.Float32 |
textureSlot |
cpp.Float32 |
writeSlot |
Bool |
transformAffineIndexedAttrsF32(dst: cpp.RawPointer<cpp.Float32>, dstStrideFloats: Int, verts: cpp.RawPointer<cpp.Float32>, vertStrideFloats: Int, indices: cpp.RawPointer<Int>, indexCount: Int, a: cpp.Float32, b: cpp.Float32, c: cpp.Float32, d: cpp.Float32, tx: cpp.Float32, ty: cpp.Float32, z: cpp.Float32, textureSlot: cpp.Float32, writeSlot: Bool, srcAttrCount: Int, dstAttrCount: Int): VoidSame as transformAffineIndexedF32 for meshes carrying custom float
attributes interleaved with positions ([x y attr0..attrN] source,
[x y z (slot) attr0..attrM] destination, zero-padded).
| Name | Type |
|---|---|
dst |
cpp.RawPointer<cpp.Float32> |
dstStrideFloats |
Int |
verts |
cpp.RawPointer<cpp.Float32> |
vertStrideFloats |
Int |
indices |
cpp.RawPointer<Int> |
indexCount |
Int |
a |
cpp.Float32 |
b |
cpp.Float32 |
c |
cpp.Float32 |
d |
cpp.Float32 |
tx |
cpp.Float32 |
ty |
cpp.Float32 |
z |
cpp.Float32 |
textureSlot |
cpp.Float32 |
writeSlot |
Bool |
srcAttrCount |
Int |
dstAttrCount |
Int |
transformAffineIndexedAttrsF64(dst: cpp.RawPointer<cpp.Float32>, dstStrideFloats: Int, verts: cpp.RawPointer<Float>, vertStrideFloats: Int, indices: cpp.RawPointer<Int>, indexCount: Int, a: cpp.Float32, b: cpp.Float32, c: cpp.Float32, d: cpp.Float32, tx: cpp.Float32, ty: cpp.Float32, z: cpp.Float32, textureSlot: cpp.Float32, writeSlot: Bool, srcAttrCount: Int, dstAttrCount: Int): VoidSame as transformAffineIndexedAttrsF32 with a 64-bit float source.
| Name | Type |
|---|---|
dst |
cpp.RawPointer<cpp.Float32> |
dstStrideFloats |
Int |
verts |
cpp.RawPointer<Float> |
vertStrideFloats |
Int |
indices |
cpp.RawPointer<Int> |
indexCount |
Int |
a |
cpp.Float32 |
b |
cpp.Float32 |
c |
cpp.Float32 |
d |
cpp.Float32 |
tx |
cpp.Float32 |
ty |
cpp.Float32 |
z |
cpp.Float32 |
textureSlot |
cpp.Float32 |
writeSlot |
Bool |
srcAttrCount |
Int |
dstAttrCount |
Int |
transformQuadCorners(dst: cpp.RawPointer<cpp.Float32>, dstStrideFloats: Int, w: cpp.Float32, h: cpp.Float32, a: cpp.Float32, b: cpp.Float32, c: cpp.Float32, d: cpp.Float32, tx: cpp.Float32, ty: cpp.Float32, z: cpp.Float32, textureSlot: cpp.Float32, writeSlot: Bool, flipOrder: Bool): VoidTransforms the 4 corners of a (w,h) rectangle with the 2x3 affine
matrix and writes 4 strided vertices [x y z (slot)] into dst.
Corner order: flipOrder=true -> br, bl, tl, tr ; false -> tl, tr, br, bl.
| Name | Type |
|---|---|
dst |
cpp.RawPointer<cpp.Float32> |
dstStrideFloats |
Int |
w |
cpp.Float32 |
h |
cpp.Float32 |
a |
cpp.Float32 |
b |
cpp.Float32 |
c |
cpp.Float32 |
d |
cpp.Float32 |
tx |
cpp.Float32 |
ty |
cpp.Float32 |
z |
cpp.Float32 |
textureSlot |
cpp.Float32 |
writeSlot |
Bool |
flipOrder |
Bool |
scaleUVIndexedF64(dst: cpp.RawPointer<cpp.Float32>, uvs: cpp.RawPointer<Float>, indices: cpp.RawPointer<Int>, indexCount: Int, uvFactorX: Float, uvFactorY: Float): VoidGathers indexCount UV pairs from uvs (64-bit source, stride 2)
via indices, multiplies by (uvFactorX, uvFactorY) in 64-bit and
writes sequential 32-bit pairs into dst.
| Name | Type |
|---|---|
dst |
cpp.RawPointer<cpp.Float32> |
uvs |
cpp.RawPointer<Float> |
indices |
cpp.RawPointer<Int> |
indexCount |
Int |
uvFactorX |
Float |
uvFactorY |
Float |
premultiplyRGBA(dst: cpp.RawPointer<cpp.Float32>, src: cpp.RawPointer<cpp.Float32>, count: Int, globalAlpha: cpp.Float32, premultiply: Bool, zeroAlpha: Bool): VoidReads count sequential RGBA colors from src, computes
outA = globalAlpha * srcA, multiplies RGB by outA when premultiply
is set, forces the stored alpha to 0 when zeroAlpha is set (RGB
keep the premultiplied values), and writes sequential RGBA into dst.
| Name | Type |
|---|---|
dst |
cpp.RawPointer<cpp.Float32> |
src |
cpp.RawPointer<cpp.Float32> |
count |
Int |
globalAlpha |
cpp.Float32 |
premultiply |
Bool |
zeroAlpha |
Bool |
premultiplyRGBAIndexed(dst: cpp.RawPointer<cpp.Float32>, src: cpp.RawPointer<cpp.Float32>, indices: cpp.RawPointer<Int>, indexCount: Int, globalAlpha: cpp.Float32, premultiply: Bool, zeroAlpha: Bool): VoidSame as premultiplyRGBA but colors are gathered from src via indices.
| Name | Type |
|---|---|
dst |
cpp.RawPointer<cpp.Float32> |
src |
cpp.RawPointer<cpp.Float32> |
indices |
cpp.RawPointer<Int> |
indexCount |
Int |
globalAlpha |
cpp.Float32 |
premultiply |
Bool |
zeroAlpha |
Bool |
premultiplyARGB32(dst: cpp.RawPointer<cpp.Float32>, src: cpp.RawPointer<cpp.UInt32>, count: Int, globalAlpha: cpp.Float32, premultiply: Bool, zeroAlpha: Bool): VoidSame as premultiplyRGBA but the source colors are packed 32-bit
integers laid out as 0xAARRGGBB, decoded to floats in [0,1].
| Name | Type |
|---|---|
dst |
cpp.RawPointer<cpp.Float32> |
src |
cpp.RawPointer<cpp.UInt32> |
count |
Int |
globalAlpha |
cpp.Float32 |
premultiply |
Bool |
zeroAlpha |
Bool |
premultiplyARGB32Indexed(dst: cpp.RawPointer<cpp.Float32>, src: cpp.RawPointer<cpp.UInt32>, indices: cpp.RawPointer<Int>, indexCount: Int, globalAlpha: cpp.Float32, premultiply: Bool, zeroAlpha: Bool): VoidSame as premultiplyARGB32 but colors are gathered from src via indices.
| Name | Type |
|---|---|
dst |
cpp.RawPointer<cpp.Float32> |
src |
cpp.RawPointer<cpp.UInt32> |
indices |
cpp.RawPointer<Int> |
indexCount |
Int |
globalAlpha |
cpp.Float32 |
premultiply |
Bool |
zeroAlpha |
Bool |
fillColorRGBA(dst: cpp.RawPointer<cpp.Float32>, count: Int, r: cpp.Float32, g: cpp.Float32, b: cpp.Float32, a: cpp.Float32): VoidWrites count copies of the RGBA color into dst.
| Name | Type |
|---|---|
dst |
cpp.RawPointer<cpp.Float32> |
count |
Int |
r |
cpp.Float32 |
g |
cpp.Float32 |
b |
cpp.Float32 |
a |
cpp.Float32 |
fillFloats(dst: cpp.RawPointer<cpp.Float32>, count: Int, value: cpp.Float32): VoidWrites count copies of value into dst.
| Name | Type |
|---|---|
dst |
cpp.RawPointer<cpp.Float32> |
count |
Int |
value |
cpp.Float32 |
fillIndicesSequentialU16(dst: cpp.RawPointer<cpp.UInt16>, start: Int, count: Int): VoidWrites count sequential indices start, start+1, ... into dst.
| Name | Type |
|---|---|
dst |
cpp.RawPointer<cpp.UInt16> |
start |
Int |
count |
Int |
putQuadIndicesU16(dst: cpp.RawPointer<cpp.UInt16>, base: Int): VoidWrites the 6 indices of a quad (two triangles): base, base+1, base+2, base, base+2, base+3.
| Name | Type |
|---|---|
dst |
cpp.RawPointer<cpp.UInt16> |
base |
Int |
putQuadWireframeIndicesU16(dst: cpp.RawPointer<cpp.UInt16>, base: Int): VoidWrites the 12 line indices of a quad wireframe: (b,b+1),(b+1,b+2),(b+2,b),(b,b+2),(b+2,b+3),(b+3,b).
| Name | Type |
|---|---|
dst |
cpp.RawPointer<cpp.UInt16> |
base |
Int |
fillQuadAttrsF64(dst: cpp.RawPointer<cpp.Float32>, dstStrideFloats: Int, attrOffset: Int, attrs: cpp.RawPointer<Float>, srcCount: Int, dstCount: Int): VoidWrites the same attribute values on the 4 corners of a quad, at
attrOffset floats inside each vertex of stride dstStrideFloats,
reading srcCount values from attrs (may be null when 0) and
zero-padding up to dstCount.
| Name | Type |
|---|---|
dst |
cpp.RawPointer<cpp.Float32> |
dstStrideFloats |
Int |
attrOffset |
Int |
attrs |
cpp.RawPointer<Float> |
srcCount |
Int |
dstCount |
Int |
emitQuad(pos: cpp.RawPointer<cpp.Float32>, posStrideFloats: Int, idx: cpp.RawPointer<cpp.UInt16>, indexBase: Int, color: cpp.RawPointer<cpp.Float32>, uv: cpp.RawPointer<cpp.Float32>, w: cpp.Float32, h: cpp.Float32, a: cpp.Float32, b: cpp.Float32, c: cpp.Float32, d: cpp.Float32, tx: cpp.Float32, ty: cpp.Float32, z: cpp.Float32, textureSlot: cpp.Float32, writeSlot: Bool, flipOrder: Bool, wireframe: Bool, colR: cpp.Float32, colG: cpp.Float32, colB: cpp.Float32, colA: cpp.Float32, u0: cpp.Float32, v0: cpp.Float32, u1: cpp.Float32, v1: cpp.Float32, u2: cpp.Float32, v2: cpp.Float32, u3: cpp.Float32, v3: cpp.Float32): VoidEmits a complete quad in a single call: indices (6 triangle indices,
or 12 line indices when wireframe is set), 4 transformed corners,
4 identical colors and 4 uv pairs. One call per quad keeps the
per-call overhead negligible compared to the quad's small workload.
| Name | Type |
|---|---|
pos |
cpp.RawPointer<cpp.Float32> |
posStrideFloats |
Int |
idx |
cpp.RawPointer<cpp.UInt16> |
indexBase |
Int |
color |
cpp.RawPointer<cpp.Float32> |
uv |
cpp.RawPointer<cpp.Float32> |
w |
cpp.Float32 |
h |
cpp.Float32 |
a |
cpp.Float32 |
b |
cpp.Float32 |
c |
cpp.Float32 |
d |
cpp.Float32 |
tx |
cpp.Float32 |
ty |
cpp.Float32 |
z |
cpp.Float32 |
textureSlot |
cpp.Float32 |
writeSlot |
Bool |
flipOrder |
Bool |
wireframe |
Bool |
colR |
cpp.Float32 |
colG |
cpp.Float32 |
colB |
cpp.Float32 |
colA |
cpp.Float32 |
u0 |
cpp.Float32 |
v0 |
cpp.Float32 |
u1 |
cpp.Float32 |
v1 |
cpp.Float32 |
u2 |
cpp.Float32 |
v2 |
cpp.Float32 |
u3 |
cpp.Float32 |
v3 |
cpp.Float32 |
storeUV4(dst: cpp.RawPointer<cpp.Float32>, u0: cpp.Float32, v0: cpp.Float32, u1: cpp.Float32, v1: cpp.Float32, u2: cpp.Float32, v2: cpp.Float32, u3: cpp.Float32, v3: cpp.Float32): VoidWrites 4 finished UV pairs into dst (8 contiguous floats).
| Name | Type |
|---|---|
dst |
cpp.RawPointer<cpp.Float32> |
u0 |
cpp.Float32 |
v0 |
cpp.Float32 |
u1 |
cpp.Float32 |
v1 |
cpp.Float32 |
u2 |
cpp.Float32 |
v2 |
cpp.Float32 |
u3 |
cpp.Float32 |
v3 |
cpp.Float32 |
Metadata
| Name | Parameters |
|---|---|
:build |
clay.simd.Linc.touch() |
:build |
clay.simd.Linc.xml("simd", "../simd") |
:include |
"linc_simd.h" |