Skip to content

Commit e30be04

Browse files
authored
Merge pull request #132 from sysprog21/gen-composite-decls
Automate compositing declarations generation
2 parents 16f75bd + 9409127 commit e30be04

File tree

4 files changed

+145
-130
lines changed

4 files changed

+145
-130
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ mado-perf
88
.mado-perf
99
font-edit
1010
.font-edit
11+
src/composite-decls.h
1112

1213
# Swap
1314
[._]*.s[a-v][a-z]

Makefile

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
-include .config
22

3+
# Set default goal explicitly
4+
.DEFAULT_GOAL := all
5+
36
check_goal := $(strip $(MAKECMDGOALS))
47
ifeq ($(filter $(check_goal),config defconfig),)
58
ifneq "$(CONFIG_CONFIGURED)" "y"
@@ -58,6 +61,11 @@ libtwin.a_includes-y := \
5861
include \
5962
src
6063

64+
# Auto-generate compositing function declarations if missing
65+
src/composite-decls.h: scripts/gen-composite-decls.py
66+
@echo " GEN $@"
67+
@$< > $@
68+
6169
# Optional features
6270

6371
libtwin.a_files-$(CONFIG_LOGGING) += src/log.c
@@ -189,6 +197,14 @@ endif
189197

190198
CFLAGS += -include config.h
191199

200+
# Ensure composite-decls.h exists before including build rules
201+
# (needed for dependency generation in mk/common.mk)
202+
ifeq ($(filter config defconfig clean,$(MAKECMDGOALS)),)
203+
ifeq ($(wildcard src/composite-decls.h),)
204+
$(shell scripts/gen-composite-decls.py > src/composite-decls.h)
205+
endif
206+
endif
207+
192208
# Only skip build rules when running ONLY config/defconfig (no other targets)
193209
ifneq ($(filter-out config defconfig,$(check_goal)),)
194210
# Has targets other than config/defconfig

scripts/gen-composite-decls.py

Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
#!/usr/bin/env python3
2+
"""
3+
Generate composite function declarations for twin_private.h
4+
5+
This script generates the ~128 function declarations for compositing operations
6+
that are currently manually listed in twin_private.h:280-405.
7+
8+
The functions are actually generated by macros in src/primitive.c, but we need
9+
their declarations in the header.
10+
"""
11+
12+
# Format types for src, msk, and dst
13+
FORMATS = ["argb32", "rgb16", "a8", "c"]
14+
# Operators
15+
OPS = ["over", "source"]
16+
17+
18+
def generate_3operand_decls():
19+
"""
20+
Generate declarations for 3-operand functions:
21+
_twin_{src}_in_{msk}_{op}_{dst}
22+
23+
These are generated by MAKE_TWIN_in_op_dsts_srcs_msks macro
24+
"""
25+
decls = []
26+
27+
# Format: _twin_{src}_in_{msk}_{op}_{dst}
28+
# Generated from primitive.c:179
29+
# MAKE_TWIN_in_op_dsts_srcs_msks(over)
30+
# MAKE_TWIN_in_op_dsts_srcs_msks(source)
31+
32+
for op in OPS:
33+
for dst in ["argb32", "rgb16", "a8"]: # dst doesn't include 'c'
34+
for src in FORMATS:
35+
for msk in FORMATS:
36+
func_name = f"_twin_{src}_in_{msk}_{op}_{dst}"
37+
decls.append(f"twin_in_op_func {func_name};")
38+
39+
return decls
40+
41+
42+
def generate_2operand_decls():
43+
"""
44+
Generate declarations for 2-operand functions:
45+
_twin_{src}_{op}_{dst}
46+
47+
These are generated by MAKE_TWIN_op_dsts_srcs macro
48+
"""
49+
decls = []
50+
51+
# Format: _twin_{src}_{op}_{dst}
52+
# Generated from primitive.c:220-221
53+
# MAKE_TWIN_op_dsts_srcs(over);
54+
# MAKE_TWIN_op_dsts_srcs(source);
55+
56+
for op in OPS:
57+
for dst in ["argb32", "rgb16", "a8"]: # dst doesn't include 'c'
58+
for src in FORMATS:
59+
func_name = f"_twin_{src}_{op}_{dst}"
60+
decls.append(f"twin_op_func {func_name};")
61+
62+
return decls
63+
64+
65+
def generate_vectorized_decls():
66+
"""
67+
Generate declarations for vectorized functions
68+
These are hand-written optimizations
69+
"""
70+
return [
71+
"twin_op_func _twin_vec_argb32_over_argb32;",
72+
"twin_op_func _twin_vec_argb32_source_argb32;",
73+
]
74+
75+
76+
def generate_header():
77+
"""Generate header comment"""
78+
return """/*
79+
* Compositing operation function declarations
80+
*
81+
* These functions are generated by macros in src/primitive.c
82+
* This file is auto-generated by the build system - DO NOT EDIT
83+
*/
84+
85+
#ifndef _TWIN_COMPOSITE_DECLS_H_
86+
#define _TWIN_COMPOSITE_DECLS_H_
87+
88+
/* Forward declarations for function types */
89+
typedef void twin_in_op_func(twin_pointer_t dst,
90+
twin_source_u src,
91+
twin_source_u msk,
92+
int width);
93+
94+
typedef void twin_op_func(twin_pointer_t dst, twin_source_u src, int width);
95+
"""
96+
97+
98+
def generate_footer():
99+
"""Generate footer"""
100+
return """
101+
#endif /* _TWIN_COMPOSITE_DECLS_H_ */
102+
"""
103+
104+
105+
def main():
106+
print(generate_header())
107+
108+
print("\n/* 3-operand compositing: _twin_{src}_in_{msk}_{op}_{dst} */")
109+
print("/* Total: 2 ops * 3 dsts * 4 srcs * 4 msks = 96 functions */")
110+
for decl in generate_3operand_decls():
111+
print(decl)
112+
113+
print("\n/* 2-operand compositing: _twin_{src}_{op}_{dst} */")
114+
print("/* Total: 2 ops * 3 dsts * 4 srcs = 24 functions */")
115+
for decl in generate_2operand_decls():
116+
print(decl)
117+
118+
print("\n/* Vectorized implementations (hand-optimized) */")
119+
for decl in generate_vectorized_decls():
120+
print(decl)
121+
122+
print(generate_footer())
123+
124+
125+
if __name__ == "__main__":
126+
main()

src/twin_private.h

Lines changed: 2 additions & 130 deletions
Original file line numberDiff line numberDiff line change
@@ -276,136 +276,8 @@ typedef struct _twin_gpoint {
276276
twin_gfixed_t x, y;
277277
} twin_gpoint_t;
278278

279-
/*
280-
* FIXME: should be refactored to reduce the number of functions.
281-
*/
282-
twin_in_op_func _twin_argb32_in_argb32_over_argb32;
283-
twin_in_op_func _twin_argb32_in_rgb16_over_argb32;
284-
twin_in_op_func _twin_argb32_in_a8_over_argb32;
285-
twin_in_op_func _twin_argb32_in_c_over_argb32;
286-
twin_in_op_func _twin_rgb16_in_argb32_over_argb32;
287-
twin_in_op_func _twin_rgb16_in_rgb16_over_argb32;
288-
twin_in_op_func _twin_rgb16_in_a8_over_argb32;
289-
twin_in_op_func _twin_rgb16_in_c_over_argb32;
290-
twin_in_op_func _twin_a8_in_argb32_over_argb32;
291-
twin_in_op_func _twin_a8_in_rgb16_over_argb32;
292-
twin_in_op_func _twin_a8_in_a8_over_argb32;
293-
twin_in_op_func _twin_a8_in_c_over_argb32;
294-
twin_in_op_func _twin_c_in_argb32_over_argb32;
295-
twin_in_op_func _twin_c_in_rgb16_over_argb32;
296-
twin_in_op_func _twin_c_in_a8_over_argb32;
297-
twin_in_op_func _twin_c_in_c_over_argb32;
298-
twin_in_op_func _twin_argb32_in_argb32_over_rgb16;
299-
twin_in_op_func _twin_argb32_in_rgb16_over_rgb16;
300-
twin_in_op_func _twin_argb32_in_a8_over_rgb16;
301-
twin_in_op_func _twin_argb32_in_c_over_rgb16;
302-
twin_in_op_func _twin_rgb16_in_argb32_over_rgb16;
303-
twin_in_op_func _twin_rgb16_in_rgb16_over_rgb16;
304-
twin_in_op_func _twin_rgb16_in_a8_over_rgb16;
305-
twin_in_op_func _twin_rgb16_in_c_over_rgb16;
306-
twin_in_op_func _twin_a8_in_argb32_over_rgb16;
307-
twin_in_op_func _twin_a8_in_rgb16_over_rgb16;
308-
twin_in_op_func _twin_a8_in_a8_over_rgb16;
309-
twin_in_op_func _twin_a8_in_c_over_rgb16;
310-
twin_in_op_func _twin_c_in_argb32_over_rgb16;
311-
twin_in_op_func _twin_c_in_rgb16_over_rgb16;
312-
twin_in_op_func _twin_c_in_a8_over_rgb16;
313-
twin_in_op_func _twin_c_in_c_over_rgb16;
314-
twin_in_op_func _twin_argb32_in_argb32_over_a8;
315-
twin_in_op_func _twin_argb32_in_rgb16_over_a8;
316-
twin_in_op_func _twin_argb32_in_a8_over_a8;
317-
twin_in_op_func _twin_argb32_in_c_over_a8;
318-
twin_in_op_func _twin_rgb16_in_argb32_over_a8;
319-
twin_in_op_func _twin_rgb16_in_rgb16_over_a8;
320-
twin_in_op_func _twin_rgb16_in_a8_over_a8;
321-
twin_in_op_func _twin_rgb16_in_c_over_a8;
322-
twin_in_op_func _twin_a8_in_argb32_over_a8;
323-
twin_in_op_func _twin_a8_in_rgb16_over_a8;
324-
twin_in_op_func _twin_a8_in_a8_over_a8;
325-
twin_in_op_func _twin_a8_in_c_over_a8;
326-
twin_in_op_func _twin_c_in_argb32_over_a8;
327-
twin_in_op_func _twin_c_in_rgb16_over_a8;
328-
twin_in_op_func _twin_c_in_a8_over_a8;
329-
twin_in_op_func _twin_c_in_c_over_a8;
330-
twin_in_op_func _twin_argb32_in_argb32_over_c;
331-
332-
twin_in_op_func _twin_argb32_in_argb32_source_argb32;
333-
twin_in_op_func _twin_argb32_in_rgb16_source_argb32;
334-
twin_in_op_func _twin_argb32_in_a8_source_argb32;
335-
twin_in_op_func _twin_argb32_in_c_source_argb32;
336-
twin_in_op_func _twin_rgb16_in_argb32_source_argb32;
337-
twin_in_op_func _twin_rgb16_in_rgb16_source_argb32;
338-
twin_in_op_func _twin_rgb16_in_a8_source_argb32;
339-
twin_in_op_func _twin_rgb16_in_c_source_argb32;
340-
twin_in_op_func _twin_a8_in_argb32_source_argb32;
341-
twin_in_op_func _twin_a8_in_rgb16_source_argb32;
342-
twin_in_op_func _twin_a8_in_a8_source_argb32;
343-
twin_in_op_func _twin_a8_in_c_source_argb32;
344-
twin_in_op_func _twin_c_in_argb32_source_argb32;
345-
twin_in_op_func _twin_c_in_rgb16_source_argb32;
346-
twin_in_op_func _twin_c_in_a8_source_argb32;
347-
twin_in_op_func _twin_c_in_c_source_argb32;
348-
twin_in_op_func _twin_argb32_in_argb32_source_rgb16;
349-
twin_in_op_func _twin_argb32_in_rgb16_source_rgb16;
350-
twin_in_op_func _twin_argb32_in_a8_source_rgb16;
351-
twin_in_op_func _twin_argb32_in_c_source_rgb16;
352-
twin_in_op_func _twin_rgb16_in_argb32_source_rgb16;
353-
twin_in_op_func _twin_rgb16_in_rgb16_source_rgb16;
354-
twin_in_op_func _twin_rgb16_in_a8_source_rgb16;
355-
twin_in_op_func _twin_rgb16_in_c_source_rgb16;
356-
twin_in_op_func _twin_a8_in_argb32_source_rgb16;
357-
twin_in_op_func _twin_a8_in_rgb16_source_rgb16;
358-
twin_in_op_func _twin_a8_in_a8_source_rgb16;
359-
twin_in_op_func _twin_a8_in_c_source_rgb16;
360-
twin_in_op_func _twin_c_in_argb32_source_rgb16;
361-
twin_in_op_func _twin_c_in_rgb16_source_rgb16;
362-
twin_in_op_func _twin_c_in_a8_source_rgb16;
363-
twin_in_op_func _twin_c_in_c_source_rgb16;
364-
twin_in_op_func _twin_argb32_in_argb32_source_a8;
365-
twin_in_op_func _twin_argb32_in_rgb16_source_a8;
366-
twin_in_op_func _twin_argb32_in_a8_source_a8;
367-
twin_in_op_func _twin_argb32_in_c_source_a8;
368-
twin_in_op_func _twin_rgb16_in_argb32_source_a8;
369-
twin_in_op_func _twin_rgb16_in_rgb16_source_a8;
370-
twin_in_op_func _twin_rgb16_in_a8_source_a8;
371-
twin_in_op_func _twin_rgb16_in_c_source_a8;
372-
twin_in_op_func _twin_a8_in_argb32_source_a8;
373-
twin_in_op_func _twin_a8_in_rgb16_source_a8;
374-
twin_in_op_func _twin_a8_in_a8_source_a8;
375-
twin_in_op_func _twin_a8_in_c_source_a8;
376-
twin_in_op_func _twin_c_in_argb32_source_a8;
377-
twin_in_op_func _twin_c_in_rgb16_source_a8;
378-
twin_in_op_func _twin_c_in_a8_source_a8;
379-
twin_in_op_func _twin_c_in_c_source_a8;
380-
twin_in_op_func _twin_argb32_in_argb32_source_c;
381-
382-
twin_op_func _twin_argb32_over_argb32;
383-
twin_op_func _twin_rgb16_over_argb32;
384-
twin_op_func _twin_a8_over_argb32;
385-
twin_op_func _twin_c_over_argb32;
386-
twin_op_func _twin_argb32_over_rgb16;
387-
twin_op_func _twin_rgb16_over_rgb16;
388-
twin_op_func _twin_a8_over_rgb16;
389-
twin_op_func _twin_c_over_rgb16;
390-
twin_op_func _twin_argb32_over_a8;
391-
twin_op_func _twin_rgb16_over_a8;
392-
twin_op_func _twin_a8_over_a8;
393-
twin_op_func _twin_c_over_a8;
394-
twin_op_func _twin_argb32_source_argb32;
395-
twin_op_func _twin_rgb16_source_argb32;
396-
twin_op_func _twin_a8_source_argb32;
397-
twin_op_func _twin_c_source_argb32;
398-
twin_op_func _twin_argb32_source_rgb16;
399-
twin_op_func _twin_rgb16_source_rgb16;
400-
twin_op_func _twin_a8_source_rgb16;
401-
twin_op_func _twin_c_source_rgb16;
402-
twin_op_func _twin_argb32_source_a8;
403-
twin_op_func _twin_rgb16_source_a8;
404-
twin_op_func _twin_a8_source_a8;
405-
twin_op_func _twin_c_source_a8;
406-
407-
twin_op_func _twin_vec_argb32_over_argb32;
408-
twin_op_func _twin_vec_argb32_source_argb32;
279+
/* Compositing function declarations - auto-generated */
280+
#include "composite-decls.h"
409281

410282
twin_argb32_t *_twin_fetch_rgb16(twin_pixmap_t *pixmap,
411283
int x,

0 commit comments

Comments
 (0)