aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2022-10-16 12:52:24 +0200
committerBad Diode <bd@badd10de.dev>2022-10-16 12:52:24 +0200
commit40fe8dfc9f9e6e1d69d442fa9e6b15e555d27650 (patch)
tree789c0c5b83553939dc2bd7b5f840fc7790b20594 /src
parentc4d74be0b2157b50b324db1f0bf9a871fd066619 (diff)
downloaduxn64-40fe8dfc9f9e6e1d69d442fa9e6b15e555d27650.tar.gz
uxn64-40fe8dfc9f9e6e1d69d442fa9e6b15e555d27650.zip
Add weird fb blit with textures
Diffstat (limited to 'src')
-rw-r--r--src/main.c146
-rw-r--r--src/spec2
2 files changed, 142 insertions, 6 deletions
diff --git a/src/main.c b/src/main.c
index 09bcf9c..4415e27 100644
--- a/src/main.c
+++ b/src/main.c
@@ -26,8 +26,14 @@ u64 boot_stack[STACK_SIZE / sizeof(u64)] __attribute__((aligned(8)));
26// 26//
27 27
28u16 framebuffers[2][SCREEN_WIDTH * SCREEN_HEIGHT] __attribute__((aligned(16))); 28u16 framebuffers[2][SCREEN_WIDTH * SCREEN_HEIGHT] __attribute__((aligned(16)));
29
30//
31// Statics.
32//
33
29static int current_fb = 0; 34static int current_fb = 0;
30static u16 pixels[SCREEN_WIDTH * SCREEN_HEIGHT] __attribute__((aligned(16))); 35static u16 pixels[SCREEN_WIDTH * SCREEN_HEIGHT] __attribute__((aligned(16)));
36static 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
72void 78void
79rdp_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
135void
73rdp_clearfb(u8 r, u8 g, u8 b) { 136rdp_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
174void
175rdp_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
111static void 241static void
112main_proc(void *arg) { 242main_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]);
diff --git a/src/spec b/src/spec
index 4f7ab6b..5c9e8d2 100644
--- a/src/spec
+++ b/src/spec
@@ -10,6 +10,6 @@ beginseg
10endseg 10endseg
11 11
12beginwave 12beginwave
13 name "build/onetri" 13 name "build/blank"
14 include "code" 14 include "code"
15endwave 15endwave