1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
|
#define STR2(x) #x
#define STR(x) STR2(x)
#ifdef _WIN32
# define INCBIN_SECTION ".data, \"aw\""
#else
# define INCBIN_SECTION ".data"
#endif
/* Core raw incbin (unchanged semantics) */
#define INCBIN_RAW(name, file) \
__asm__(".section " INCBIN_SECTION "\n" \
".global " STR(name) "_data\n" \
".balign 64\n" \
STR(name) "_data:\n" \
".incbin " STR(file) "\n" \
".zero 64\n" \
".global " STR(name) "_end\n" \
".balign 1\n" \
STR(name) "_end:\n"); \
extern __attribute__((aligned(64))) unsigned char name##_data[]; \
extern unsigned char name##_end[];
/* Size helper (no storage) */
#define INCBIN_SIZE(name) ((size_t)((name##_end) - (name##_data)))
/* Typed wrappers (create a typed pointer variable named exactly <name>) */
#define INCBIN_T(name, file, type) \
INCBIN_RAW(name, file) \
static type * name = (type*)(name##_data)
/* Ready-made flavors */
#define INCBIN_UGG(name, file) INCBIN_T(name, file, struct ugg)
#define INCBIN_BYTES(name, file) INCBIN_T(name, file, unsigned char)
// Shader variant: prepends version, then incbins header & shader.
// Exports <name>_data and <name>_end (char[]); use <name>_data as source.
#define INCBIN_SHADER(name, version_str, header_file, shader_file) \
__asm__(".section " INCBIN_SECTION "\n" \
".global " STR(name) "_data\n" \
".balign 64\n" \
STR(name) "_data:\n" \
".ascii \"" version_str "\\n\"\n" \
".incbin \"" header_file "\"\n" \
".incbin \"" shader_file "\"\n" \
".byte 0\n" \
".global " STR(name) "_end\n" \
".balign 1\n" \
STR(name) "_end:\n"); \
extern __attribute__((aligned(64))) char name##_data[]; \
extern char name##_end[];
// Shader without header
#define INCBIN_SHADER_NOHEADER(name, version_str, shader_file) \
__asm__(".section " INCBIN_SECTION "\n" \
".global " STR(name) "_data\n" \
".balign 64\n" \
STR(name) "_data:\n" \
".ascii \"" version_str "\\n\"\n" \
".incbin \"" shader_file "\"\n" \
".byte 0\n" \
".global " STR(name) "_end\n" \
".balign 1\n" \
STR(name) "_end:\n"); \
extern __attribute__((aligned(64))) char name##_data[]; \
extern char name##_end[];
|