mirror of
https://github.com/libretro/RetroArch
synced 2025-03-24 13:43:32 +00:00
Boots up, but broken graphics.
This commit is contained in:
parent
4f04c1288b
commit
7f5db4d70f
@ -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;
|
||||
|
6
driver.c
6
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)
|
||||
|
@ -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));
|
||||
|
14
wii/input.c
14
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,
|
||||
|
@ -22,6 +22,8 @@
|
||||
#include <sdcard/wiisd_io.h>
|
||||
#include <sdcard/gcsd.h>
|
||||
#include <fat.h>
|
||||
#include <stdio.h>
|
||||
#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);
|
||||
}
|
||||
|
||||
|
75
wii/video.c
75
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;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user