1
0
mirror of https://github.com/blawar/GLideN64.git synced 2024-07-02 09:03:37 +00:00

arm neon: add gSPInverseTransformVector function

Fix declaration of gSPInverseTransformVector as well. Replace vtx[4]
with vec[3].
This commit is contained in:
gizmo98 2017-10-08 15:30:33 +02:00 committed by Sergey Lipskiy
parent 762def7dae
commit 39d4b223c8
3 changed files with 23 additions and 2 deletions

View File

@ -136,6 +136,25 @@ void gSPTransformVector_NEON(float vtx[4], float mtx[4][4])
vst1q_f32(vtx, _mtx0);
}
void gSPInverseTransformVector_NEON(float vec[3], float mtx[4][4])
{
float32x4x4_t _mtx = vld4q_f32(mtx[0]); // load 4x4 mtx interleaved
_mtx.val[0] = vmulq_n_f32(_mtx.val[0], vec[0]); // mtx[0][0]=mtx[0][0]*_vtx[0]
// mtx[0][1]=mtx[0][1]*_vtx[0]
// mtx[0][2]=mtx[0][2]*_vtx[0]
_mtx.val[0] = vmlaq_n_f32(_mtx.val[0], _mtx.val[1], vec[1]); // mtx[0][0]+=mtx[1][0]*_vtx[1]
// mtx[0][1]+=mtx[1][1]*_vtx[1]
// mtx[0][2]+=mtx[1][2]*_vtx[1]
_mtx.val[0] = vmlaq_n_f32(_mtx.val[0], _mtx.val[2], vec[2]); // mtx[0][0]+=mtx[2][0]*_vtx[2]
// mtx[0][1]+=mtx[2][1]*_vtx[2]
// mtx[0][2]+=mtx[2][2]*_vtx[2]
const float32x4_t _vec4 = _mtx.val[0];
vec[0] = _vec4[0]; // store vec[0]
vec[1] = _vec4[1]; // store vec[1]
vec[2] = _vec4[2]; // store vec[2]
}
void DotProductMax7FullNeon( float v0[3], float v1[7][3], float lights[7][3], float _vtx[3])
{
asm volatile (

View File

@ -2621,11 +2621,13 @@ void gSPObjRendermode(u32 _mode)
DebugMsg(DEBUG_NORMAL, "gSPObjRendermode(0x%08x)\n", _mode);
}
void(*gSPInverseTransformVector)(float vtx[4], float mtx[4][4]) = gSPInverseTransformVector_default;
#ifndef __NEON_OPT
void(*gSPInverseTransformVector)(float vec[3], float mtx[4][4]) = gSPInverseTransformVector_default;
void(*gSPTransformVector)(float vtx[4], float mtx[4][4]) = gSPTransformVector_default;
#else
void gSPInverseTransformVector_NEON(float vec[3], float mtx[4][4]);
void gSPTransformVector_NEON(float vtx[4], float mtx[4][4]);
void(*gSPInverseTransformVector)(float vec[3], float mtx[4][4]) = gSPInverseTransformVector_NEON;
void(*gSPTransformVector)(float vtx[4], float mtx[4][4]) = gSPTransformVector_NEON;
#endif //__NEON_OPT

View File

@ -224,7 +224,7 @@ void gSP4Triangles(const s32 v00, const s32 v01, const s32 v02,
void gSPLightVertex(SPVertex & _vtx);
extern void (*gSPTransformVector)(float vtx[4], float mtx[4][4]);
extern void (*gSPInverseTransformVector)(float vtx[4], float mtx[4][4]);
extern void (*gSPInverseTransformVector)(float vec[3], float mtx[4][4]);
void gSPSetupFunctions();
void gSPFlushTriangles();
#endif