psx - add clip to framebuffer option
This commit is contained in:
parent
0205762409
commit
8fc5acfdcd
|
@ -33,6 +33,7 @@
|
|||
this.btnCancel = new System.Windows.Forms.Button();
|
||||
this.btnOk = new System.Windows.Forms.Button();
|
||||
this.groupBox1 = new System.Windows.Forms.GroupBox();
|
||||
this.linkLabel1 = new System.Windows.Forms.LinkLabel();
|
||||
this.lblTweakedMednafen = new System.Windows.Forms.Label();
|
||||
this.rbTweakedMednafenMode = new System.Windows.Forms.RadioButton();
|
||||
this.label3 = new System.Windows.Forms.Label();
|
||||
|
@ -48,19 +49,23 @@
|
|||
this.PAL_FirstLineNumeric = new System.Windows.Forms.NumericUpDown();
|
||||
this.lblNTSC = new System.Windows.Forms.Label();
|
||||
this.btnAreaFull = new System.Windows.Forms.Button();
|
||||
this.checkClipHorizontal = new System.Windows.Forms.CheckBox();
|
||||
this.label4 = new System.Windows.Forms.Label();
|
||||
this.label1 = new System.Windows.Forms.Label();
|
||||
this.NTSC_LastLineNumeric = new System.Windows.Forms.NumericUpDown();
|
||||
this.NTSC_FirstLineNumeric = new System.Windows.Forms.NumericUpDown();
|
||||
this.linkLabel1 = new System.Windows.Forms.LinkLabel();
|
||||
this.toolTip1 = new System.Windows.Forms.ToolTip(this.components);
|
||||
this.groupBox3 = new System.Windows.Forms.GroupBox();
|
||||
this.rbClipBasic = new System.Windows.Forms.RadioButton();
|
||||
this.rbClipToFramebuffer = new System.Windows.Forms.RadioButton();
|
||||
this.rbClipNone = new System.Windows.Forms.RadioButton();
|
||||
this.label2 = new System.Windows.Forms.Label();
|
||||
this.groupBox1.SuspendLayout();
|
||||
this.groupBox2.SuspendLayout();
|
||||
((System.ComponentModel.ISupportInitialize)(this.PAL_LastLineNumeric)).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.PAL_FirstLineNumeric)).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.NTSC_LastLineNumeric)).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.NTSC_FirstLineNumeric)).BeginInit();
|
||||
this.groupBox3.SuspendLayout();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// btnCancel
|
||||
|
@ -104,9 +109,20 @@
|
|||
this.groupBox1.TabStop = false;
|
||||
this.groupBox1.Text = "Resolution Management";
|
||||
//
|
||||
// linkLabel1
|
||||
//
|
||||
this.linkLabel1.AutoSize = true;
|
||||
this.linkLabel1.Location = new System.Drawing.Point(327, 248);
|
||||
this.linkLabel1.Name = "linkLabel1";
|
||||
this.linkLabel1.Size = new System.Drawing.Size(53, 13);
|
||||
this.linkLabel1.TabIndex = 29;
|
||||
this.linkLabel1.TabStop = true;
|
||||
this.linkLabel1.Text = "About Me";
|
||||
this.linkLabel1.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabel1_LinkClicked);
|
||||
//
|
||||
// lblTweakedMednafen
|
||||
//
|
||||
this.lblTweakedMednafen.Location = new System.Drawing.Point(255, 132);
|
||||
this.lblTweakedMednafen.Location = new System.Drawing.Point(249, 134);
|
||||
this.lblTweakedMednafen.Name = "lblTweakedMednafen";
|
||||
this.lblTweakedMednafen.Size = new System.Drawing.Size(213, 93);
|
||||
this.lblTweakedMednafen.TabIndex = 28;
|
||||
|
@ -115,7 +131,7 @@
|
|||
// rbTweakedMednafenMode
|
||||
//
|
||||
this.rbTweakedMednafenMode.AutoSize = true;
|
||||
this.rbTweakedMednafenMode.Location = new System.Drawing.Point(246, 116);
|
||||
this.rbTweakedMednafenMode.Location = new System.Drawing.Point(246, 118);
|
||||
this.rbTweakedMednafenMode.Name = "rbTweakedMednafenMode";
|
||||
this.rbTweakedMednafenMode.Size = new System.Drawing.Size(193, 17);
|
||||
this.rbTweakedMednafenMode.TabIndex = 27;
|
||||
|
@ -125,13 +141,13 @@
|
|||
//
|
||||
// label3
|
||||
//
|
||||
this.label3.Location = new System.Drawing.Point(246, 39);
|
||||
this.label3.Location = new System.Drawing.Point(249, 35);
|
||||
this.label3.Name = "label3";
|
||||
this.label3.Size = new System.Drawing.Size(213, 82);
|
||||
this.label3.TabIndex = 26;
|
||||
this.label3.Text = "Displays all content unmodified\r\n • Window size will constantly change\r\n • Aspect" +
|
||||
" ratio is usually wrong\r\n • Recommended for hacking\r\n • Ideal for segmented AV d" +
|
||||
"umping\r\n";
|
||||
"umping\r\n • Ideal for screen shots\r\n\r\n";
|
||||
//
|
||||
// rbDebugMode
|
||||
//
|
||||
|
@ -157,7 +173,7 @@
|
|||
//
|
||||
// lblMednafen
|
||||
//
|
||||
this.lblMednafen.Location = new System.Drawing.Point(6, 132);
|
||||
this.lblMednafen.Location = new System.Drawing.Point(6, 134);
|
||||
this.lblMednafen.Name = "lblMednafen";
|
||||
this.lblMednafen.Size = new System.Drawing.Size(213, 93);
|
||||
this.lblMednafen.TabIndex = 23;
|
||||
|
@ -166,7 +182,7 @@
|
|||
// rbMednafenMode
|
||||
//
|
||||
this.rbMednafenMode.AutoSize = true;
|
||||
this.rbMednafenMode.Location = new System.Drawing.Point(6, 116);
|
||||
this.rbMednafenMode.Location = new System.Drawing.Point(6, 118);
|
||||
this.rbMednafenMode.Name = "rbMednafenMode";
|
||||
this.rbMednafenMode.Size = new System.Drawing.Size(145, 17);
|
||||
this.rbMednafenMode.TabIndex = 22;
|
||||
|
@ -197,19 +213,19 @@
|
|||
//
|
||||
this.groupBox2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
|
||||
| System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.groupBox2.Controls.Add(this.groupBox3);
|
||||
this.groupBox2.Controls.Add(this.lblPAL);
|
||||
this.groupBox2.Controls.Add(this.PAL_LastLineNumeric);
|
||||
this.groupBox2.Controls.Add(this.PAL_FirstLineNumeric);
|
||||
this.groupBox2.Controls.Add(this.lblNTSC);
|
||||
this.groupBox2.Controls.Add(this.btnAreaFull);
|
||||
this.groupBox2.Controls.Add(this.checkClipHorizontal);
|
||||
this.groupBox2.Controls.Add(this.label4);
|
||||
this.groupBox2.Controls.Add(this.label1);
|
||||
this.groupBox2.Controls.Add(this.NTSC_LastLineNumeric);
|
||||
this.groupBox2.Controls.Add(this.NTSC_FirstLineNumeric);
|
||||
this.groupBox2.Location = new System.Drawing.Point(492, 7);
|
||||
this.groupBox2.Name = "groupBox2";
|
||||
this.groupBox2.Size = new System.Drawing.Size(212, 160);
|
||||
this.groupBox2.Size = new System.Drawing.Size(212, 245);
|
||||
this.groupBox2.TabIndex = 31;
|
||||
this.groupBox2.TabStop = false;
|
||||
this.groupBox2.Text = "Drawing Area";
|
||||
|
@ -273,18 +289,6 @@
|
|||
this.btnAreaFull.UseVisualStyleBackColor = true;
|
||||
this.btnAreaFull.Click += new System.EventHandler(this.btnAreaFull_Click);
|
||||
//
|
||||
// checkClipHorizontal
|
||||
//
|
||||
this.checkClipHorizontal.AutoSize = true;
|
||||
this.checkClipHorizontal.Location = new System.Drawing.Point(7, 127);
|
||||
this.checkClipHorizontal.Name = "checkClipHorizontal";
|
||||
this.checkClipHorizontal.Size = new System.Drawing.Size(142, 17);
|
||||
this.checkClipHorizontal.TabIndex = 30;
|
||||
this.checkClipHorizontal.Text = "Clip Horizontal Overscan";
|
||||
this.toolTip1.SetToolTip(this.checkClipHorizontal, "A mednafen option -- appears to be 5.5% horizontally");
|
||||
this.checkClipHorizontal.UseVisualStyleBackColor = true;
|
||||
this.checkClipHorizontal.CheckedChanged += new System.EventHandler(this.checkClipHorizontal_CheckedChanged);
|
||||
//
|
||||
// label4
|
||||
//
|
||||
this.label4.AutoSize = true;
|
||||
|
@ -334,16 +338,67 @@
|
|||
this.NTSC_FirstLineNumeric.TabIndex = 21;
|
||||
this.NTSC_FirstLineNumeric.ValueChanged += new System.EventHandler(this.DrawingArea_ValueChanged);
|
||||
//
|
||||
// linkLabel1
|
||||
// groupBox3
|
||||
//
|
||||
this.linkLabel1.AutoSize = true;
|
||||
this.linkLabel1.Location = new System.Drawing.Point(327, 248);
|
||||
this.linkLabel1.Name = "linkLabel1";
|
||||
this.linkLabel1.Size = new System.Drawing.Size(53, 13);
|
||||
this.linkLabel1.TabIndex = 29;
|
||||
this.linkLabel1.TabStop = true;
|
||||
this.linkLabel1.Text = "About Me";
|
||||
this.linkLabel1.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabel1_LinkClicked);
|
||||
this.groupBox3.Controls.Add(this.label2);
|
||||
this.groupBox3.Controls.Add(this.rbClipNone);
|
||||
this.groupBox3.Controls.Add(this.rbClipToFramebuffer);
|
||||
this.groupBox3.Controls.Add(this.rbClipBasic);
|
||||
this.groupBox3.Location = new System.Drawing.Point(7, 132);
|
||||
this.groupBox3.Name = "groupBox3";
|
||||
this.groupBox3.Size = new System.Drawing.Size(197, 106);
|
||||
this.groupBox3.TabIndex = 46;
|
||||
this.groupBox3.TabStop = false;
|
||||
this.groupBox3.Text = "Horizontal Overscan Clipping";
|
||||
//
|
||||
// rbClipBasic
|
||||
//
|
||||
this.rbClipBasic.AutoSize = true;
|
||||
this.rbClipBasic.Location = new System.Drawing.Point(6, 42);
|
||||
this.rbClipBasic.Name = "rbClipBasic";
|
||||
this.rbClipBasic.Size = new System.Drawing.Size(91, 17);
|
||||
this.rbClipBasic.TabIndex = 46;
|
||||
this.rbClipBasic.TabStop = true;
|
||||
this.rbClipBasic.Text = "Basic Clipping";
|
||||
this.toolTip1.SetToolTip(this.rbClipBasic, "A mednafen option -- appears to be 5.5% horizontally");
|
||||
this.rbClipBasic.UseVisualStyleBackColor = true;
|
||||
this.rbClipBasic.CheckedChanged += new System.EventHandler(this.rbClipHorizontal_CheckedChanged);
|
||||
//
|
||||
// rbClipToFramebuffer
|
||||
//
|
||||
this.rbClipToFramebuffer.AutoSize = true;
|
||||
this.rbClipToFramebuffer.Location = new System.Drawing.Point(6, 65);
|
||||
this.rbClipToFramebuffer.Name = "rbClipToFramebuffer";
|
||||
this.rbClipToFramebuffer.Size = new System.Drawing.Size(117, 17);
|
||||
this.rbClipToFramebuffer.TabIndex = 47;
|
||||
this.rbClipToFramebuffer.TabStop = true;
|
||||
this.rbClipToFramebuffer.Text = "Clip To Framebuffer";
|
||||
this.toolTip1.SetToolTip(this.rbClipToFramebuffer, "Subverts mednafen\'s internal video display field emulation to show only the game\'" +
|
||||
"s framebuffer.");
|
||||
this.rbClipToFramebuffer.UseVisualStyleBackColor = true;
|
||||
this.rbClipToFramebuffer.CheckedChanged += new System.EventHandler(this.rbClipToFramebuffer_CheckedChanged);
|
||||
//
|
||||
// rbClipNone
|
||||
//
|
||||
this.rbClipNone.AutoSize = true;
|
||||
this.rbClipNone.Location = new System.Drawing.Point(6, 19);
|
||||
this.rbClipNone.Name = "rbClipNone";
|
||||
this.rbClipNone.Size = new System.Drawing.Size(51, 17);
|
||||
this.rbClipNone.TabIndex = 48;
|
||||
this.rbClipNone.TabStop = true;
|
||||
this.rbClipNone.Text = "None";
|
||||
this.toolTip1.SetToolTip(this.rbClipNone, resources.GetString("rbClipNone.ToolTip"));
|
||||
this.rbClipNone.UseVisualStyleBackColor = true;
|
||||
this.rbClipNone.CheckedChanged += new System.EventHandler(this.rbClipNone_CheckedChanged);
|
||||
//
|
||||
// label2
|
||||
//
|
||||
this.label2.AutoSize = true;
|
||||
this.label2.Location = new System.Drawing.Point(29, 83);
|
||||
this.label2.Name = "label2";
|
||||
this.label2.Size = new System.Drawing.Size(79, 13);
|
||||
this.label2.TabIndex = 49;
|
||||
this.label2.Text = "(and break AR)";
|
||||
//
|
||||
// PSXOptions
|
||||
//
|
||||
|
@ -369,6 +424,8 @@
|
|||
((System.ComponentModel.ISupportInitialize)(this.PAL_FirstLineNumeric)).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.NTSC_LastLineNumeric)).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.NTSC_FirstLineNumeric)).EndInit();
|
||||
this.groupBox3.ResumeLayout(false);
|
||||
this.groupBox3.PerformLayout();
|
||||
this.ResumeLayout(false);
|
||||
|
||||
}
|
||||
|
@ -393,12 +450,16 @@
|
|||
private System.Windows.Forms.NumericUpDown PAL_FirstLineNumeric;
|
||||
private System.Windows.Forms.Label lblNTSC;
|
||||
private System.Windows.Forms.Button btnAreaFull;
|
||||
private System.Windows.Forms.CheckBox checkClipHorizontal;
|
||||
private System.Windows.Forms.Label label4;
|
||||
private System.Windows.Forms.Label label1;
|
||||
private System.Windows.Forms.NumericUpDown NTSC_LastLineNumeric;
|
||||
private System.Windows.Forms.NumericUpDown NTSC_FirstLineNumeric;
|
||||
private System.Windows.Forms.LinkLabel linkLabel1;
|
||||
private System.Windows.Forms.ToolTip toolTip1;
|
||||
private System.Windows.Forms.GroupBox groupBox3;
|
||||
private System.Windows.Forms.RadioButton rbClipNone;
|
||||
private System.Windows.Forms.RadioButton rbClipToFramebuffer;
|
||||
private System.Windows.Forms.RadioButton rbClipBasic;
|
||||
private System.Windows.Forms.Label label2;
|
||||
}
|
||||
}
|
|
@ -36,7 +36,9 @@ namespace BizHawk.Client.EmuHawk
|
|||
rbDebugMode.Checked = _settings.ResolutionMode == Octoshock.eResolutionMode.Debug;
|
||||
rbMednafenMode.Checked = _settings.ResolutionMode == Octoshock.eResolutionMode.Mednafen;
|
||||
rbTweakedMednafenMode.Checked = _settings.ResolutionMode == Octoshock.eResolutionMode.TweakedMednafen;
|
||||
checkClipHorizontal.Checked = _settings.ClipHorizontalOverscan;
|
||||
rbClipNone.Checked = _settings.HorizontalClipping == Octoshock.eHorizontalClipping.None;
|
||||
rbClipBasic.Checked = _settings.HorizontalClipping == Octoshock.eHorizontalClipping.Basic;
|
||||
rbClipToFramebuffer.Checked = _settings.HorizontalClipping == Octoshock.eHorizontalClipping.Framebuffer;
|
||||
|
||||
NTSC_FirstLineNumeric.Value = _settings.ScanlineStart_NTSC;
|
||||
NTSC_LastLineNumeric.Value = _settings.ScanlineEnd_NTSC;
|
||||
|
@ -75,7 +77,9 @@ namespace BizHawk.Client.EmuHawk
|
|||
if (rbMednafenMode.Checked) settings.ResolutionMode = Octoshock.eResolutionMode.Mednafen;
|
||||
if (rbTweakedMednafenMode.Checked) settings.ResolutionMode = Octoshock.eResolutionMode.TweakedMednafen;
|
||||
|
||||
settings.ClipHorizontalOverscan = checkClipHorizontal.Checked;
|
||||
if (rbClipNone.Checked) settings.HorizontalClipping = Octoshock.eHorizontalClipping.None;
|
||||
if (rbClipBasic.Checked) settings.HorizontalClipping = Octoshock.eHorizontalClipping.Basic;
|
||||
if (rbClipToFramebuffer.Checked) settings.HorizontalClipping = Octoshock.eHorizontalClipping.Framebuffer;
|
||||
|
||||
settings.ScanlineStart_NTSC = (int)NTSC_FirstLineNumeric.Value;
|
||||
settings.ScanlineEnd_NTSC = (int)NTSC_LastLineNumeric.Value;
|
||||
|
@ -138,7 +142,18 @@ namespace BizHawk.Client.EmuHawk
|
|||
SyncLabels();
|
||||
}
|
||||
|
||||
private void checkClipHorizontal_CheckedChanged(object sender, EventArgs e)
|
||||
|
||||
private void rbClipHorizontal_CheckedChanged(object sender, EventArgs e)
|
||||
{
|
||||
SyncLabels();
|
||||
}
|
||||
|
||||
private void rbClipToFramebuffer_CheckedChanged(object sender, EventArgs e)
|
||||
{
|
||||
SyncLabels();
|
||||
}
|
||||
|
||||
private void rbClipNone_CheckedChanged(object sender, EventArgs e)
|
||||
{
|
||||
SyncLabels();
|
||||
}
|
||||
|
|
|
@ -146,4 +146,9 @@ fit gracefully in a 800x480 window.
|
|||
<metadata name="toolTip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>17, 17</value>
|
||||
</metadata>
|
||||
<data name="rbClipNone.ToolTip" xml:space="preserve">
|
||||
<value>Mednafen adds quite a bit overscan to closely emulate minor quirks of the psx's display output.
|
||||
Using this option may result in objectionable levels of black bars, but will fix some rare quirks in games.
|
||||
</value>
|
||||
</data>
|
||||
</root>
|
|
@ -485,7 +485,11 @@ namespace BizHawk.Emulation.Cores.Sony.PSX
|
|||
/// </summary>
|
||||
public static System.Drawing.Size CalculateResolution(OctoshockDll.eVidStandard standard, Settings settings, int w, int h)
|
||||
{
|
||||
int virtual_width = settings.ClipHorizontalOverscan ? 768 : 800;
|
||||
//some of this logic is duplicated in the c++ side, be sure to check there
|
||||
|
||||
int virtual_width = 800;
|
||||
if (settings.HorizontalClipping == eHorizontalClipping.Basic) virtual_width = 768;
|
||||
if (settings.HorizontalClipping == eHorizontalClipping.Framebuffer) virtual_width = 736;
|
||||
|
||||
int scanline_start = standard == OctoshockDll.eVidStandard.NTSC ? settings.ScanlineStart_NTSC : settings.ScanlineStart_PAL;
|
||||
int scanline_end = standard == OctoshockDll.eVidStandard.NTSC ? settings.ScanlineEnd_NTSC : settings.ScanlineEnd_PAL;
|
||||
|
@ -500,7 +504,12 @@ namespace BizHawk.Emulation.Cores.Sony.PSX
|
|||
VirtualHeight = h;
|
||||
break;
|
||||
case eResolutionMode.Mednafen:
|
||||
VirtualWidth = settings.ClipHorizontalOverscan ? 302 : 320;
|
||||
VirtualWidth = 320;
|
||||
if (settings.HorizontalClipping == eHorizontalClipping.Basic)
|
||||
VirtualWidth = 302;
|
||||
//? not sure what this should be
|
||||
if (settings.HorizontalClipping == eHorizontalClipping.Framebuffer)
|
||||
VirtualWidth = 320;
|
||||
VirtualHeight = scanline_num;
|
||||
break;
|
||||
case eResolutionMode.PixelPro:
|
||||
|
@ -508,7 +517,11 @@ namespace BizHawk.Emulation.Cores.Sony.PSX
|
|||
VirtualHeight = scanline_num * 2;
|
||||
break;
|
||||
case eResolutionMode.TweakedMednafen:
|
||||
VirtualWidth = settings.ClipHorizontalOverscan ? 378 : 400;
|
||||
VirtualWidth = 400;
|
||||
if (settings.HorizontalClipping == eHorizontalClipping.Basic)
|
||||
VirtualWidth = 378;
|
||||
if (settings.HorizontalClipping == eHorizontalClipping.Framebuffer)
|
||||
VirtualWidth = 400;
|
||||
VirtualHeight = (int)(scanline_num * 300.0f / real_scanline_num);
|
||||
break;
|
||||
}
|
||||
|
@ -592,6 +605,7 @@ namespace BizHawk.Emulation.Cores.Sony.PSX
|
|||
|
||||
//clear drive light. itll get set to light up by sector-reading callbacks
|
||||
//TODO - debounce this by a frame or so perhaps?
|
||||
//TODO - actually, make this feedback from the core. there should be a register or status which effectively corresponds to whether it's reading.
|
||||
DriveLightOn = false;
|
||||
|
||||
Frame++;
|
||||
|
@ -602,8 +616,12 @@ namespace BizHawk.Emulation.Cores.Sony.PSX
|
|||
{
|
||||
scanline_start = SystemVidStandard == OctoshockDll.eVidStandard.NTSC ? _Settings.ScanlineStart_NTSC : _Settings.ScanlineStart_PAL,
|
||||
scanline_end = SystemVidStandard == OctoshockDll.eVidStandard.NTSC ? _Settings.ScanlineEnd_NTSC : _Settings.ScanlineEnd_PAL,
|
||||
clipOverscan = _Settings.ClipHorizontalOverscan
|
||||
};
|
||||
if (_Settings.HorizontalClipping == eHorizontalClipping.Basic)
|
||||
ropts.renderType = OctoshockDll.eShockRenderType.ClipOverscan;
|
||||
if (_Settings.HorizontalClipping == eHorizontalClipping.Framebuffer)
|
||||
ropts.renderType = OctoshockDll.eShockRenderType.Framebuffer;
|
||||
|
||||
OctoshockDll.shock_SetRenderOptions(psx, ref ropts);
|
||||
|
||||
//prep tracer
|
||||
|
@ -992,6 +1010,13 @@ namespace BizHawk.Emulation.Cores.Sony.PSX
|
|||
}
|
||||
}
|
||||
|
||||
public enum eHorizontalClipping
|
||||
{
|
||||
None,
|
||||
Basic,
|
||||
Framebuffer
|
||||
}
|
||||
|
||||
public class Settings
|
||||
{
|
||||
[DisplayName("Resolution Mode")]
|
||||
|
@ -999,6 +1024,10 @@ namespace BizHawk.Emulation.Cores.Sony.PSX
|
|||
[DefaultValue(eResolutionMode.PixelPro)]
|
||||
public eResolutionMode ResolutionMode { get; set; }
|
||||
|
||||
[DisplayName("Horizontal Clipping")]
|
||||
[DefaultValue(eHorizontalClipping.None)]
|
||||
public eHorizontalClipping HorizontalClipping { get; set; }
|
||||
|
||||
[DisplayName("ScanlineStart_NTSC")]
|
||||
[DefaultValue(0)]
|
||||
public int ScanlineStart_NTSC { get; set; }
|
||||
|
@ -1015,9 +1044,6 @@ namespace BizHawk.Emulation.Cores.Sony.PSX
|
|||
[DefaultValue(287)]
|
||||
public int ScanlineEnd_PAL { get; set; }
|
||||
|
||||
[DisplayName("Clip Horizontal Overscan")]
|
||||
[DefaultValue(false)]
|
||||
public bool ClipHorizontalOverscan { get; set; }
|
||||
|
||||
public void Validate()
|
||||
{
|
||||
|
|
|
@ -77,6 +77,18 @@ namespace BizHawk.Emulation.Cores.Sony.PSX
|
|||
Multitap = 10,
|
||||
};
|
||||
|
||||
/// <summary>
|
||||
/// this is implemented as an overall render type instead of a horizontal clip control
|
||||
/// in case the Framebuffer render type ever develops any differences in its Y-handling.
|
||||
/// At that time, we might need to change the GUI to separate the vertical and horizontal components, or something like that
|
||||
/// </summary>
|
||||
public enum eShockRenderType : int
|
||||
{
|
||||
Normal,
|
||||
ClipOverscan,
|
||||
Framebuffer
|
||||
};
|
||||
|
||||
public const int SHOCK_OK = 0;
|
||||
public const int SHOCK_FALSE = 0;
|
||||
public const int SHOCK_TRUE = 1;
|
||||
|
@ -121,7 +133,8 @@ namespace BizHawk.Emulation.Cores.Sony.PSX
|
|||
public struct ShockRenderOptions
|
||||
{
|
||||
public int scanline_start, scanline_end;
|
||||
public bool clipOverscan;
|
||||
public eShockRenderType renderType;
|
||||
public bool skip;
|
||||
};
|
||||
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
|
|
Binary file not shown.
|
@ -1432,6 +1432,16 @@ pscpu_timestamp_t PS_GPU::Update(const pscpu_timestamp_t sys_timestamp)
|
|||
|
||||
LineWidths[dest_line] = dmw - dmpa * 2;
|
||||
|
||||
//adjustments for people who really just want to see the PSX framebuffer
|
||||
//effectively fixes the xstart registers to be nominal values.
|
||||
//it's unclear what happens to games displaying a peculiar Y range
|
||||
if (dump_framebuffer)
|
||||
{
|
||||
dx_start = 0;
|
||||
dx_end = 2560 / DotClockRatios[dmc];
|
||||
LineWidths[dest_line] = dx_end - dx_start;
|
||||
}
|
||||
|
||||
{
|
||||
const uint16 *src = GPURAM[DisplayFB_CurLineYReadout];
|
||||
const uint32 black = surface->MakeColor(0, 0, 0);
|
||||
|
@ -1634,7 +1644,8 @@ SYNCFUNC(PS_GPU)
|
|||
|
||||
void PS_GPU::SetRenderOptions(::ShockRenderOptions* opts)
|
||||
{
|
||||
hide_hoverscan = !!opts->clipOverscan;
|
||||
hide_hoverscan = opts->renderType == eShockRenderType_ClipOverscan;
|
||||
dump_framebuffer = opts->renderType == eShockRenderType_Framebuffer;
|
||||
LineVisFirst = opts->scanline_start;
|
||||
LineVisLast = opts->scanline_end;
|
||||
}
|
||||
|
|
|
@ -315,6 +315,7 @@ class PS_GPU
|
|||
//
|
||||
int32 hmc_to_visible;
|
||||
bool hide_hoverscan;
|
||||
bool dump_framebuffer;
|
||||
|
||||
bool sl_zero_reached;
|
||||
//
|
||||
|
|
|
@ -1373,6 +1373,9 @@ EW_EXPORT s32 shock_Step(void* psx, eShockStep step)
|
|||
espec.SoundBufSize = 0;
|
||||
espec.SoundVolume = 1.0;
|
||||
|
||||
//not sure about this
|
||||
espec.skip = s_ShockConfig.opts.skip;
|
||||
|
||||
//-------------------------
|
||||
|
||||
FIO->UpdateInput();
|
||||
|
@ -1443,7 +1446,7 @@ void NormalizeFramebuffer()
|
|||
//mednafen's advised solution for smooth gaming: "scale the output width to z * nominal_width, and the output height to z * nominal_height, where nominal_width and nominal_height are members of the MDFNGI struct"
|
||||
//IOW, mednafen's strategy is to put everything in a 320x240 and scale it up 3x to 960x720 by default (which is adequate to contain the largest PSX framebuffer of 700x480)
|
||||
|
||||
//psxtech says horizontal resolutions can be: 256, 320, 368, 512, 640 pixels
|
||||
//psxtech says horizontal resolutions can be: 256, 320, 512, 640, 368 pixels
|
||||
//mednafen will turn those into 2800/{ 10, 8, 5, 4, 7 } -> 280,350,560,700,400
|
||||
//additionally with the crop options we can cut it down by 160/X -> { 16, 20, 32, 40, 22 } -> { 264, 330, 528, 660, 378 }
|
||||
//this means our virtual area for doubling is no longer 800 but 756
|
||||
|
@ -1468,7 +1471,16 @@ void NormalizeFramebuffer()
|
|||
|
||||
int width = VTLineWidths[0][0]; //presently, except for contrived test programs, it is safe to assume this is the same for the entire frame (no known use by games)
|
||||
int height = espec.DisplayRect.h;
|
||||
int virtual_width = s_ShockConfig.opts.clipOverscan ? 756 : 800;
|
||||
int virtual_width = 800;
|
||||
|
||||
if (s_ShockConfig.opts.renderType == eShockRenderType_ClipOverscan)
|
||||
virtual_width = 756;
|
||||
if (s_ShockConfig.opts.renderType == eShockRenderType_Framebuffer)
|
||||
{
|
||||
//not quite sure what to here yet
|
||||
//virtual_width = width * 2; ?
|
||||
virtual_width = 736;
|
||||
}
|
||||
|
||||
int xs=1,ys=1,xm=0;
|
||||
|
||||
|
|
|
@ -134,6 +134,18 @@ enum eShockFramebufferFlags
|
|||
eShockFramebufferFlags_Normalize = 1
|
||||
};
|
||||
|
||||
enum eShockRenderType
|
||||
{
|
||||
eShockRenderType_Normal,
|
||||
eShockRenderType_ClipOverscan,
|
||||
|
||||
//this should discard peculiar X adjustments during scan-out (done)
|
||||
//as well as peculiar Y adjustments (not done)
|
||||
//it's unclear whether the latter will actually ever be needed..
|
||||
//are any earthquake effects shaking the whole screen?
|
||||
eShockRenderType_Framebuffer
|
||||
};
|
||||
|
||||
enum eMemType
|
||||
{
|
||||
eMemType_MainRAM = 0, //2048K
|
||||
|
@ -275,7 +287,8 @@ struct ShockFramebufferInfo
|
|||
struct ShockRenderOptions
|
||||
{
|
||||
s32 scanline_start, scanline_end;
|
||||
bool clipOverscan;
|
||||
eShockRenderType renderType;
|
||||
bool skip;
|
||||
};
|
||||
|
||||
struct ShockMemcardTransaction
|
||||
|
|
Loading…
Reference in New Issue