22 #include "../util/sse-intrin.h"
41 static inline void vec4_zero(
struct vec4 *v)
43 v->
m = _mm_setzero_ps();
46 static inline void vec4_set(
struct vec4 *dst,
float x,
float y,
float z,
49 dst->
m = _mm_set_ps(w, z, y, x);
52 static inline void vec4_copy(
struct vec4 *dst,
const struct vec4 *v)
59 static inline void vec4_add(
struct vec4 *dst,
const struct vec4 *v1,
60 const struct vec4 *v2)
62 dst->
m = _mm_add_ps(v1->
m, v2->
m);
65 static inline void vec4_sub(
struct vec4 *dst,
const struct vec4 *v1,
66 const struct vec4 *v2)
68 dst->
m = _mm_sub_ps(v1->
m, v2->
m);
71 static inline void vec4_mul(
struct vec4 *dst,
const struct vec4 *v1,
72 const struct vec4 *v2)
74 dst->
m = _mm_mul_ps(v1->
m, v2->
m);
77 static inline void vec4_div(
struct vec4 *dst,
const struct vec4 *v1,
78 const struct vec4 *v2)
80 dst->
m = _mm_div_ps(v1->
m, v2->
m);
83 static inline void vec4_addf(
struct vec4 *dst,
const struct vec4 *v,
float f)
85 dst->
m = _mm_add_ps(v->
m, _mm_set1_ps(f));
88 static inline void vec4_subf(
struct vec4 *dst,
const struct vec4 *v,
float f)
90 dst->
m = _mm_sub_ps(v->
m, _mm_set1_ps(f));
93 static inline void vec4_mulf(
struct vec4 *dst,
const struct vec4 *v,
float f)
95 dst->
m = _mm_mul_ps(v->
m, _mm_set1_ps(f));
98 static inline void vec4_divf(
struct vec4 *dst,
const struct vec4 *v,
float f)
100 dst->
m = _mm_div_ps(v->
m, _mm_set1_ps(f));
103 static inline float vec4_dot(
const struct vec4 *v1,
const struct vec4 *v2)
106 __m128 mul = _mm_mul_ps(v1->
m, v2->
m);
107 add.m = _mm_add_ps(_mm_movehl_ps(mul, mul), mul);
108 add.m = _mm_add_ps(_mm_shuffle_ps(add.m, add.m, 0x55), add.m);
112 static inline void vec4_neg(
struct vec4 *dst,
const struct vec4 *v)
120 static inline float vec4_len(
const struct vec4 *v)
122 float dot_val = vec4_dot(v, v);
123 return (dot_val > 0.0f) ? sqrtf(dot_val) : 0.0f;
126 static inline float vec4_dist(
const struct vec4 *v1,
const struct vec4 *v2)
131 vec4_sub(&temp, v1, v2);
132 dot_val = vec4_dot(&temp, &temp);
133 return (dot_val > 0.0f) ? sqrtf(dot_val) : 0.0f;
136 static inline void vec4_norm(
struct vec4 *dst,
const struct vec4 *v)
138 float dot_val = vec4_dot(v, v);
139 dst->
m = (dot_val > 0.0f)
140 ? _mm_mul_ps(v->
m, _mm_set1_ps(1.0f / sqrtf(dot_val)))
144 static inline int vec4_close(
const struct vec4 *v1,
const struct vec4 *v2,
148 vec4_sub(&test, v1, v2);
149 return test.x < epsilon && test.y < epsilon && test.z < epsilon &&
153 static inline void vec4_min(
struct vec4 *dst,
const struct vec4 *v1,
154 const struct vec4 *v2)
156 dst->
m = _mm_min_ps(v1->
m, v2->
m);
159 static inline void vec4_minf(
struct vec4 *dst,
const struct vec4 *v,
float f)
161 dst->
m = _mm_min_ps(v->
m, _mm_set1_ps(f));
164 static inline void vec4_max(
struct vec4 *dst,
const struct vec4 *v1,
165 const struct vec4 *v2)
167 dst->
m = _mm_max_ps(v1->
m, v2->
m);
170 static inline void vec4_maxf(
struct vec4 *dst,
const struct vec4 *v,
float f)
172 dst->
m = _mm_max_ps(v->
m, _mm_set1_ps(f));
175 static inline void vec4_abs(
struct vec4 *dst,
const struct vec4 *v)
177 dst->
x = fabsf(v->
x);
178 dst->
y = fabsf(v->
y);
179 dst->
z = fabsf(v->
z);
180 dst->
w = fabsf(v->
w);
183 static inline void vec4_floor(
struct vec4 *dst,
const struct vec4 *v)
185 dst->
x = floorf(v->
x);
186 dst->
y = floorf(v->
y);
187 dst->
z = floorf(v->
z);
188 dst->
w = floorf(v->
w);
191 static inline void vec4_ceil(
struct vec4 *dst,
const struct vec4 *v)
193 dst->
x = ceilf(v->
x);
194 dst->
y = ceilf(v->
y);
195 dst->
z = ceilf(v->
z);
196 dst->
w = ceilf(v->
w);
199 static inline uint32_t vec4_to_rgba(
const struct vec4 *src)
202 val = (uint32_t)((
double)src->
x * 255.0);
203 val |= (uint32_t)((
double)src->
y * 255.0) << 8;
204 val |= (uint32_t)((
double)src->
z * 255.0) << 16;
205 val |= (uint32_t)((
double)src->
w * 255.0) << 24;
209 static inline uint32_t vec4_to_bgra(
const struct vec4 *src)
212 val = (uint32_t)((
double)src->
z * 255.0);
213 val |= (uint32_t)((
double)src->
y * 255.0) << 8;
214 val |= (uint32_t)((
double)src->
x * 255.0) << 16;
215 val |= (uint32_t)((
double)src->
w * 255.0) << 24;
219 static inline void vec4_from_rgba(
struct vec4 *dst, uint32_t rgba)
221 dst->
x = (float)((
double)(rgba & 0xFF) * (1.0 / 255.0));
223 dst->
y = (float)((
double)(rgba & 0xFF) * (1.0 / 255.0));
225 dst->
z = (float)((
double)(rgba & 0xFF) * (1.0 / 255.0));
227 dst->
w = (float)((
double)(rgba & 0xFF) * (1.0 / 255.0));
230 static inline void vec4_from_bgra(
struct vec4 *dst, uint32_t bgra)
232 dst->
z = (float)((
double)(bgra & 0xFF) * (1.0 / 255.0));
234 dst->
y = (float)((
double)(bgra & 0xFF) * (1.0 / 255.0));
236 dst->
x = (float)((
double)(bgra & 0xFF) * (1.0 / 255.0));
238 dst->
w = (float)((
double)(bgra & 0xFF) * (1.0 / 255.0));