ascii-chat 0.6.0
Real-time terminal-based video chat with ASCII art conversion
Loading...
Searching...
No Matches
ascii_simd.h
Go to the documentation of this file.
1#pragma once
2
27#include <stdbool.h>
28#include <stddef.h>
29#include "../image.h"
30#include "common.h"
31
32// Check for SIMD support and include architecture-specific headers
33// CMake explicitly controls which SIMD levels to enable via ENABLE_SIMD_* options
34// and defines SIMD_SUPPORT_* to 1 (enabled) or 0 (disabled).
35//
36// Only auto-detect from compiler macros if CMake hasn't already defined them.
37// This ensures CMake's explicit choices (e.g., AVX2-only, no SSE2/SSSE3) are respected.
38//
39// Disable SIMD on Windows with Clang due to intrinsics compatibility issues
40#if defined(_WIN32) && defined(__clang__) && __clang_major__ >= 20
41// Windows with Clang 20+ has issues with MMX intrinsics
42// Keep SIMD disabled until fixed
43#else
44// Only auto-detect if CMake hasn't already defined the macro
45#if defined(__ARM_FEATURE_SVE) && !defined(SIMD_SUPPORT_SVE)
46#define SIMD_SUPPORT_SVE 1
47#endif
48
49#if defined(__AVX2__) && !defined(SIMD_SUPPORT_AVX2)
50#define SIMD_SUPPORT_AVX2 1
51#endif
52
53#if defined(__SSE2__) && !defined(SIMD_SUPPORT_SSE2)
54#define SIMD_SUPPORT_SSE2 1
55#endif
56
57#if defined(__SSSE3__) && !defined(SIMD_SUPPORT_SSSE3)
58#define SIMD_SUPPORT_SSSE3 1
59#endif
60
61#if defined(__ARM_NEON) && !defined(SIMD_SUPPORT_NEON)
62#define SIMD_SUPPORT_NEON 1
63#endif
64#endif
65
72#define LUMA_RED 77
74#define LUMA_GREEN 150
76#define LUMA_BLUE 29
78#define LUMA_THRESHOLD 128
79
87typedef struct {
89 char s[3];
90} dec3_t;
91
97typedef struct {
98 dec3_t dec3_table[256];
101
104
105// Pre-computed ANSI escape code templates
106// static const char ANSI_FG_PREFIX[] = "\033[38;2;"; // Unused, replaced by inline constants
107// static const char ANSI_BG_PREFIX[] = "\033[48;2;"; // Unused, replaced by inline constants
108// static const char ANSI_SUFFIX[] = "m";
109static const char ANSI_RESET[] = "\033[0m";
110
118void init_dec3(void);
119
127void ascii_simd_init(void);
128
130extern char g_default_luminance_palette[256];
131
138
144typedef struct {
145 char *data;
146 size_t len;
147 size_t cap;
148} Str;
149
156void str_init(Str *s);
157
164void str_free(Str *s);
165
173void str_reserve(Str *s, size_t need);
174
183void str_append_bytes(Str *s, const void *src, size_t n);
184
192void str_append_c(Str *s, char c);
193
202void str_printf(Str *s, const char *fmt, ...);
203
211typedef struct {
212 int cFR, cFG, cFB;
213 int cBR, cBG, cBB;
214 int runLen;
215 int seeded;
216} RLEState;
217
225typedef struct {
226 int w;
227 int h;
229} ImageRGB;
230
241ImageRGB alloc_image(int w, int h);
242
252void convert_pixels_scalar(const rgb_pixel_t *pixels, char *ascii_chars, int count, const char luminance_palette[256]);
253
262char *convert_pixels_scalar_with_newlines(image_t *image, const char luminance_palette[256]);
263
264// Row-based functions removed - use image_print_color() instead
265
271typedef struct {
272 double scalar_time;
273 double sse2_time;
274 double ssse3_time;
275 double avx2_time;
276 double neon_time;
277 double sve_time;
279 const char *best_method;
281
291simd_benchmark_t benchmark_simd_conversion(int width, int height, int iterations);
292
303simd_benchmark_t benchmark_simd_color_conversion(int width, int height, int iterations, bool background_mode);
304
317simd_benchmark_t benchmark_simd_conversion_with_source(int width, int height, int iterations, bool background_mode,
318 const image_t *source_image, bool use_256color);
319
333 bool background_mode, const image_t *source_image,
334 bool use_256color);
335
343void print_simd_capabilities(void);
344
353char *image_print_simd(image_t *image, const char *ascii_chars);
354
365char *image_print_color_simd(image_t *image, bool use_background_mode, bool use_256color, const char *ascii_chars);
366
375void set_color_quality_mode(bool high_quality);
376
384
392void prewarm_sgr256_fg_cache(void);
393
401void prewarm_sgr256_cache(void);
402
411char *get_sgr256_fg_string(uint8_t fg, uint8_t *len_out);
412
422char *get_sgr256_fg_bg_string(uint8_t fg, uint8_t bg, uint8_t *len_out);
423
445size_t write_row_rep_from_arrays_enhanced(const uint8_t *fg_r, const uint8_t *fg_g, const uint8_t *fg_b,
446 const uint8_t *bg_r, const uint8_t *bg_g, const uint8_t *bg_b,
447 const uint8_t *fg_idx, const uint8_t *bg_idx, const char *ascii_chars,
448 int width, char *dst, size_t cap, bool is_truecolor);
449
450// Include architecture-specific implementations
451#if SIMD_SUPPORT_SSE2
452#include "video/simd/sse2.h"
453#endif
454#if SIMD_SUPPORT_SSSE3
455#include "video/simd/ssse3.h"
456#endif
457#if SIMD_SUPPORT_AVX2
458#include "video/simd/avx2.h"
459#endif
460#if SIMD_SUPPORT_SVE
461#include "video/simd/sve.h"
462#endif
463#if SIMD_SUPPORT_NEON
464#include "video/simd/neon.h"
465#endif
AVX2-optimized ASCII rendering functions.
#define ANSI_RESET
unsigned char uint8_t
Definition common.h:56
simd_benchmark_t benchmark_simd_color_conversion(int width, int height, int iterations, bool background_mode)
Benchmark SIMD color conversion methods.
Definition ascii_simd.c:500
global_dec3_cache_t g_dec3_cache
Global decimal cache instance.
Definition ascii_simd.c:23
const char * best_method
Definition ascii_simd.h:279
char * get_sgr256_fg_bg_string(uint8_t fg, uint8_t bg, uint8_t *len_out)
Get 256-color foreground/background ANSI sequence string.
void set_color_quality_mode(bool high_quality)
Set color quality mode.
simd_benchmark_t benchmark_simd_conversion(int width, int height, int iterations)
Benchmark SIMD conversion methods (monochrome)
char * convert_pixels_scalar_with_newlines(image_t *image, const char luminance_palette[256])
Convert image to ASCII with newlines (scalar fallback)
Definition ascii_simd.c:182
void init_dec3(void)
Initialize decimal lookup table.
Definition ascii_simd.c:58
void str_reserve(Str *s, size_t need)
Reserve space in string buffer.
Definition ascii_simd.c:120
void str_printf(Str *s, const char *fmt,...)
Append formatted string to buffer.
Definition ascii_simd.c:141
uint8_t len
Definition ascii_simd.h:88
void str_free(Str *s)
Free string buffer.
Definition ascii_simd.c:114
size_t write_row_rep_from_arrays_enhanced(const uint8_t *fg_r, const uint8_t *fg_g, const uint8_t *fg_b, const uint8_t *bg_r, const uint8_t *bg_g, const uint8_t *bg_b, const uint8_t *fg_idx, const uint8_t *bg_idx, const char *ascii_chars, int width, char *dst, size_t cap, bool is_truecolor)
Enhanced REP compression writer.
void str_append_c(Str *s, char c)
Append character to string buffer.
Definition ascii_simd.c:136
void str_init(Str *s)
Initialize string buffer.
Definition ascii_simd.c:108
simd_benchmark_t benchmark_simd_color_conversion_with_source(int width, int height, int iterations, bool background_mode, const image_t *source_image, bool use_256color)
Benchmark SIMD color conversion with source image.
void prewarm_sgr256_cache(void)
Prewarm 256-color foreground/background cache for benchmarks.
void print_simd_capabilities(void)
Print detected SIMD capabilities.
Definition ascii_simd.c:276
simd_benchmark_t benchmark_simd_conversion_with_source(int width, int height, int iterations, bool background_mode, const image_t *source_image, bool use_256color)
Benchmark SIMD conversion with source image.
Definition ascii_simd.c:656
void convert_pixels_scalar(const rgb_pixel_t *pixels, char *ascii_chars, int count, const char luminance_palette[256])
Convert pixels to ASCII (scalar fallback)
Definition ascii_simd.c:167
bool get_256_color_fast_path(void)
Get 256-color fast path setting.
char g_default_luminance_palette[256]
Default luminance palette (256 characters)
Definition ascii_simd.c:33
void prewarm_sgr256_fg_cache(void)
Prewarm 256-color foreground cache for benchmarks.
ImageRGB alloc_image(int w, int h)
Allocate a new ImageRGB (RGB8 format)
Definition ascii_simd.c:98
char * get_sgr256_fg_string(uint8_t fg, uint8_t *len_out)
Get 256-color foreground ANSI sequence string.
size_t len
Definition ascii_simd.h:146
uint8_t * pixels
Definition ascii_simd.h:228
size_t cap
Definition ascii_simd.h:147
char * image_print_simd(image_t *image, const char *ascii_chars)
Print image as ASCII using SIMD (monochrome)
Definition ascii_simd.c:252
void init_default_luminance_palette(void)
Initialize default luminance palette.
Definition ascii_simd.c:37
char * data
Definition ascii_simd.h:145
void str_append_bytes(Str *s, const void *src, size_t n)
Append bytes to string buffer.
Definition ascii_simd.c:130
void ascii_simd_init(void)
Initialize SIMD subsystem.
Definition ascii_simd.c:90
char * image_print_color_simd(image_t *image, bool use_background_mode, bool use_256color, const char *ascii_chars)
Print image as ASCII with color using SIMD.
NEON-optimized ASCII rendering functions.
SSE2-optimized ASCII rendering functions.
SSSE3-optimized ASCII rendering functions.
ImageRGB structure for NEON renderers.
Definition ascii_simd.h:225
Run-length encoding state for ANSI color optimization.
Definition ascii_simd.h:211
Dynamic string buffer structure.
Definition ascii_simd.h:144
Decimal conversion cache structure (1-3 digits)
Definition ascii_simd.h:87
Global decimal cache for digit conversion.
Definition ascii_simd.h:97
Image structure.
SIMD benchmark results structure.
Definition ascii_simd.h:271
SVE-optimized ASCII rendering functions.
Common SIMD utilities and structures.