ogl_beamforming

Ultrasound Beamforming Implemented with OpenGL
git clone anongit@rnpnr.xyz:ogl_beamforming.git
Log | Files | Refs | Feed | Submodules | LICENSE

util.c (1637B)


      1 /* See LICENSE for license details. */
      2 #include <stdarg.h>
      3 #include <stdio.h>
      4 #include <stdlib.h>
      5 
      6 static void __attribute__((noreturn))
      7 die(char *fmt, ...)
      8 {
      9 	va_list ap;
     10 
     11 	va_start(ap, fmt);
     12 	vfprintf(stderr, fmt, ap);
     13 	va_end(ap);
     14 
     15 	exit(1);
     16 }
     17 
     18 static void *
     19 mem_clear(u8 *p, u8 c, size len)
     20 {
     21 	while (len) p[--len] = c;
     22 	return p;
     23 }
     24 
     25 static void
     26 mem_move(char *src, char *dest, size n)
     27 {
     28 	if (dest < src) while (n) { *dest++ = *src++; n--; }
     29 	else            while (n) { n--; dest[n] = src[n]; }
     30 }
     31 
     32 #define alloc(a, t, n)  (t *)alloc_(a, sizeof(t), _Alignof(t), n)
     33 static void *
     34 alloc_(Arena *a, size len, size align, size count)
     35 {
     36 	size padding   = -(uintptr_t)a->beg & (align - 1);
     37 	size available = a->end - a->beg - padding;
     38 	if (available < 0 || count > available / len) {
     39 		ASSERT(0);
     40 		die("arena OOM\n");
     41 	}
     42 	void *p = a->beg + padding;
     43 	a->beg += padding + count * len;
     44 	/* TODO: Performance? */
     45 	return mem_clear(p, 0, count * len);
     46 }
     47 
     48 static s8
     49 s8alloc(Arena *a, size len)
     50 {
     51 	return (s8){ .data = alloc(a, u8, len), .len = len };
     52 }
     53 
     54 static b32
     55 uv4_equal(uv4 a, uv4 b)
     56 {
     57 	return a.x == b.x && a.y == b.y && a.z == b.z && a.w == b.w;
     58 }
     59 
     60 static u32
     61 round_down_power_of_2(u32 a)
     62 {
     63 	u32 result = 0x80000000UL >> _lzcnt_u32(a);
     64 	return result;
     65 }
     66 
     67 static void
     68 fill_hadamard(i32 *m, u32 dim)
     69 {
     70 	ASSERT(dim && ISPOWEROF2(dim));
     71 
     72 	#define IND(i, j) ((i) * dim + (j))
     73 	m[0] = 1;
     74 	for (u32 k = 1; k < dim; k *= 2) {
     75 		for (u32 i = 0; i < k; i++) {
     76 			for (u32 j = 0; j < k; j++) {
     77 				i32 val = m[IND(i, j)];
     78 				m[IND(i + k, j)]     =  val;
     79 				m[IND(i, j + k)]     =  val;
     80 				m[IND(i + k, j + k)] = -val;
     81 			}
     82 		}
     83 	}
     84 	#undef IND
     85 }