summaryrefslogtreecommitdiff
path: root/incbin.h
blob: 5951656f63f759b5177655c7676e5018fc669901 (plain)
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[];