From 118980e02e59ff31871df59dce257075394f3533 Mon Sep 17 00:00:00 2001 From: Aaditya Dhruv Date: Sun, 25 Jan 2026 15:10:37 -0600 Subject: wip --- include/cglm/applesimd.h | 136 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 136 insertions(+) create mode 100644 include/cglm/applesimd.h (limited to 'include/cglm/applesimd.h') diff --git a/include/cglm/applesimd.h b/include/cglm/applesimd.h new file mode 100644 index 0000000..479ada6 --- /dev/null +++ b/include/cglm/applesimd.h @@ -0,0 +1,136 @@ +/* + * Copyright (c), Recep Aslantas. + * + * MIT License (MIT), http://opensource.org/licenses/MIT + * Full license can be found in the LICENSE file + */ + +#ifndef cglm_applesimd_h +#define cglm_applesimd_h +#if defined(__APPLE__) \ + && defined(SIMD_COMPILER_HAS_REQUIRED_FEATURES) \ + && defined(SIMD_BASE) \ + && defined(SIMD_TYPES) \ + && defined(SIMD_VECTOR_TYPES) + +#include "common.h" +#include "struct.h" + +/*! + * @brief converts mat4 to Apple's simd type simd_float4x4 + * @return simd_float4x4 + */ +CGLM_INLINE +simd_float4x4 +glm_mat4_applesimd(mat4 m) { + simd_float4x4 t; + + t.columns[0][0] = m[0][0]; + t.columns[0][1] = m[0][1]; + t.columns[0][2] = m[0][2]; + t.columns[0][3] = m[0][3]; + + t.columns[1][0] = m[1][0]; + t.columns[1][1] = m[1][1]; + t.columns[1][2] = m[1][2]; + t.columns[1][3] = m[1][3]; + + t.columns[2][0] = m[2][0]; + t.columns[2][1] = m[2][1]; + t.columns[2][2] = m[2][2]; + t.columns[2][3] = m[2][3]; + + t.columns[3][0] = m[3][0]; + t.columns[3][1] = m[3][1]; + t.columns[3][2] = m[3][2]; + t.columns[3][3] = m[3][3]; + + return t; +} + +/*! +* @brief converts mat3 to Apple's simd type simd_float3x3 +* @return simd_float3x3 +*/ +CGLM_INLINE +simd_float3x3 +glm_mat3_applesimd(mat3 m) { + simd_float3x3 t; + + t.columns[0][0] = m[0][0]; + t.columns[0][1] = m[0][1]; + t.columns[0][2] = m[0][2]; + + t.columns[1][0] = m[1][0]; + t.columns[1][1] = m[1][1]; + t.columns[1][2] = m[1][2]; + + t.columns[2][0] = m[2][0]; + t.columns[2][1] = m[2][1]; + t.columns[2][2] = m[2][2]; + + return t; +} + +/*! +* @brief converts vec4 to Apple's simd type simd_float4 +* @return simd_float4 +*/ +CGLM_INLINE +simd_float4 +glm_vec4_applesimd(vec4 v) { + return (simd_float4){v[0], v[1], v[2], v[3]}; +} + +/*! +* @brief converts vec3 to Apple's simd type simd_float3 +* @return simd_float3 +*/ +CGLM_INLINE +simd_float3 +glm_vec3_applesimd(vec3 v) { + return (simd_float3){v[0], v[1], v[2]}; +} + +/*! + * @brief generic function to convert cglm types to Apple's simd types + * + * Example usage: + * simd_float4x4 m = applesimd(mat4_value); + * simd_float3 v = applesimd(vec3_value); + * + * @param x cglm type (mat4, mat3, vec4, vec3) + * @return corresponding Apple simd type + */ +#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L) +# define applesimd(x) _Generic((x), \ + mat4: glm_mat4_applesimd, \ + mat3: glm_mat3_applesimd, \ + vec4: glm_vec4_applesimd, \ + vec3: glm_vec3_applesimd \ + )((x)) +#endif + +#ifdef cglm_types_struct_h +CGLM_INLINE simd_float4x4 glms_mat4_(applesimd)(mat4s m) { return glm_mat4_applesimd(m.raw); } +CGLM_INLINE simd_float3x3 glms_mat3_(applesimd)(mat3s m) { return glm_mat3_applesimd(m.raw); } +CGLM_INLINE simd_float4 glms_vec4_(applesimd)(vec4s v) { return glm_vec4_applesimd(v.raw); } +CGLM_INLINE simd_float3 glms_vec3_(applesimd)(vec3s v) { return glm_vec3_applesimd(v.raw); } + +#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L) +# undef applesimd +# define applesimd(x) _Generic((x), \ + mat4: glm_mat4_applesimd, \ + mat3: glm_mat3_applesimd, \ + vec4: glm_vec4_applesimd, \ + vec3: glm_vec3_applesimd, \ + mat4s: glms_mat4_(applesimd), \ + mat3s: glms_mat3_(applesimd), \ + vec4s: glms_vec4_(applesimd), \ + vec3s: glms_vec3_(applesimd) \ + )((x)) +#endif +#endif + +#endif +#endif /* cglm_applesimd_h */ -- cgit