diff options
author | Bad Diode <bd@badd10de.dev> | 2022-10-16 12:52:24 +0200 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2022-10-16 12:52:24 +0200 |
commit | 40fe8dfc9f9e6e1d69d442fa9e6b15e555d27650 (patch) | |
tree | 789c0c5b83553939dc2bd7b5f840fc7790b20594 /src | |
parent | c4d74be0b2157b50b324db1f0bf9a871fd066619 (diff) | |
download | uxn64-40fe8dfc9f9e6e1d69d442fa9e6b15e555d27650.tar.gz uxn64-40fe8dfc9f9e6e1d69d442fa9e6b15e555d27650.zip |
Add weird fb blit with textures
Diffstat (limited to 'src')
-rw-r--r-- | src/main.c | 146 | ||||
-rw-r--r-- | src/spec | 2 |
2 files changed, 142 insertions, 6 deletions
@@ -26,8 +26,14 @@ u64 boot_stack[STACK_SIZE / sizeof(u64)] __attribute__((aligned(8))); | |||
26 | // | 26 | // |
27 | 27 | ||
28 | u16 framebuffers[2][SCREEN_WIDTH * SCREEN_HEIGHT] __attribute__((aligned(16))); | 28 | u16 framebuffers[2][SCREEN_WIDTH * SCREEN_HEIGHT] __attribute__((aligned(16))); |
29 | |||
30 | // | ||
31 | // Statics. | ||
32 | // | ||
33 | |||
29 | static int current_fb = 0; | 34 | static int current_fb = 0; |
30 | static u16 pixels[SCREEN_WIDTH * SCREEN_HEIGHT] __attribute__((aligned(16))); | 35 | static u16 pixels[SCREEN_WIDTH * SCREEN_HEIGHT] __attribute__((aligned(16))); |
36 | static Gfx glist[2048 * 8]; | ||
31 | 37 | ||
32 | // | 38 | // |
33 | // Message buffers and queues. | 39 | // Message buffers and queues. |
@@ -70,16 +76,73 @@ fb_copy_test(void) { | |||
70 | } | 76 | } |
71 | 77 | ||
72 | void | 78 | void |
79 | rdp_init(void) { | ||
80 | Gfx *glistp = glist; | ||
81 | |||
82 | static const Vp viewport = {{ | ||
83 | .vscale = {SCREEN_WIDTH * 2, SCREEN_HEIGHT * 2, G_MAXZ / 2, 0}, | ||
84 | .vtrans = {SCREEN_WIDTH * 2, SCREEN_HEIGHT * 2, G_MAXZ / 2, 0}, | ||
85 | }}; | ||
86 | |||
87 | // Initialize the RSP. | ||
88 | Gfx rspinit_dl[] = { | ||
89 | gsSPViewport(&viewport), | ||
90 | gsSPClearGeometryMode(G_SHADE | G_SHADING_SMOOTH | G_CULL_BOTH | | ||
91 | G_FOG | G_LIGHTING | G_TEXTURE_GEN | | ||
92 | G_TEXTURE_GEN_LINEAR | G_LOD), | ||
93 | gsSPTexture(0, 0, 0, 0, G_OFF), | ||
94 | }; | ||
95 | |||
96 | // Initialize the RDP. | ||
97 | Gfx rdpinit_dl[] = { | ||
98 | gsDPSetCycleType(G_CYC_1CYCLE), | ||
99 | gsDPSetScissor(G_SC_NON_INTERLACE, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), | ||
100 | gsDPSetCombineKey(G_CK_NONE), | ||
101 | gsDPSetAlphaCompare(G_AC_NONE), | ||
102 | gsDPSetRenderMode(G_RM_NOOP, G_RM_NOOP2), | ||
103 | gsDPSetColorDither(G_CD_DISABLE), | ||
104 | gsDPPipeSync(), | ||
105 | }; | ||
106 | |||
107 | gSPDisplayList(glistp++, rspinit_dl); | ||
108 | gSPDisplayList(glistp++, rdpinit_dl); | ||
109 | gDPFullSync(glistp++); | ||
110 | gSPEndDisplayList(glistp++); | ||
111 | |||
112 | // Start up the task list. | ||
113 | OSTask tlist = (OSTask){ | ||
114 | { | ||
115 | .type = M_GFXTASK, | ||
116 | .flags = OS_TASK_DP_WAIT, | ||
117 | .ucode_boot = (u64*)rspbootTextStart, | ||
118 | .ucode_boot_size = (u32)rspbootTextEnd - (u32)rspbootTextStart, | ||
119 | .ucode = (u64*)gspF3DEX2_xbusTextStart, | ||
120 | .ucode_size = SP_UCODE_SIZE, | ||
121 | .ucode_data = (u64*)gspF3DEX2_xbusDataStart, | ||
122 | .ucode_data_size = SP_UCODE_DATA_SIZE, | ||
123 | .data_ptr = (u64*)glist, | ||
124 | .data_size = (u32)((glistp - glist) * sizeof(Gfx)), | ||
125 | .dram_stack = dram_stack, | ||
126 | .dram_stack_size = SP_DRAM_STACK_SIZE8, | ||
127 | }, | ||
128 | }; | ||
129 | osSpTaskStart(&tlist); | ||
130 | |||
131 | // Wait for RDP completion. | ||
132 | osRecvMesg(&rdp_msg_queue, NULL, OS_MESG_BLOCK); | ||
133 | } | ||
134 | |||
135 | void | ||
73 | rdp_clearfb(u8 r, u8 g, u8 b) { | 136 | rdp_clearfb(u8 r, u8 g, u8 b) { |
74 | Gfx glist[2048]; | ||
75 | Gfx *glistp = glist; | 137 | Gfx *glistp = glist; |
76 | Gfx clearcfb_dl[] = { | 138 | Gfx clearcfb_dl[] = { |
77 | gsDPSetCycleType(G_CYC_FILL), | 139 | gsDPSetCycleType(G_CYC_FILL), |
78 | gsDPSetColorImage( | 140 | gsDPSetColorImage( |
79 | G_IM_FMT_RGBA, G_IM_SIZ_16b, SCREEN_WIDTH, framebuffers[current_fb]), | 141 | G_IM_FMT_RGBA, G_IM_SIZ_16b, SCREEN_WIDTH, framebuffers[current_fb]), |
80 | gsDPSetFillColor(GPACK_RGBA5551(r, g, b, 1)), | 142 | gsDPSetFillColor( |
143 | GPACK_RGBA5551(r, g, b, 1) << 16 | GPACK_RGBA5551(r, g, b, 1)), | ||
81 | gsDPFillRectangle(0, 0, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1), | 144 | gsDPFillRectangle(0, 0, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1), |
82 | gsSPEndDisplayList(), | 145 | gsDPPipeSync(), |
83 | }; | 146 | }; |
84 | gSPDisplayList(glistp++, clearcfb_dl); | 147 | gSPDisplayList(glistp++, clearcfb_dl); |
85 | gDPFullSync(glistp++); | 148 | gDPFullSync(glistp++); |
@@ -108,6 +171,73 @@ rdp_clearfb(u8 r, u8 g, u8 b) { | |||
108 | osRecvMesg(&rdp_msg_queue, NULL, OS_MESG_BLOCK); | 171 | osRecvMesg(&rdp_msg_queue, NULL, OS_MESG_BLOCK); |
109 | } | 172 | } |
110 | 173 | ||
174 | void | ||
175 | rdp_texture_copy(void) { | ||
176 | Gfx *glistp = glist; | ||
177 | Gfx dl[] = { | ||
178 | gsDPSetTexturePersp(G_TP_NONE), | ||
179 | gsDPSetCycleType(G_CYC_COPY), | ||
180 | gsDPSetRenderMode(G_RM_NOOP, G_RM_NOOP2), | ||
181 | gsSPClearGeometryMode(G_SHADE | G_SHADING_SMOOTH), | ||
182 | gsSPTexture(0x2000, 0x2000, 0, G_TX_RENDERTILE, G_ON), | ||
183 | gsDPSetCombineMode(G_CC_DECALRGB, G_CC_DECALRGB), | ||
184 | gsDPSetTexturePersp(G_TP_NONE), | ||
185 | gsDPSetTextureFilter(G_TF_POINT), | ||
186 | }; | ||
187 | gSPDisplayList(glistp++, dl); | ||
188 | for (size_t i = 0; i < 240; i++) { | ||
189 | gDPLoadTextureBlock( | ||
190 | glistp++, | ||
191 | &pixels[320 * 1 * i], // Texture data. | ||
192 | G_IM_FMT_RGBA, // Image format. | ||
193 | G_IM_SIZ_16b, // Pixel component size. | ||
194 | 320, // Width. | ||
195 | 1, // Height. | ||
196 | 0, // Palette location. | ||
197 | G_TX_CLAMP, // S-axis mirror/wrap/clamp. | ||
198 | G_TX_CLAMP, // T-axis mirror/wrap/clamp. | ||
199 | 0, // S-axis mask. | ||
200 | 0, // T-axis mask. | ||
201 | G_TX_NOLOD, // S-axis shift. | ||
202 | G_TX_NOLOD); // T-axis shift. | ||
203 | gSPTextureRectangle( | ||
204 | glistp++, | ||
205 | 0, // ulx | ||
206 | (1 * i) << 2, // uly | ||
207 | (320 * (i + 1)) << 2, // lrx | ||
208 | (1 * (i + 1)) << 2, // lry | ||
209 | 0, | ||
210 | 0, | ||
211 | 0, | ||
212 | 4 << 10, | ||
213 | 1 << 10); | ||
214 | } | ||
215 | gDPFullSync(glistp++); | ||
216 | gSPEndDisplayList(glistp++); | ||
217 | |||
218 | // Start up the task list. | ||
219 | OSTask tlist = (OSTask){ | ||
220 | { | ||
221 | .type = M_GFXTASK, | ||
222 | .flags = OS_TASK_DP_WAIT, | ||
223 | .ucode_boot = (u64*)rspbootTextStart, | ||
224 | .ucode_boot_size = (u32)rspbootTextEnd - (u32)rspbootTextStart, | ||
225 | .ucode = (u64*)gspF3DEX2_xbusTextStart, | ||
226 | .ucode_size = SP_UCODE_SIZE, | ||
227 | .ucode_data = (u64*)gspF3DEX2_xbusDataStart, | ||
228 | .ucode_data_size = SP_UCODE_DATA_SIZE, | ||
229 | .data_ptr = (u64*)glist, | ||
230 | .data_size = (u32)((glistp - glist) * sizeof(Gfx)), | ||
231 | .dram_stack = dram_stack, | ||
232 | .dram_stack_size = SP_DRAM_STACK_SIZE8, | ||
233 | }, | ||
234 | }; | ||
235 | osSpTaskStart(&tlist); | ||
236 | |||
237 | // Wait for RDP completion. | ||
238 | osRecvMesg(&rdp_msg_queue, NULL, OS_MESG_BLOCK); | ||
239 | } | ||
240 | |||
111 | static void | 241 | static void |
112 | main_proc(void *arg) { | 242 | main_proc(void *arg) { |
113 | (void)arg; | 243 | (void)arg; |
@@ -141,7 +271,7 @@ main_proc(void *arg) { | |||
141 | } | 271 | } |
142 | 272 | ||
143 | // Clear the framebuffer with rdp. | 273 | // Clear the framebuffer with rdp. |
144 | // rdp_clearfb(0, 0, 0); | 274 | rdp_init(); |
145 | 275 | ||
146 | // Main loop. | 276 | // Main loop. |
147 | int increment = 4; | 277 | int increment = 4; |
@@ -159,6 +289,7 @@ main_proc(void *arg) { | |||
159 | // osWritebackDCacheAll(); | 289 | // osWritebackDCacheAll(); |
160 | // B | 290 | // B |
161 | // fb_write_test(); | 291 | // fb_write_test(); |
292 | // osWritebackDCacheAll(); | ||
162 | // C | 293 | // C |
163 | for (size_t j = 0; j < SCREEN_HEIGHT; j++) { | 294 | for (size_t j = 0; j < SCREEN_HEIGHT; j++) { |
164 | for (size_t i = 0; i < SCREEN_WIDTH; i++) { | 295 | for (size_t i = 0; i < SCREEN_WIDTH; i++) { |
@@ -168,7 +299,12 @@ main_proc(void *arg) { | |||
168 | pixels[i + j * SCREEN_WIDTH] = color; | 299 | pixels[i + j * SCREEN_WIDTH] = color; |
169 | } | 300 | } |
170 | } | 301 | } |
171 | fb_copy_test(); | 302 | // osWritebackDCacheAll(); |
303 | // fb_copy_test(); | ||
304 | // D | ||
305 | rdp_texture_copy(); | ||
306 | // osWritebackDCacheAll(); | ||
307 | // osWritebackDCacheAll(); | ||
172 | 308 | ||
173 | // Swap buffers. | 309 | // Swap buffers. |
174 | osViSwapBuffer(framebuffers[current_fb]); | 310 | osViSwapBuffer(framebuffers[current_fb]); |
@@ -10,6 +10,6 @@ beginseg | |||
10 | endseg | 10 | endseg |
11 | 11 | ||
12 | beginwave | 12 | beginwave |
13 | name "build/onetri" | 13 | name "build/blank" |
14 | include "code" | 14 | include "code" |
15 | endwave | 15 | endwave |