summaryrefslogtreecommitdiff
path: root/incbin.h
diff options
context:
space:
mode:
authorPeter Fors <peter.fors@mindkiller.com>2025-10-09 22:08:16 +0200
committerPeter Fors <peter.fors@mindkiller.com>2025-10-09 22:08:16 +0200
commita506280b1819f103eeb404957083ca9d6f448128 (patch)
treed99041beb941ecf97fc8cbb7c427dce150a0a753 /incbin.h
parent030724a9aea346e4a9843d5842fb28c6d6c4cf1a (diff)
missed one
Diffstat (limited to 'incbin.h')
-rw-r--r--incbin.h67
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[];
+