Go to the documentation of this file.
21 #ifndef SWSCALE_UOPS_TMPL_H
22 #define SWSCALE_UOPS_TMPL_H
39 #ifndef SWS_BLOCK_SIZE
40 # define SWS_BLOCK_SIZE 32
50 #define SIZEOF_BLOCK (sizeof(pixel_t) * SWS_BLOCK_SIZE)
66 # define SWS_LOOP AV_PRAGMA(clang loop vectorize(assume_safety))
67 #elif defined(__GNUC__)
68 # define SWS_LOOP AV_PRAGMA(GCC ivdep)
74 #define bitfn2(name, ext) name ## _ ## ext
75 #define bitfn(name, ext) bitfn2(name, ext)
76 #define fn(name) bitfn(name, PX)
78 #define bump_ptr(ptr, bump) ((pixel_t *) ((uintptr_t) (ptr) + (bump)))
81 #define X SWS_COMP_TEST(mask, 0)
82 #define Y SWS_COMP_TEST(mask, 1)
83 #define Z SWS_COMP_TEST(mask, 2)
84 #define W SWS_COMP_TEST(mask, 3)
87 #define DECL_FUNC(NAME, ...) \
88 av_always_inline static void \
89 fn(NAME)(SwsOpIter *restrict iter, const SwsOpImpl *restrict impl, \
90 pixel_t *restrict x, pixel_t *restrict y, \
91 pixel_t *restrict z, pixel_t *restrict w, \
94 #define DECL_READ(NAME, ...) \
95 DECL_FUNC(NAME, __VA_ARGS__, \
96 const pixel_t *restrict in0, const pixel_t *restrict in1, \
97 const pixel_t *restrict in2, const pixel_t *restrict in3) \
99 #define DECL_WRITE(NAME, ...) \
100 DECL_FUNC(NAME, __VA_ARGS__, \
101 pixel_t *restrict out0, pixel_t *restrict out1, \
102 pixel_t *restrict out2, pixel_t *restrict out3) \
104 #define CALL(NAME, ...) fn(NAME)(iter, impl, x, y, z, w, __VA_ARGS__)
107 #define CONTINUE(...) \
108 ((void (*)(SwsOpIter *, const SwsOpImpl *, \
109 void *restrict x, void *restrict y, \
110 void *restrict z, void *restrict w)) impl->cont) \
111 (iter, &impl[1], __VA_ARGS__)
114 #define DECL_SETUP(NAME, PARAMS, OUT) \
115 av_unused static int fn(NAME)(const SwsImplParams *PARAMS, \
119 #define DECL_IMPL(FUNC, NAME, TYPE, UOP, ...) \
120 av_flatten static void NAME##_c(SwsOpIter *restrict iter, \
121 const SwsOpImpl *restrict impl, \
122 void *restrict x, void *restrict y, \
123 void *restrict z, void *restrict w) \
125 CALL(FUNC, __VA_ARGS__); \
128 #define DECL_IMPL_READ(...) \
129 DECL_IMPL(__VA_ARGS__, \
130 (const pixel_t *) iter->in[0], (const pixel_t *) iter->in[1], \
131 (const pixel_t *) iter->in[2], (const pixel_t *) iter->in[3])
133 #define DECL_IMPL_WRITE(...) \
134 DECL_IMPL(__VA_ARGS__, \
135 (pixel_t *) iter->out[0], (pixel_t *) iter->out[1], \
136 (pixel_t *) iter->out[2], (pixel_t *) iter->out[3])
138 #define REF_ENTRY(DUMMY, NAME, ...) &op_##NAME,
139 #define DECL_ENTRY(SETUP, NAME, ...) \
140 static const SwsOpEntry op_##NAME = { \
141 .func = (SwsFuncPtr) NAME##_c, \
float f32[SWS_BLOCK_SIZE]
Internal context holding per-iter execution data.
Copyright (C) 2026 Niklas Haas.
uint8_t u8[SWS_BLOCK_SIZE]
#define SWS_BLOCK_SIZE
Copyright (C) 2026 Niklas Haas.
uint32_t u32[SWS_BLOCK_SIZE]
uint16_t u16[SWS_BLOCK_SIZE]