ascii-chat
Binary v0.15.83-53-gb711d8720
Library lib/v0.3.2-701-gb711d8720
Video chat in your terminal
Loading...
Searching...
No Matches
dispatch.c
Go to the documentation of this file.
2#include <libplatform/system.h>
3#include <string.h>
4
5static const char *simd_backend_override(void) {
6 return platform_getenv("ASCII_CHAT_SIMD");
7}
8
9static const simd_backend_t backends[] = {
10#if SIMD_SUPPORT_SVE
11 {"sve", CPU_FEATURE_SVE, simd_luminance_sve},
12#endif
13#if SIMD_SUPPORT_NEON
14 {"neon", CPU_FEATURE_NEON, simd_luminance_neon},
15#endif
16#if SIMD_SUPPORT_AVX2
17 {"avx2", CPU_FEATURE_AVX2, simd_luminance_avx2},
18#endif
19#if SIMD_SUPPORT_SSSE3
20 {"ssse3", CPU_FEATURE_SSSE3, simd_luminance_ssse3},
21#endif
22#if SIMD_SUPPORT_SSE2
23 {"sse2", CPU_FEATURE_SSE2, simd_luminance_sse2},
24#endif
25 {"scalar", 0, simd_luminance_scalar},
26};
27
29 for (size_t i = 0; i < sizeof(backends) / sizeof(backends[0]); i++) {
30 if ((features & backends[i].required_features) == backends[i].required_features)
31 return &backends[i];
32 }
33 return &backends[sizeof(backends) / sizeof(backends[0]) - 1];
34}
35
37 static _Thread_local const simd_backend_t *selected;
38 if (!selected) {
39 uint32_t features = platform_cpu_features();
40 selected = simd_select_backend(features);
41 const char *requested = simd_backend_override();
42 if (requested && requested[0] && strcmp(requested, "auto") != 0) {
43 // A diagnostic override can never bypass the CPU/OS safety check.
44 selected = simd_select_backend(0);
45 for (size_t i = 0; i < sizeof(backends) / sizeof(backends[0]); i++) {
46 if (strcmp(requested, backends[i].name) == 0 &&
47 (features & backends[i].required_features) == backends[i].required_features) {
48 selected = &backends[i];
49 break;
50 }
51 }
52 }
53 }
54 return selected;
55}
56
57void simd_luminance_scalar(const uint8_t *rgb, uint8_t *out, size_t count) {
58 for (size_t i = 0; i < count; i++)
59 out[i] = (uint8_t)((77u * rgb[3 * i] + 150u * rgb[3 * i + 1] + 29u * rgb[3 * i + 2] + 128u) >> 8);
60}
void simd_luminance_avx2(const uint8_t *rgb, uint8_t *out, size_t width)
const simd_backend_t * simd_select_backend(uint32_t features)
Definition dispatch.c:28
const simd_backend_t * simd_backend(void)
Definition dispatch.c:36
void simd_luminance_scalar(const uint8_t *rgb, uint8_t *out, size_t count)
Definition dispatch.c:57
unsigned int uint32_t
Definition common.h:62
unsigned char uint8_t
Definition common.h:60
const char * platform_getenv(const char *name)
Get an environment variable value.
void simd_luminance_neon(const uint8_t *rgb, uint8_t *out, size_t width)
static bool size_t gotel_query_t * out
Definition queries.h:8
void simd_luminance_sse2(const uint8_t *rgb, uint8_t *out, size_t width)
void simd_luminance_ssse3(const uint8_t *rgb, uint8_t *out, size_t width)
🔤 String Manipulation and Shell Escaping Utilities
simd backend keeps the values that move through the subsystem: name, required_features,...
Definition dispatch.h:12
void simd_luminance_sve(const uint8_t *rgb, uint8_t *out, size_t width)