Simd

clay.simd.Simd (extern class)

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(): Int

Which 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): Void

Transforms 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): Void

Same 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): Void

Same 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): Void

Same 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): Void

Transforms 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): Void

Gathers 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): Void

Reads 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): Void

Same 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): Void

Same 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): Void

Same 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): Void

Writes 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): Void

Writes 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): Void

Writes 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): Void

Writes 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): Void

Writes 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): Void

Writes 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): Void

Emits 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

Writes 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"