From 1c24f9e297c3340c25182d7e956d2b92d6436ed6 Mon Sep 17 00:00:00 2001 From: Zack Buhman Date: Sun, 26 Jan 2025 07:03:37 -0600 Subject: [PATCH] wiffle_screen_space: use sobel_fipr --- example/example.mk | 1 + example/wiffle_screen_space.cpp | 32 +++++++++++++++++++++++--------- sobel.cpp | 2 +- sobel_fipr.s | 9 +++++++++ 4 files changed, 34 insertions(+), 10 deletions(-) diff --git a/example/example.mk b/example/example.mk index 6147792..e1ea0c0 100644 --- a/example/example.mk +++ b/example/example.mk @@ -217,6 +217,7 @@ WIFFLE_SCREEN_SPACE_OBJ = \ holly/background.o \ holly/ta_fifo_polygon_converter.o \ sh7091/serial.o \ + sobel_fipr.o \ sobel.o example/wiffle_screen_space.elf: LDSCRIPT = $(LIB)/main.lds diff --git a/example/wiffle_screen_space.cpp b/example/wiffle_screen_space.cpp index 029aed4..f632cae 100644 --- a/example/wiffle_screen_space.cpp +++ b/example/wiffle_screen_space.cpp @@ -253,6 +253,8 @@ static uint32_t inbuf[640 * 480] __attribute__((aligned(32))); static float temp[640 * 480] __attribute__((aligned(32))); static uint32_t outbuf[640 * 480] __attribute__((aligned(32))); +extern "C" int sobel_fipr(float * a, uint32_t * i); + void make_temp() { for (int i = 0; i < 640 * 480; i++) { @@ -377,7 +379,7 @@ void main() uint32_t * in = (uint32_t *)&texture_memory64[texture_memory_alloc.texture.start / 4]; //uint32_t * out = (uint32_t *)&texture_memory32[texture_memory_alloc.framebuffer[0].start / 4]; - serial::string("ch1 dma start\n"); + //serial::string("ch1 dma start\n"); dma_transfer((uint32_t)in, (uint32_t)inbuf, 640 * 480 * 4 / 32); for (uint32_t i = 0; i < (sizeof (640 * 480 * 4)) / 32; i++) { @@ -389,22 +391,34 @@ void main() } while ((sh7091.DMAC.CHCR1 & dmac::chcr::te::transfers_completed) == 0); - serial::string("ch1 dma end\n"); + //serial::string("ch1 dma end\n"); - serial::string("temp start\n"); + //serial::string("temp start\n"); make_temp(); - serial::string("temp end\n"); + //serial::string("temp end\n"); - serial::string("convolve start\n"); - convolve(temp, outbuf); - serial::string("convolve end\n"); + //serial::string("convolve start\n"); + + //convolve(temp, outbuf); + int a = sobel_fipr(temp, outbuf); + //serial::integer((uint32_t)temp); + //serial::integer(a); + for (uint32_t i = 0; i < (sizeof (640 * 480 * 4)) / 32; i++) { + uint32_t address = (uint32_t)&outbuf[0]; + asm volatile ("ocbwb @%0" + : // output + : "r" (address + (i * 32)) // input + ); + } + + //serial::string("convolve end\n"); uint32_t framebuffer = 0x11000000 + texture_memory_alloc.framebuffer[0].start; // TA FIFO - Direct Texture Path system.LMMODE0 = 1; system.LMMODE1 = 1; // 32-bit - serial::string("ch2 dma start\n"); + //serial::string("ch2 dma start\n"); ch2_dma_transfer((uint32_t)outbuf, framebuffer, (640 * 480 * 4) / 32); - serial::string("ch2 dma end\n"); + //serial::string("ch2 dma end\n"); while (!spg_status::vsync(holly.SPG_STATUS)); holly.FB_R_SOF1 = texture_memory_alloc.framebuffer[0].start; diff --git a/sobel.cpp b/sobel.cpp index 98c83fa..5d08f2f 100644 --- a/sobel.cpp +++ b/sobel.cpp @@ -70,7 +70,7 @@ void convolve(float * in, uint32_t * out) float c = kernel2(in, x, y); int d = c > 100.f ? 0 : 0xffffffff; - out[y * 640 + x] = (uint8_t)d; + out[y * 640 + x] = d; } } } diff --git a/sobel_fipr.s b/sobel_fipr.s index 7d7540e..0909ce1 100644 --- a/sobel_fipr.s +++ b/sobel_fipr.s @@ -6,6 +6,10 @@ __setup: mov.l r9,@-r15 mov.l r10,@-r15 mov.l r11,@-r15 + fmov.s fr12,@-r15 + fmov.s fr13,@-r15 + fmov.s fr14,@-r15 + fmov.s fr15,@-r15 fldi1 fr8 /* 1.0 */ fldi1 fr9 /* 2.0 */ @@ -141,6 +145,11 @@ _loop_width: /* restore registers */ _return: + fmov.s @r15+,fr15 + fmov.s @r15+,fr14 + fmov.s @r15+,fr13 + fmov.s @r15+,fr12 + mov.l @r15+,r11 mov.l @r15+,r10 mov.l @r15+,r9