From 7f5db4d70ff38df5ed992f86984fd45bd45735d8 Mon Sep 17 00:00:00 2001 From: Themaister Date: Wed, 14 Dec 2011 21:44:03 +0100 Subject: [PATCH] Boots up, but broken graphics. --- config.def.h | 2 +- driver.c | 6 +++++ wii/audio.c | 2 +- wii/input.c | 14 ++++------ wii/main.c | 8 +++--- wii/video.c | 75 +++++++++++++++++++++++++++------------------------- 6 files changed, 56 insertions(+), 51 deletions(-) diff --git a/config.def.h b/config.def.h index c393ce902c..82119bb755 100644 --- a/config.def.h +++ b/config.def.h @@ -188,7 +188,7 @@ static const bool font_enable = true; // This value should stay close to 60Hz to avoid large pitch changes. // If your monitor does not run at 60Hz, or something close to it, disable VSync, // and leave this at its default. -#if defined(__CELLOS_LV2__) || defined(XENON) +#if defined(__CELLOS_LV2__) || defined(XENON) || defined(GEKKO) static const float refresh_rate = 59.92; #else static const float refresh_rate = 59.95; diff --git a/driver.c b/driver.c index 62e1352dec..bdc230cc99 100644 --- a/driver.c +++ b/driver.c @@ -89,6 +89,9 @@ static const video_driver_t *video_drivers[] = { #ifdef HAVE_DYLIB &video_ext, #endif +#ifdef GEKKO + &video_wii, +#endif }; static const input_driver_t *input_drivers[] = { @@ -104,6 +107,9 @@ static const input_driver_t *input_drivers[] = { #ifdef XENON &input_xenon360, #endif +#ifdef GEKKO + &input_wii, +#endif }; static void find_audio_driver(void) diff --git a/wii/audio.c b/wii/audio.c index 19d98da004..7005b36818 100644 --- a/wii/audio.c +++ b/wii/audio.c @@ -91,7 +91,7 @@ static ssize_t wii_audio_write(void *data, const void *buf_, size_t size) if (frames < to_write) to_write = frames; - while ((wa->write_ptr == wa->dma_next || wa->write_ptr == wa->dma_busy) && wa->nonblock) + while ((wa->dma_write == wa->dma_next || wa->dma_write == wa->dma_busy) && !wa->nonblock) LWP_ThreadSleep(wa->cond); memcpy(wa->data[wa->dma_write] + wa->write_ptr, buf, to_write * sizeof(uint32_t)); diff --git a/wii/input.c b/wii/input.c index cd65faa658..1d64bb329b 100644 --- a/wii/input.c +++ b/wii/input.c @@ -59,13 +59,9 @@ static void reset_callback(void) static void *wii_input_init(void) { - static bool inited = false; - if (!inited) - { - SYS_SetResetCallback(reset_callback); - SYS_SetPowerCallback(reset_callback); - PAD_Init(); - } + PAD_Init(); + SYS_SetResetCallback(reset_callback); + SYS_SetPowerCallback(reset_callback); return (void*)-1; } @@ -78,7 +74,7 @@ static void wii_input_poll(void *data) unsigned pads = PAD_ScanPads(); for (unsigned i = 0; i < pads; i++) { - uint16_t down = PAD_ButtonsDown(i); + uint16_t down = PAD_ButtonsHeld(i); _B(B); _B(Y); pad_state[i][SNES_DEVICE_ID_JOYPAD_SELECT] = down & PAD_TRIGGER_Z; @@ -108,7 +104,7 @@ static bool wii_key_pressed(void *data, int key) } } -const input_driver_t input_ps3 = { +const input_driver_t input_wii = { .init = wii_input_init, .poll = wii_input_poll, .input_state = wii_input_state, diff --git a/wii/main.c b/wii/main.c index fb508024bf..1108c98b29 100644 --- a/wii/main.c +++ b/wii/main.c @@ -22,6 +22,8 @@ #include #include #include +#include +#include "../driver.h" int ssnes_main(int argc, char **argv); @@ -29,11 +31,9 @@ int main(void) { char arg0[] = "ssnes"; char arg1[] = "sd:/FFIII.smc"; - char arg2[] = "-v"; - char *argv[] = { arg0, arg1, arg2, NULL }; + char *argv[] = { arg0, arg1, NULL }; fatInitDefault(); - int ret = ssnes_main(sizeof(argv) / sizeof(argv[0]) - 1, argv); - return ret; + return ssnes_main(sizeof(argv) / sizeof(argv[0]) - 1, argv); } diff --git a/wii/video.c b/wii/video.c index 6f01c53bb2..92c098c267 100644 --- a/wii/video.c +++ b/wii/video.c @@ -35,50 +35,58 @@ struct } static g_tex ATTRIBUTE_ALIGN(32); static uint8_t gx_fifo[256 * 1024] ATTRIBUTE_ALIGN(32); -static uint8_t display_list[256] ATTRIBUTE_ALIGN(32); +static uint8_t display_list[128] ATTRIBUTE_ALIGN(32); static size_t display_list_size; static void setup_video_mode(GXRModeObj *mode, void *framebuf[2]) { - VIDEO_Configure(mode); - VIDEO_Flush(); for (unsigned i = 0; i < 2; i++) VIDEO_ClearFrameBuffer(mode, framebuf[i], COLOR_BLACK); + VIDEO_SetNextFramebuffer(framebuf[0]); VIDEO_SetBlack(false); VIDEO_Flush(); VIDEO_WaitVSync(); + if (mode->viTVMode & VI_NON_INTERLACE) + VIDEO_WaitVSync(); } -static float verts[] = { - -1, -1, 0.5, - -1, 1, 0.5, - 1, -1, 0.5, - 1, 1, 0.5, +static float verts[] ATTRIBUTE_ALIGN(32) = { + -1, -1, -0.5, + -1, 1, -0.5, + 1, -1, -0.5, + 1, 1, -0.5, }; -static float tex_coords[] = { +static float tex_coords[] ATTRIBUTE_ALIGN(32) = { 0, 0, 0, 1, 1, 0, 1, 1, }; -static void init_vtx(void) +static void init_vtx(const GXRModeObj *mode) { - GX_SetViewport(0, 0, 640, 480, 0, 1); - GX_SetDispCopyYScale(1.0f); - GX_SetScissor(0, 0, 640, 480); + GX_SetViewport(0, 0, mode->fbWidth, mode->efbHeight, 0, 1); + GX_SetDispCopyYScale(GX_GetYScaleFactor(mode->efbHeight, mode->xfbHeight)); + GX_SetScissor(0, 0, mode->fbWidth, mode->efbHeight); + GX_SetDispCopySrc(0, 0, mode->fbWidth, mode->efbHeight); + GX_SetDispCopyDst(mode->fbWidth, mode->xfbHeight); + GX_SetPixelFmt(GX_PF_RGB8_Z24, GX_ZC_LINEAR); - GX_SetZMode(GX_DISABLE, GX_NEVER, GX_DISABLE); + GX_SetZMode(GX_ENABLE, GX_ALWAYS, GX_ENABLE); GX_SetColorUpdate(GX_TRUE); - Mtx m; - guMtxIdentity(m); + Mtx44 m; + guOrtho(m, 1, -1, -1, 1, 0.4, 0.6); GX_LoadProjectionMtx(m, GX_ORTHOGRAPHIC); - GX_LoadPosMtxImm(m, GX_PNMTX0); + + Mtx pos_m; + guMtxIdentity(pos_m); + GX_LoadPosMtxImm(pos_m, GX_PNMTX0); GX_ClearVtxDesc(); + GX_SetVtxDesc(GX_VA_POS, GX_INDEX8); GX_SetVtxDesc(GX_VA_TEX0, GX_INDEX8); @@ -97,14 +105,14 @@ static void init_vtx(void) static void init_texture(void) { - GX_InitTexObj(&g_tex.obj, g_tex.data, 512, 512, GX_TF_RGB5A3, GX_MIRROR, GX_MIRROR, GX_FALSE); - GX_InitTexObjLOD(&g_tex.obj, GX_LINEAR, GX_LINEAR, 0, 10, 0, GX_ENABLE, GX_FALSE, GX_ANISO_1); + GX_InitTexObj(&g_tex.obj, g_tex.data, 512, 512, GX_TF_RGB565, GX_CLAMP, GX_CLAMP, GX_FALSE); + GX_InitTexObjLOD(&g_tex.obj, GX_LINEAR, GX_LINEAR, 0, 0, 0, GX_ENABLE, GX_FALSE, GX_ANISO_1); GX_LoadTexObj(&g_tex.obj, GX_TEXMAP0); Mtx m; guMtxIdentity(m); - GX_LoadTexMtxImm(m, GX_TEXMTX0, GX_MTX2x4); - GX_SetTexCoordGen(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, GX_TEXMTX0); + GX_LoadTexMtxImm(m, GX_TEXMTX0, GX_MTX3x4); + GX_SetTexCoordGen(GX_TEXCOORD0, GX_TG_MTX3x4, GX_TG_TEX0, GX_TEXMTX0); GX_InvalidateTexAll(); } @@ -126,24 +134,18 @@ static void build_disp_list(void) static void *wii_init(const video_info_t *video, const input_driver_t **input, void **input_data) { - static bool inited = false; - if (!inited) - { - VIDEO_Init(); - inited = true; - } - + VIDEO_Init(); GXRModeObj *mode = VIDEO_GetPreferredMode(NULL); for (unsigned i = 0; i < 2; i++) g_framebuf[i] = MEM_K0_TO_K1(SYS_AllocateFramebuffer(mode)); - setup_video_mode(VIDEO_GetPreferredMode(NULL), g_framebuf); + setup_video_mode(mode, g_framebuf); GX_Init(gx_fifo, sizeof(gx_fifo)); GX_SetDispCopyGamma(GX_GM_1_0); GX_SetCullMode(GX_CULL_NONE); - init_vtx(); + init_vtx(mode); init_texture(); build_disp_list(); @@ -155,6 +157,8 @@ static void *wii_init(const video_info_t *video, static void update_texture(const uint16_t *src, unsigned width, unsigned height, unsigned pitch) { + width <<= 1; + pitch >>= 1; float tex_w = (float)width / 512; float tex_h = (float)height / 512; @@ -162,12 +166,11 @@ static void update_texture(const uint16_t *src, tex_coords[3] = tex_coords[7] = tex_h; uint16_t *dst = g_tex.data; - for (unsigned i = 0; i < height; i++, - dst += 512, src += pitch >> 1) - { - memcpy(dst, src, width * sizeof(uint16_t)); - } + for (unsigned i = 0; i < height; i++, dst += 512, src += pitch) + memcpy(dst, src, width); + DCFlushRange(tex_coords, sizeof(tex_coords)); + DCFlushRange(g_tex.data, sizeof(g_tex.data)); GX_InvalidateTexAll(); } @@ -188,7 +191,7 @@ static bool wii_frame(void *data, const void *frame, GX_CopyDisp(g_framebuf[g_framebuf_index], GX_TRUE); VIDEO_SetNextFramebuffer(g_framebuf[g_framebuf_index]); VIDEO_Flush(); - VIDEO_WaitVSync(); + //VIDEO_WaitVSync(); return true; }