summaryrefslogtreecommitdiff
path: root/src/code/gDPLoadTextureBlock_Runtime.inc.c
diff options
context:
space:
mode:
authormzxrules <mzxrules@gmail.com>2024-07-17 17:35:37 -0400
committerGitHub <noreply@github.com>2024-07-17 17:35:37 -0400
commit7eee97429f0584b25304067aa9cad035cc84aef9 (patch)
treec6a7b4413b5e1aca7102044087169bbe3a55d4dc /src/code/gDPLoadTextureBlock_Runtime.inc.c
parentbf3339a16d6bf1d48165853540f20aebfdf5367a (diff)
Clean up custom LoadTextureBlock in z_map_mark.c and z_lmap_mark.c (#1896)
* experimental inc.c * make it look proper * make table types u32 * ZCONST -> COND_CONST * Tharo suggestion and comment * implement MM Decomp suggestions * fix minor nits * Update header guard
Diffstat (limited to 'src/code/gDPLoadTextureBlock_Runtime.inc.c')
-rw-r--r--src/code/gDPLoadTextureBlock_Runtime.inc.c68
1 files changed, 68 insertions, 0 deletions
diff --git a/src/code/gDPLoadTextureBlock_Runtime.inc.c b/src/code/gDPLoadTextureBlock_Runtime.inc.c
new file mode 100644
index 000000000..55be14451
--- /dev/null
+++ b/src/code/gDPLoadTextureBlock_Runtime.inc.c
@@ -0,0 +1,68 @@
+#ifndef GDP_LOADTEXTUREBLOCK_RUNTIME_INC_C
+#define GDP_LOADTEXTUREBLOCK_RUNTIME_INC_C
+
+#include "gfx.h"
+
+#ifndef GDP_LOADTEXTUREBLOCK_RUNTIME_QUALIFIERS
+#define GDP_LOADTEXTUREBLOCK_RUNTIME_QUALIFIERS
+#endif
+
+// The Following arrays must be defined as const in z_lmap_mark.c to appear in rodata
+
+static GDP_LOADTEXTUREBLOCK_RUNTIME_QUALIFIERS u32 sLoadTextureBlock_siz[] = {
+ G_IM_SIZ_4b,
+ G_IM_SIZ_8b,
+ G_IM_SIZ_16b,
+ G_IM_SIZ_32b,
+};
+static GDP_LOADTEXTUREBLOCK_RUNTIME_QUALIFIERS u32 sLoadTextureBlock_siz_LOAD_BLOCK[] = {
+ G_IM_SIZ_4b_LOAD_BLOCK,
+ G_IM_SIZ_8b_LOAD_BLOCK,
+ G_IM_SIZ_16b_LOAD_BLOCK,
+ G_IM_SIZ_32b_LOAD_BLOCK,
+};
+static GDP_LOADTEXTUREBLOCK_RUNTIME_QUALIFIERS u32 sLoadTextureBlock_siz_INCR[] = {
+ G_IM_SIZ_4b_INCR,
+ G_IM_SIZ_8b_INCR,
+ G_IM_SIZ_16b_INCR,
+ G_IM_SIZ_32b_INCR,
+};
+static GDP_LOADTEXTUREBLOCK_RUNTIME_QUALIFIERS u32 sLoadTextureBlock_siz_SHIFT[] = {
+ G_IM_SIZ_4b_SHIFT,
+ G_IM_SIZ_8b_SHIFT,
+ G_IM_SIZ_16b_SHIFT,
+ G_IM_SIZ_32b_SHIFT,
+};
+static GDP_LOADTEXTUREBLOCK_RUNTIME_QUALIFIERS u32 sLoadTextureBlock_siz_BYTES[] = {
+ G_IM_SIZ_4b_BYTES,
+ G_IM_SIZ_8b_BYTES,
+ G_IM_SIZ_16b_BYTES,
+ G_IM_SIZ_32b_BYTES,
+};
+static GDP_LOADTEXTUREBLOCK_RUNTIME_QUALIFIERS u32 sLoadTextureBlock_siz_LINE_BYTES[] = {
+ G_IM_SIZ_4b_LINE_BYTES,
+ G_IM_SIZ_8b_LINE_BYTES,
+ G_IM_SIZ_16b_LINE_BYTES,
+ G_IM_SIZ_32b_LINE_BYTES,
+};
+
+/**
+ * Implements a version of gDPLoadTextureBlock using table lookups instead of token pasting, to allow values to be
+ * passed into `siz` during runtime.
+ */
+#define gDPLoadTextureBlock_Runtime(pkt, timg, fmt, siz, width, height, pal, cms, cmt, masks, maskt, shifts, shiftt) \
+ _DW({ \
+ gDPSetTextureImage(pkt, fmt, sLoadTextureBlock_siz_LOAD_BLOCK[siz], 1, timg); \
+ gDPSetTile(pkt, fmt, sLoadTextureBlock_siz_LOAD_BLOCK[siz], 0, 0, G_TX_LOADTILE, 0, cmt, maskt, shiftt, cms, \
+ masks, shifts); \
+ gDPLoadSync(pkt); \
+ gDPLoadBlock(pkt, G_TX_LOADTILE, 0, 0, \
+ (((width) * (height) + sLoadTextureBlock_siz_INCR[siz]) >> sLoadTextureBlock_siz_SHIFT[siz]) - 1, \
+ CALC_DXT(width, sLoadTextureBlock_siz_BYTES[siz])); \
+ gDPPipeSync(pkt); \
+ gDPSetTile(pkt, fmt, sLoadTextureBlock_siz[siz], (((width)*sLoadTextureBlock_siz_LINE_BYTES[siz]) + 7) >> 3, \
+ 0, G_TX_RENDERTILE, pal, cmt, maskt, shiftt, cms, masks, shifts); \
+ gDPSetTileSize(pkt, G_TX_RENDERTILE, 0, 0, ((width)-1) << G_TEXTURE_IMAGE_FRAC, \
+ ((height)-1) << G_TEXTURE_IMAGE_FRAC); \
+ })
+#endif