Wii: Tiny refactor

This commit is contained in:
Jeffrey Pfau 2015-09-24 01:42:21 -07:00
parent 2083aa921b
commit d0c2d4e46b
1 changed files with 35 additions and 23 deletions

View File

@ -51,7 +51,7 @@ static s8 WPAD_StickY(u8 chan, u8 right);
static struct GBAVideoSoftwareRenderer renderer;
static struct GBARumble rumble;
static struct GBARotationSource rotation;
static GXRModeObj* mode;
static GXRModeObj* vmode;
static Mtx model, view, modelview;
static uint16_t* texmem;
static GXTexObj tex;
@ -61,7 +61,7 @@ static int32_t gyroZ;
static uint32_t retraceCount;
static uint32_t referenceRetraceCount;
static void* framebuffer[2];
static void* framebuffer[2] = { 0, 0 };
static int whichFb = 0;
static struct GBAStereoSample audioBuffer[3][SAMPLES] __attribute__((__aligned__(32)));
@ -70,6 +70,33 @@ static volatile int currentAudioBuffer = 0;
static struct GUIFont* font;
static void reconfigureScreen(GXRModeObj* vmode) {
free(framebuffer[0]);
free(framebuffer[1]);
framebuffer[0] = SYS_AllocateFramebuffer(vmode);
framebuffer[1] = SYS_AllocateFramebuffer(vmode);
VIDEO_SetBlack(true);
VIDEO_Configure(vmode);
VIDEO_SetNextFramebuffer(framebuffer[whichFb]);
VIDEO_SetBlack(false);
VIDEO_Flush();
VIDEO_WaitVSync();
if (vmode->viTVMode & VI_NON_INTERLACE) {
VIDEO_WaitVSync();
}
GX_SetViewport(0, 0, vmode->fbWidth, vmode->efbHeight, 0, 1);
f32 yscale = GX_GetYScaleFactor(vmode->efbHeight, vmode->xfbHeight);
u32 xfbHeight = GX_SetDispCopyYScale(yscale);
GX_SetScissor(0, 0, vmode->viWidth, vmode->viWidth);
GX_SetDispCopySrc(0, 0, vmode->fbWidth, vmode->efbHeight);
GX_SetDispCopyDst(vmode->fbWidth, xfbHeight);
GX_SetCopyFilter(vmode->aa, vmode->sample_pattern, GX_TRUE, vmode->vfilter);
GX_SetFieldMode(vmode->field_rendering, ((vmode->viHeight == 2 * vmode->xfbHeight) ? GX_ENABLE : GX_DISABLE));
};
int main() {
VIDEO_Init();
PAD_Init();
@ -85,33 +112,15 @@ int main() {
#error This pixel format is unsupported. Please use -DCOLOR_16-BIT -DCOLOR_5_6_5
#endif
mode = VIDEO_GetPreferredMode(0);
framebuffer[0] = SYS_AllocateFramebuffer(mode);
framebuffer[1] = SYS_AllocateFramebuffer(mode);
VIDEO_Configure(mode);
VIDEO_SetNextFramebuffer(framebuffer[whichFb]);
VIDEO_SetBlack(FALSE);
VIDEO_Flush();
VIDEO_WaitVSync();
if (mode->viTVMode & VI_NON_INTERLACE) {
VIDEO_WaitVSync();
}
vmode = VIDEO_GetPreferredMode(0);
GXColor bg = { 0, 0, 0, 0xFF };
void* fifo = memalign(32, 0x40000);
memset(fifo, 0, 0x40000);
GX_Init(fifo, 0x40000);
GX_SetCopyClear(bg, 0x00FFFFFF);
GX_SetViewport(0, 0, mode->fbWidth, mode->efbHeight, 0, 1);
f32 yscale = GX_GetYScaleFactor(mode->efbHeight, mode->xfbHeight);
u32 xfbHeight = GX_SetDispCopyYScale(yscale);
GX_SetScissor(0, 0, mode->viWidth, mode->viWidth);
GX_SetDispCopySrc(0, 0, mode->fbWidth, mode->efbHeight);
GX_SetDispCopyDst(mode->fbWidth, xfbHeight);
GX_SetCopyFilter(mode->aa, mode->sample_pattern, GX_TRUE, mode->vfilter);
GX_SetFieldMode(mode->field_rendering, ((mode->viHeight == 2 * mode->xfbHeight) ? GX_ENABLE : GX_DISABLE));
reconfigureScreen(vmode);
GX_SetCullMode(GX_CULL_NONE);
GX_CopyDisp(framebuffer[whichFb], GX_TRUE);
@ -192,6 +201,9 @@ int main() {
free(renderer.outputBuffer);
GUIFontDestroy(font);
free(framebuffer[0]);
free(framebuffer[1]);
return 0;
}
@ -216,7 +228,7 @@ static void _drawStart(void) {
GX_SetZMode(GX_TRUE, GX_LEQUAL, GX_TRUE);
GX_SetColorUpdate(GX_TRUE);
GX_SetViewport(0, 0, mode->fbWidth, mode->efbHeight, 0, 1);
GX_SetViewport(0, 0, vmode->fbWidth, vmode->efbHeight, 0, 1);
}
static void _drawEnd(void) {