mirror of
https://github.com/dborth/fceugx.git
synced 2025-01-05 21:38:17 +01:00
proper code to change video modes
This commit is contained in:
parent
2c662616c5
commit
100263673a
@ -32,13 +32,12 @@ int FDSSwitchRequested;
|
||||
|
||||
/*** External 2D Video ***/
|
||||
/*** 2D Video Globals ***/
|
||||
static GXRModeObj *vmode; // Graphics Mode Object
|
||||
static unsigned int *xfb[2]; // Framebuffers
|
||||
static GXRModeObj *vmode = NULL; // Graphics Mode Object
|
||||
static unsigned int *xfb[2] = { NULL, NULL }; // Framebuffers
|
||||
static int whichfb = 0; // Frame buffer toggle
|
||||
int screenheight;
|
||||
int screenwidth;
|
||||
int screenheight = 480;
|
||||
int screenwidth = 640;
|
||||
bool progressive = false;
|
||||
static int currentVideoMode = -1; // -1 - not set, 0 - automatic, 1 - NTSC (480i), 2 - Progressive (480p), 3 - PAL (50Hz), 4 - PAL (60Hz)
|
||||
static int oldRenderMode = -1; // set to GCSettings.render when changing (temporarily) to another mode
|
||||
|
||||
/*** 3D GX ***/
|
||||
@ -459,50 +458,49 @@ UpdateScaling()
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* SetupVideoMode
|
||||
* FindVideoMode
|
||||
*
|
||||
* Finds the optimal video mode, or uses the user-specified one
|
||||
* Also configures original video modes
|
||||
***************************************************************************/
|
||||
static void SetupVideoMode()
|
||||
static GXRModeObj * FindVideoMode()
|
||||
{
|
||||
if(currentVideoMode == GCSettings.videomode)
|
||||
return; // no need to do anything
|
||||
|
||||
GXRModeObj * mode;
|
||||
|
||||
// choose the desired video mode
|
||||
switch(GCSettings.videomode)
|
||||
{
|
||||
case 1: // NTSC (480i)
|
||||
vmode = &TVNtsc480IntDf;
|
||||
mode = &TVNtsc480IntDf;
|
||||
break;
|
||||
case 2: // Progressive (480p)
|
||||
vmode = &TVNtsc480Prog;
|
||||
mode = &TVNtsc480Prog;
|
||||
break;
|
||||
case 3: // PAL (50Hz)
|
||||
vmode = &TVPal574IntDfScale;
|
||||
mode = &TVPal574IntDfScale;
|
||||
break;
|
||||
case 4: // PAL (60Hz)
|
||||
vmode = &TVEurgb60Hz480IntDf;
|
||||
mode = &TVEurgb60Hz480IntDf;
|
||||
break;
|
||||
default:
|
||||
vmode = VIDEO_GetPreferredMode(NULL);
|
||||
mode = VIDEO_GetPreferredMode(NULL);
|
||||
|
||||
#ifdef HW_DOL
|
||||
/* we have component cables, but the preferred mode is interlaced
|
||||
* why don't we switch into progressive?
|
||||
* on the Wii, the user can do this themselves on their Wii Settings */
|
||||
if(VIDEO_HaveComponentCable())
|
||||
vmode = &TVNtsc480Prog;
|
||||
mode = &TVNtsc480Prog;
|
||||
#endif
|
||||
|
||||
// use hardware vertical scaling to fill screen
|
||||
if(vmode->viTVMode >> 2 == VI_PAL)
|
||||
vmode = &TVPal574IntDfScale;
|
||||
if(mode->viTVMode >> 2 == VI_PAL)
|
||||
mode = &TVPal574IntDfScale;
|
||||
break;
|
||||
}
|
||||
|
||||
// configure original modes
|
||||
switch (vmode->viTVMode >> 2)
|
||||
switch (mode->viTVMode >> 2)
|
||||
{
|
||||
case VI_PAL:
|
||||
// 576 lines (PAL 50Hz)
|
||||
@ -531,14 +529,14 @@ static void SetupVideoMode()
|
||||
|
||||
// Original Video modes (forced to PAL 60Hz)
|
||||
// set video signal mode
|
||||
PAL_240p.viTVMode = VI_TVMODE(vmode->viTVMode >> 2, VI_NON_INTERLACE);
|
||||
PAL_240p.viTVMode = VI_TVMODE(mode->viTVMode >> 2, VI_NON_INTERLACE);
|
||||
PAL_240p.viYOrigin = (VI_MAX_HEIGHT_NTSC - 480)/2;
|
||||
NTSC_240p.viTVMode = VI_TVMODE(vmode->viTVMode >> 2, VI_NON_INTERLACE);
|
||||
NTSC_240p.viTVMode = VI_TVMODE(mode->viTVMode >> 2, VI_NON_INTERLACE);
|
||||
break;
|
||||
}
|
||||
|
||||
// check for progressive scan
|
||||
if (vmode->viTVMode == VI_TVMODE_NTSC_PROG)
|
||||
if (mode->viTVMode == VI_TVMODE_NTSC_PROG)
|
||||
progressive = true;
|
||||
else
|
||||
progressive = false;
|
||||
@ -547,11 +545,51 @@ static void SetupVideoMode()
|
||||
// widescreen fix
|
||||
if(CONF_GetAspectRatio() == CONF_ASPECT_16_9)
|
||||
{
|
||||
vmode->viWidth = VI_MAX_WIDTH_PAL;
|
||||
mode->viWidth = VI_MAX_WIDTH_PAL;
|
||||
}
|
||||
#endif
|
||||
|
||||
currentVideoMode = GCSettings.videomode;
|
||||
return mode;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* SetupVideoMode
|
||||
*
|
||||
* Sets up the given video mode
|
||||
***************************************************************************/
|
||||
static void SetupVideoMode(GXRModeObj * mode)
|
||||
{
|
||||
if(vmode == mode)
|
||||
return;
|
||||
|
||||
VIDEO_SetPostRetraceCallback (NULL);
|
||||
copynow = GX_FALSE;
|
||||
VIDEO_Configure (mode);
|
||||
VIDEO_Flush();
|
||||
|
||||
// Allocate the video buffers
|
||||
if(xfb[0]) free(MEM_K1_TO_K0(xfb[0]));
|
||||
if(xfb[1]) free(MEM_K1_TO_K0(xfb[1]));
|
||||
xfb[0] = (u32 *) MEM_K0_TO_K1 (SYS_AllocateFramebuffer (mode));
|
||||
xfb[1] = (u32 *) MEM_K0_TO_K1 (SYS_AllocateFramebuffer (mode));
|
||||
|
||||
// Clear framebuffers etc.
|
||||
VIDEO_ClearFrameBuffer (mode, xfb[0], COLOR_BLACK);
|
||||
VIDEO_ClearFrameBuffer (mode, xfb[1], COLOR_BLACK);
|
||||
VIDEO_SetNextFramebuffer (xfb[0]);
|
||||
|
||||
VIDEO_SetBlack (FALSE);
|
||||
VIDEO_Flush ();
|
||||
VIDEO_WaitVSync ();
|
||||
|
||||
if (mode->viTVMode & VI_NON_INTERLACE)
|
||||
VIDEO_WaitVSync();
|
||||
else
|
||||
while (VIDEO_GetNextField())
|
||||
VIDEO_WaitVSync();
|
||||
|
||||
VIDEO_SetPostRetraceCallback ((VIRetraceCallback)copy_to_xfb);
|
||||
vmode = mode;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
@ -563,41 +601,11 @@ static void SetupVideoMode()
|
||||
void
|
||||
InitGCVideo ()
|
||||
{
|
||||
SetupVideoMode();
|
||||
|
||||
// configure VI
|
||||
VIDEO_Configure (vmode);
|
||||
|
||||
screenheight = 480;
|
||||
screenwidth = 640;
|
||||
|
||||
// Allocate the video buffers
|
||||
xfb[0] = (u32 *) MEM_K0_TO_K1 (SYS_AllocateFramebuffer (vmode));
|
||||
xfb[1] = (u32 *) MEM_K0_TO_K1 (SYS_AllocateFramebuffer (vmode));
|
||||
|
||||
// A console is always useful while debugging.
|
||||
//console_init (xfb[0], 20, 64, vmode->fbWidth, vmode->xfbHeight, vmode->fbWidth * 2);
|
||||
|
||||
// Clear framebuffers etc.
|
||||
VIDEO_ClearFrameBuffer (vmode, xfb[0], COLOR_BLACK);
|
||||
VIDEO_ClearFrameBuffer (vmode, xfb[1], COLOR_BLACK);
|
||||
VIDEO_SetNextFramebuffer (xfb[0]);
|
||||
|
||||
// video callbacks
|
||||
VIDEO_SetPostRetraceCallback ((VIRetraceCallback)copy_to_xfb);
|
||||
|
||||
VIDEO_SetBlack (FALSE);
|
||||
VIDEO_Flush ();
|
||||
VIDEO_WaitVSync ();
|
||||
if (vmode->viTVMode & VI_NON_INTERLACE)
|
||||
VIDEO_WaitVSync ();
|
||||
|
||||
copynow = GX_FALSE;
|
||||
|
||||
GXRModeObj *rmode = FindVideoMode();
|
||||
SetupVideoMode(rmode);
|
||||
StartGX ();
|
||||
InitLUTs(); // init LUTs for hq2x
|
||||
InitVideoThread ();
|
||||
// Finally, the video is up and ready for use :)
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
@ -608,24 +616,16 @@ InitGCVideo ()
|
||||
void
|
||||
ResetVideo_Emu ()
|
||||
{
|
||||
SetupVideoMode();
|
||||
GXRModeObj *rmode = vmode; // same mode as menu
|
||||
GXRModeObj *rmode;
|
||||
Mtx44 p;
|
||||
|
||||
// change current VI mode if using original render mode
|
||||
if (GCSettings.render == 0)
|
||||
rmode = tvmodes[GCSettings.timing];
|
||||
|
||||
// reconfigure VI
|
||||
VIDEO_Configure (rmode);
|
||||
VIDEO_Flush();
|
||||
VIDEO_WaitVSync();
|
||||
if (rmode->viTVMode & VI_NON_INTERLACE)
|
||||
VIDEO_WaitVSync();
|
||||
else
|
||||
while (VIDEO_GetNextField())
|
||||
VIDEO_WaitVSync();
|
||||
rmode = FindVideoMode();
|
||||
|
||||
SetupVideoMode(rmode); // reconfigure VI
|
||||
VIDEO_SetPreRetraceCallback(NULL);
|
||||
|
||||
GXColor background = {0, 0, 0, 255};
|
||||
@ -864,17 +864,9 @@ ResetVideo_Menu ()
|
||||
Mtx44 p;
|
||||
f32 yscale;
|
||||
u32 xfbHeight;
|
||||
GXRModeObj * rmode = FindVideoMode();
|
||||
|
||||
SetupVideoMode();
|
||||
VIDEO_Configure (vmode);
|
||||
VIDEO_Flush();
|
||||
VIDEO_WaitVSync();
|
||||
if (vmode->viTVMode & VI_NON_INTERLACE)
|
||||
VIDEO_WaitVSync();
|
||||
else
|
||||
while (VIDEO_GetNextField())
|
||||
VIDEO_WaitVSync();
|
||||
|
||||
SetupVideoMode(rmode); // reconfigure VI
|
||||
VIDEO_SetPreRetraceCallback((VIRetraceCallback)UpdatePads);
|
||||
|
||||
// clears the bg to color and clears the z buffer
|
||||
|
@ -2,6 +2,9 @@
|
||||
Copyright (c) 2008 Francisco Muñoz 'Hermes' <www.elotrolado.net>
|
||||
All rights reserved.
|
||||
|
||||
Proper (standard) vorbis usage by Tantric, 2009
|
||||
Threading modifications/corrections by Tantric, 2009
|
||||
|
||||
Redistribution and use in source and binary forms, with or without modification, are
|
||||
permitted provided that the following conditions are met:
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user