#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 ) */ #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 _data and _end (char[]); use _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[];