psx - add clip to framebuffer option

This commit is contained in:
zeromus 2015-08-02 11:35:19 -05:00
parent 0205762409
commit 8fc5acfdcd
10 changed files with 204 additions and 47 deletions

View File

@ -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;
}
}

View File

@ -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();
}

View File

@ -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>

View File

@ -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()
{

View File

@ -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.

View File

@ -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;
}

View File

@ -315,6 +315,7 @@ class PS_GPU
//
int32 hmc_to_visible;
bool hide_hoverscan;
bool dump_framebuffer;
bool sl_zero_reached;
//

View File

@ -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;

View File

@ -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