fixed some video options not being properly set, modified Xscale/Yscale displayed values

This commit is contained in:
ekeeke31 2008-10-03 14:14:20 +00:00
parent c1772021b5
commit c012b71248
5 changed files with 57 additions and 52 deletions

View File

@ -16,10 +16,12 @@ CURRENT:
[NGC/Wii] [NGC/Wii]
- removed unused libsamplerate settings for HQ YM2612 (now use "FAST" setting for MAME by default) - now use fixed libsamplerate setting in "HQ YM2612" mode
- improved fast scrolling in menus when using Wiimote D-PAD - implemented menu fast scrolling with the Wiimote D-PAD
- fixed config file incompatibility between GC and Wii versions - fixed config file incompatibilities between Gamecube and Wii versions
- re-enabled texture filtering in H40 original mode when overscan is emulated: fix screen scroll tearing - re-enabled texture filtering in H40 original mode when overscan is emulated: fix screen scroll tearing
- added Shay Green's NTSC Filters support
- added proper 480p menu detection for NTSC Gamecube users
26/08/2008: 26/08/2008:

View File

@ -319,13 +319,15 @@ void dispmenu ()
while (quit == 0) while (quit == 0)
{ {
sprintf (items[0], "Aspect: %s", config.aspect ? "ORIGINAL" : "STRETCH"); ogc_video__scale();
if (config.render == 1) sprintf (items[1], "TV Mode: INTERLACED");
else if (config.render == 2) sprintf (items[1], "TV Mode: PROGRESSIVE"); sprintf (items[0], "Aspect: %s", config.aspect ? "ORIGINAL" : "STRETCH");
else sprintf (items[1], "TV Mode: ORIGINAL"); if (config.render == 1) sprintf (items[1], "Render: INTERLACED");
if (config.tv_mode == 0) sprintf (items[2], "TV Frequency: 60HZ"); else if (config.render == 2) sprintf (items[1], "Render: PROGRESSIVE");
else if (config.tv_mode == 1) sprintf (items[2], "TV Frequency: 50HZ"); else sprintf (items[1], "Render: ORIGINAL");
else sprintf (items[2], "TV Frequency: 50/60HZ"); if (config.tv_mode == 0) sprintf (items[2], "TV Mode: 60HZ");
else if (config.tv_mode == 1) sprintf (items[2], "TV Mode: 50HZ");
else sprintf (items[2], "TV Mode: 50/60HZ");
sprintf (items[3], "Texture Filter: %s", config.filtering ? " ON" : "OFF"); sprintf (items[3], "Texture Filter: %s", config.filtering ? " ON" : "OFF");
if (config.ntsc == 1) sprintf (items[4], "NTSC Filter: COMPOSITE"); if (config.ntsc == 1) sprintf (items[4], "NTSC Filter: COMPOSITE");
else if (config.ntsc == 2) sprintf (items[4], "NTSC Filter: S-VIDEO"); else if (config.ntsc == 2) sprintf (items[4], "NTSC Filter: S-VIDEO");
@ -334,8 +336,8 @@ void dispmenu ()
sprintf (items[5], "Borders: %s", config.overscan ? " ON" : "OFF"); sprintf (items[5], "Borders: %s", config.overscan ? " ON" : "OFF");
sprintf (items[6], "Center X: %s%02d", config.xshift < 0 ? "-":"+", abs(config.xshift)); sprintf (items[6], "Center X: %s%02d", config.xshift < 0 ? "-":"+", abs(config.xshift));
sprintf (items[7], "Center Y: %s%02d", config.yshift < 0 ? "-":"+", abs(config.yshift)); sprintf (items[7], "Center Y: %s%02d", config.yshift < 0 ? "-":"+", abs(config.yshift));
sprintf (items[8], "Scale X: %s%02d", config.xscale < 0 ? "-":"+", abs(config.xscale)); sprintf (items[8], "Scale X: %02d", xscale*2);
sprintf (items[9], "Scale Y: %s%02d", config.yscale < 0 ? "-":"+", abs(config.yscale)); sprintf (items[9], "Scale Y: %02d", yscale*2);
ret = domenu (&items[0], count, 1); ret = domenu (&items[0], count, 1);
@ -373,13 +375,16 @@ void dispmenu ()
case 3: /*** texture filtering ***/ case 3: /*** texture filtering ***/
config.filtering ^= 1; config.filtering ^= 1;
bitmap.viewport.changed = 1;
break; break;
case 4: /*** NTSC filter ***/ case 4: /*** NTSC filter ***/
config.ntsc ++; config.ntsc ++;
if (config.ntsc > 3) config.ntsc = 0; if (config.ntsc > 3) config.ntsc = 0;
bitmap.viewport.changed = 1;
break; break;
case 5: /*** overscan emulation ***/
case 5: /*** overscan emulation ***/
config.overscan ^= 1; config.overscan ^= 1;
bitmap.viewport.x = config.overscan ? ((reg[12] & 1) ? 16 : 12) : 0; bitmap.viewport.x = config.overscan ? ((reg[12] & 1) ? 16 : 12) : 0;
bitmap.viewport.y = config.overscan ? (((reg[1] & 8) ? 0 : 8) + (vdp_pal ? 24 : 0)) : 0; bitmap.viewport.y = config.overscan ? (((reg[1] & 8) ? 0 : 8) + (vdp_pal ? 24 : 0)) : 0;

View File

@ -33,7 +33,7 @@ sms_ntsc_t sms_ntsc;
/*** PAL 50hz flag ***/ /*** PAL 50hz flag ***/
uint8 gc_pal = 0; int gc_pal = 0;
/*** VI ***/ /*** VI ***/
unsigned int *xfb[2]; /*** Double buffered ***/ unsigned int *xfb[2]; /*** Double buffered ***/
@ -307,7 +307,7 @@ static void draw_init(void)
/* Clear all Vertex params */ /* Clear all Vertex params */
GX_ClearVtxDesc (); GX_ClearVtxDesc ();
/* Set Position Params (set quad aspect ratio) */ /* Set Position Params (quad aspect ratio) */
GX_SetVtxAttrFmt (GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_S16, 0); GX_SetVtxAttrFmt (GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_S16, 0);
GX_SetVtxDesc (GX_VA_POS, GX_INDEX8); GX_SetVtxDesc (GX_VA_POS, GX_INDEX8);
GX_SetArray (GX_VA_POS, square, 3 * sizeof (s16)); GX_SetArray (GX_VA_POS, square, 3 * sizeof (s16));
@ -320,10 +320,12 @@ static void draw_init(void)
GX_SetNumTexGens (1); GX_SetNumTexGens (1);
GX_SetNumChans(0); GX_SetNumChans(0);
/** Set Modelview **/ /* Set Modelview */
memset (&view, 0, sizeof (Mtx)); memset (&view, 0, sizeof (Mtx));
guLookAt(view, &cam.pos, &cam.up, &cam.view); guLookAt(view, &cam.pos, &cam.up, &cam.view);
GX_LoadPosMtxImm (view, GX_PNMTX0); GX_LoadPosMtxImm (view, GX_PNMTX0);
GX_InvVtxCache ();
} }
/* vertex rendering */ /* vertex rendering */
@ -387,9 +389,10 @@ static void gxStart(void)
} }
/* set GX scaler */ /* set GX scaler */
static void gxScale(void) int xscale, yscale;
void ogc_video__scale(void)
{ {
int xscale, yscale, xshift, yshift, i; int scale, xshift, yshift, i;
/* borders are emulated */ /* borders are emulated */
if (config.overscan) if (config.overscan)
@ -439,18 +442,18 @@ static void gxScale(void)
xshift += config.xshift; xshift += config.xshift;
yshift += config.yshift; yshift += config.yshift;
/* check horizontal upscaling */ /* horizontal scaling */
if (xscale > 320) scale = (xscale > 360) ? 360 : xscale;
if (scale > 320)
{ {
/* let VI do horizontal scaling */ /* let VI do horizontal scaling */
uint32 scale = (xscale <= 360) ? xscale : 360;
for (i=0; i<6; i++) for (i=0; i<6; i++)
{ {
tvmodes[i]->viXOrigin = (720 - (scale * 2)) / 2; tvmodes[i]->viXOrigin = (720 - (scale * 2)) / 2;
tvmodes[i]->viWidth = scale * 2; tvmodes[i]->viWidth = scale * 2;
} }
xscale -= (scale - 320); scale = 320;
} }
else else
{ {
@ -462,23 +465,16 @@ static void gxScale(void)
} }
} }
/* double resolution */ square[6] = square[3] = scale + xshift;
if (config.render) square[0] = square[9] = -scale + xshift;
{
yscale *= 2;
yshift *= 2;
}
/* update matrix */ /* vertical scaling */
square[6] = square[3] = xscale + xshift; scale = yscale;
square[0] = square[9] = -xscale + xshift; square[4] = square[1] = (scale + yshift) * (config.render ? 2:1);
square[4] = square[1] = yscale + yshift; square[7] = square[10] = (yshift - scale) * (config.render ? 2:1);
square[7] = square[10] = -yscale + yshift;
/* update position matrix */
draw_init(); draw_init();
/* vertex array have been modified */
GX_InvVtxCache ();
} }
/* Reinitialize GX */ /* Reinitialize GX */
@ -487,14 +483,14 @@ void ogc_video__reset()
GXRModeObj *rmode; GXRModeObj *rmode;
Mtx p; Mtx p;
/* reinitialize GC/Wii PAL mode */ /* reset TV type (50Hz/60Hz) */
if ((config.tv_mode == 1) || ((config.tv_mode == 2) && vdp_pal)) gc_pal = 1; if ((config.tv_mode == 1) || ((config.tv_mode == 2) && vdp_pal)) gc_pal = 1;
else gc_pal = 0; else gc_pal = 0;
/* reset scaler */ /* reset scaler (aspect ratio) */
gxScale(); ogc_video__scale();
/* reinitialize current TV mode */ /* reset TV mode */
if (config.render == 2) if (config.render == 2)
{ {
tvmodes[2]->viTVMode = VI_TVMODE_NTSC_PROG; tvmodes[2]->viTVMode = VI_TVMODE_NTSC_PROG;
@ -505,11 +501,9 @@ void ogc_video__reset()
tvmodes[2]->viTVMode = tvmodes[0]->viTVMode & ~3; tvmodes[2]->viTVMode = tvmodes[0]->viTVMode & ~3;
tvmodes[2]->xfbMode = VI_XFBMODE_DF; tvmodes[2]->xfbMode = VI_XFBMODE_DF;
} }
if (config.render) rmode = tvmodes[gc_pal*3 + 2];
if (config.render) rmode = tvmodes[gc_pal*3 + 2];
else rmode = tvmodes[gc_pal*3 + interlaced]; else rmode = tvmodes[gc_pal*3 + interlaced];
VIDEO_Configure (rmode); VIDEO_Configure (rmode);
VIDEO_ClearFrameBuffer(rmode, xfb[whichfb], COLOR_BLACK); VIDEO_ClearFrameBuffer(rmode, xfb[whichfb], COLOR_BLACK);
VIDEO_Flush(); VIDEO_Flush();
@ -531,7 +525,7 @@ void ogc_video__reset()
guOrtho(p, rmode->efbHeight/2, -(rmode->efbHeight/2), -(rmode->fbWidth/2), rmode->fbWidth/2, 100, 1000); guOrtho(p, rmode->efbHeight/2, -(rmode->efbHeight/2), -(rmode->fbWidth/2), rmode->fbWidth/2, 100, 1000);
GX_LoadProjectionMtx (p, GX_ORTHOGRAPHIC); GX_LoadProjectionMtx (p, GX_ORTHOGRAPHIC);
/* init NTSC filter */ /* reset NTSC filter */
if (config.ntsc == 1) if (config.ntsc == 1)
{ {
sms_setup = sms_ntsc_composite; sms_setup = sms_ntsc_composite;
@ -546,7 +540,7 @@ void ogc_video__reset()
sms_ntsc_init( &sms_ntsc, &sms_setup ); sms_ntsc_init( &sms_ntsc, &sms_setup );
md_ntsc_init( &md_ntsc, &md_setup ); md_ntsc_init( &md_ntsc, &md_setup );
} }
if (config.ntsc == 1) else if (config.ntsc == 3)
{ {
sms_setup = sms_ntsc_rgb; sms_setup = sms_ntsc_rgb;
md_setup = md_ntsc_rgb; md_setup = md_ntsc_rgb;
@ -592,11 +586,15 @@ void ogc_video__update()
if (config.render && (interlaced || config.ntsc)) vheight *= 2; if (config.render && (interlaced || config.ntsc)) vheight *= 2;
if (config.ntsc) vwidth = (reg[12]&1) ? MD_NTSC_OUT_WIDTH(vwidth) : SMS_NTSC_OUT_WIDTH(vwidth); if (config.ntsc) vwidth = (reg[12]&1) ? MD_NTSC_OUT_WIDTH(vwidth) : SMS_NTSC_OUT_WIDTH(vwidth);
/* texels size must be multiple of 4 */
vwidth = (vwidth / 4) * 4;
vheight = (vheight / 4) * 4;
/* final offset */ /* final offset */
stride = bitmap.width - (vwidth >> 2); stride = bitmap.width - (vwidth >> 2);
/* reset GX scaler */ /* reset GX scaler */
gxScale(); ogc_video__scale();
/* reinitialize texture */ /* reinitialize texture */
GX_InvalidateTexAll (); GX_InvalidateTexAll ();
@ -670,7 +668,7 @@ void ogc_video__init(void)
} }
/* Get the current video mode then : /* Get the current video mode then :
- set menu video mode (fullscreen, 480i or 576i) - set menu video mode (480p, 480i or 576i)
- set emulator rendering TV modes (PAL/MPAL/NTSC/EURGB60) - set emulator rendering TV modes (PAL/MPAL/NTSC/EURGB60)
*/ */
vmode = VIDEO_GetPreferredMode(NULL); vmode = VIDEO_GetPreferredMode(NULL);

View File

@ -24,10 +24,11 @@
extern void ogc_video__init(void); extern void ogc_video__init(void);
extern void ogc_video__update(void); extern void ogc_video__update(void);
extern void ogc_video__reset(void); extern void ogc_video__reset(void);
extern void ogc_video__scale(void);
extern u8 gc_pal; extern int gc_pal;
extern unsigned int *xfb[2]; extern unsigned int *xfb[2];
extern int whichfb; extern int whichfb, xscale, yscale;
extern GXRModeObj *tvmodes[6]; extern GXRModeObj *tvmodes[6];
extern GXRModeObj *vmode; extern GXRModeObj *vmode;

View File

@ -22,7 +22,6 @@
****************************************************************************************/ ****************************************************************************************/
#include "shared.h" #include "shared.h"
#include "md_ntsc.h" #include "md_ntsc.h"
#include "sms_ntsc.h" #include "sms_ntsc.h"