diff options
Diffstat (limited to 'incbin.h')
| -rw-r--r-- | incbin.h | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/incbin.h b/incbin.h new file mode 100644 index 0000000..5951656 --- /dev/null +++ b/incbin.h @@ -0,0 +1,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[]; + |
