improve gdi+ rendering mode (depending on your point of view) to run almost as fast as direct3d and put gui option for it
This commit is contained in:
parent
ad6c2d0faf
commit
1917f7fc2e
|
@ -50,6 +50,7 @@
|
||||||
public bool DisplayInput = false;
|
public bool DisplayInput = false;
|
||||||
public int DispInpx = 0;
|
public int DispInpx = 0;
|
||||||
public int DispInpy = 24;
|
public int DispInpy = 24;
|
||||||
|
public bool ForceGDI = false;
|
||||||
|
|
||||||
// Sound options
|
// Sound options
|
||||||
public bool SoundEnabled = true;
|
public bool SoundEnabled = true;
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -16,7 +16,7 @@ namespace BizHawk.MultiClient
|
||||||
{
|
{
|
||||||
partial class MainForm
|
partial class MainForm
|
||||||
{
|
{
|
||||||
private void rAMPokeToolStripMenuItem_Click(object sender, EventArgs e)
|
private void RAMPokeToolStripMenuItem_Click(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
RamPoke r = new RamPoke();
|
RamPoke r = new RamPoke();
|
||||||
r.Show();
|
r.Show();
|
||||||
|
@ -383,6 +383,48 @@ namespace BizHawk.MultiClient
|
||||||
LoadRom(file.FullName);
|
LoadRom(file.FullName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void replayInputLogToolStripMenuItem_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
InputLog.StopMovie();
|
||||||
|
InputLog.StartPlayback();
|
||||||
|
LoadRom(CurrentlyOpenRom);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void PPUViewerToolStripMenuItem_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
LoadNESPPU();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void enableRewindToolStripMenuItem_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
Global.Config.RewindEnabled ^= true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void hexEditorToolStripMenuItem_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
LoadHexEditor();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void MainForm_Shown(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
HandlePlatformMenus();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void gameGenieCodesToolStripMenuItem_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
LoadGameGenieEC();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void cheatsToolStripMenuItem_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
LoadCheatsWindow();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void forceGDIPPresentationToolStripMenuItem_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
Global.Config.ForceGDI ^= true;
|
||||||
|
SyncPresentationMode();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -52,6 +52,8 @@ namespace BizHawk.MultiClient
|
||||||
|
|
||||||
public MainForm(string[] args)
|
public MainForm(string[] args)
|
||||||
{
|
{
|
||||||
|
InitializeComponent();
|
||||||
|
|
||||||
//in order to allow late construction of this database, we hook up a delegate here to dearchive the data and provide it on demand
|
//in order to allow late construction of this database, we hook up a delegate here to dearchive the data and provide it on demand
|
||||||
//we could background thread this later instead if we wanted to be real clever
|
//we could background thread this later instead if we wanted to be real clever
|
||||||
NES.BootGodDB.GetDatabaseBytes = () => {
|
NES.BootGodDB.GetDatabaseBytes = () => {
|
||||||
|
@ -60,28 +62,10 @@ namespace BizHawk.MultiClient
|
||||||
};
|
};
|
||||||
|
|
||||||
Global.MainForm = this;
|
Global.MainForm = this;
|
||||||
Global.Config = ConfigService.Load<Config>("config.ini");
|
|
||||||
|
|
||||||
if (Global.Direct3D != null)
|
|
||||||
renderTarget = new ViewportPanel();
|
|
||||||
else renderTarget = retainedPanel = new RetainedViewportPanel();
|
|
||||||
|
|
||||||
renderTarget.Dock = DockStyle.Fill;
|
|
||||||
renderTarget.BackColor = Color.Black;
|
|
||||||
Controls.Add(renderTarget);
|
|
||||||
|
|
||||||
InitializeComponent();
|
|
||||||
|
|
||||||
Database.LoadDatabase("gamedb.txt");
|
Database.LoadDatabase("gamedb.txt");
|
||||||
|
|
||||||
if (Global.Direct3D != null)
|
SyncPresentationMode();
|
||||||
{
|
|
||||||
Global.RenderPanel = new Direct3DRenderPanel(Global.Direct3D, renderTarget);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Global.RenderPanel = new SysdrawingRenderPanel(retainedPanel);
|
|
||||||
}
|
|
||||||
|
|
||||||
Load += (o, e) =>
|
Load += (o, e) =>
|
||||||
{
|
{
|
||||||
|
@ -160,6 +144,44 @@ namespace BizHawk.MultiClient
|
||||||
PauseEmulator();
|
PauseEmulator();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SyncPresentationMode()
|
||||||
|
{
|
||||||
|
bool gdi = Global.Config.ForceGDI;
|
||||||
|
if (Global.Direct3D == null)
|
||||||
|
{
|
||||||
|
gdi = Global.Config.ForceGDI = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (renderTarget != null)
|
||||||
|
{
|
||||||
|
renderTarget.Dispose();
|
||||||
|
Controls.Remove(renderTarget);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (retainedPanel != null) retainedPanel.Dispose();
|
||||||
|
if (Global.RenderPanel != null) Global.RenderPanel.Dispose();
|
||||||
|
|
||||||
|
if (gdi)
|
||||||
|
renderTarget = retainedPanel = new RetainedViewportPanel();
|
||||||
|
else renderTarget = new ViewportPanel();
|
||||||
|
Controls.Add(renderTarget);
|
||||||
|
Controls.SetChildIndex(renderTarget, 0);
|
||||||
|
|
||||||
|
renderTarget.Dock = DockStyle.Fill;
|
||||||
|
renderTarget.BackColor = Color.Black;
|
||||||
|
|
||||||
|
if (gdi)
|
||||||
|
{
|
||||||
|
Global.RenderPanel = new SysdrawingRenderPanel(retainedPanel);
|
||||||
|
retainedPanel.ActivateThreaded();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Global.RenderPanel = new Direct3DRenderPanel(Global.Direct3D, renderTarget);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void SetSpeedPercent(int value)
|
void SetSpeedPercent(int value)
|
||||||
{
|
{
|
||||||
Global.Config.SpeedPercent = value;
|
Global.Config.SpeedPercent = value;
|
||||||
|
@ -503,7 +525,7 @@ namespace BizHawk.MultiClient
|
||||||
Global.Game.Name = (Global.Emulator as NES).GameName;
|
Global.Game.Name = (Global.Emulator as NES).GameName;
|
||||||
}
|
}
|
||||||
|
|
||||||
Text = DisplayNameForSystem(game.System) + " - " + game.Name;
|
Text = DisplayNameForSystem(game.System) + " - " + game.Name + " \\";
|
||||||
ResetRewindBuffer();
|
ResetRewindBuffer();
|
||||||
Global.Config.RecentRoms.Add(file.CanonicalName);
|
Global.Config.RecentRoms.Add(file.CanonicalName);
|
||||||
if (File.Exists(game.SaveRamPath))
|
if (File.Exists(game.SaveRamPath))
|
||||||
|
@ -731,6 +753,8 @@ namespace BizHawk.MultiClient
|
||||||
{
|
{
|
||||||
runloop_second = DateTime.Now;
|
runloop_second = DateTime.Now;
|
||||||
Global.RenderPanel.FPS = runloop_fps;
|
Global.RenderPanel.FPS = runloop_fps;
|
||||||
|
Text = Text.Substring(0, Text.IndexOf('\\')) + "\\ " + runloop_fps + " fps";
|
||||||
|
Global.RenderPanel.FPS = runloop_fps;
|
||||||
runloop_fps = 0;
|
runloop_fps = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1179,6 +1203,7 @@ namespace BizHawk.MultiClient
|
||||||
saveWindowPositionToolStripMenuItem.Checked = Global.Config.SaveWindowPosition;
|
saveWindowPositionToolStripMenuItem.Checked = Global.Config.SaveWindowPosition;
|
||||||
startPausedToolStripMenuItem.Checked = Global.Config.StartPaused;
|
startPausedToolStripMenuItem.Checked = Global.Config.StartPaused;
|
||||||
enableRewindToolStripMenuItem.Checked = Global.Config.RewindEnabled;
|
enableRewindToolStripMenuItem.Checked = Global.Config.RewindEnabled;
|
||||||
|
forceGDIPPresentationToolStripMenuItem.Checked = Global.Config.ForceGDI;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void MainForm_Load(object sender, EventArgs e)
|
private void MainForm_Load(object sender, EventArgs e)
|
||||||
|
@ -1245,41 +1270,6 @@ namespace BizHawk.MultiClient
|
||||||
ConfigService.Save("config.ini", Global.Config);
|
ConfigService.Save("config.ini", Global.Config);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void replayInputLogToolStripMenuItem_Click(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
InputLog.StopMovie();
|
|
||||||
InputLog.StartPlayback();
|
|
||||||
LoadRom(CurrentlyOpenRom);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void pPUViewerToolStripMenuItem_Click(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
LoadNESPPU();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void enableRewindToolStripMenuItem_Click(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
Global.Config.RewindEnabled ^= true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void hexEditorToolStripMenuItem_Click(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
LoadHexEditor();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void MainForm_Shown(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
HandlePlatformMenus();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void gameGenieCodesToolStripMenuItem_Click(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
LoadGameGenieEC();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void cheatsToolStripMenuItem_Click(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
LoadCheatsWindow();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -13,16 +13,20 @@ namespace BizHawk.MultiClient
|
||||||
Application.EnableVisualStyles();
|
Application.EnableVisualStyles();
|
||||||
Application.SetCompatibleTextRenderingDefault(false);
|
Application.SetCompatibleTextRenderingDefault(false);
|
||||||
|
|
||||||
|
Global.Config = ConfigService.Load<Config>("config.ini");
|
||||||
|
|
||||||
try { Global.DSound = new DirectSound(); }
|
try { Global.DSound = new DirectSound(); }
|
||||||
catch {
|
catch {
|
||||||
MessageBox.Show("Couldn't initialize DirectSound!");
|
MessageBox.Show("Couldn't initialize DirectSound!");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
try { Global.Direct3D = new Direct3D(); }
|
try { Global.Direct3D = new Direct3D(); }
|
||||||
catch {
|
catch
|
||||||
//can fallback to GDI rendering
|
{
|
||||||
}
|
//can fallback to GDI rendering
|
||||||
|
Global.Config.ForceGDI = true;
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
var mf = new MainForm(args);
|
var mf = new MainForm(args);
|
||||||
|
|
|
@ -1,4 +1,6 @@
|
||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Threading;
|
||||||
using System.Drawing;
|
using System.Drawing;
|
||||||
using System.Drawing.Imaging;
|
using System.Drawing.Imaging;
|
||||||
using System.Drawing.Drawing2D;
|
using System.Drawing.Drawing2D;
|
||||||
|
@ -11,17 +13,96 @@ namespace BizHawk.Core
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class RetainedViewportPanel : Control
|
public class RetainedViewportPanel : Control
|
||||||
{
|
{
|
||||||
|
Thread threadPaint;
|
||||||
|
EventWaitHandle ewh;
|
||||||
|
volatile bool killSignal;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Turns this panel into multi-threaded mode.
|
||||||
|
/// This will sort of glitch out other gdi things on the system, but at least its fast...
|
||||||
|
/// </summary>
|
||||||
|
public void ActivateThreaded()
|
||||||
|
{
|
||||||
|
ewh = new EventWaitHandle(false, EventResetMode.AutoReset);
|
||||||
|
threadPaint = new Thread(PaintProc);
|
||||||
|
threadPaint.Start();
|
||||||
|
}
|
||||||
|
|
||||||
public RetainedViewportPanel()
|
public RetainedViewportPanel()
|
||||||
{
|
{
|
||||||
CreateHandle();
|
CreateHandle();
|
||||||
|
|
||||||
SetStyle(ControlStyles.AllPaintingInWmPaint, true);
|
SetStyle(ControlStyles.AllPaintingInWmPaint, true);
|
||||||
SetStyle(ControlStyles.UserPaint, true);
|
SetStyle(ControlStyles.UserPaint, true);
|
||||||
SetStyle(ControlStyles.DoubleBuffer, true);
|
SetStyle(ControlStyles.DoubleBuffer, false);
|
||||||
SetStyle(ControlStyles.Opaque, true);
|
SetStyle(ControlStyles.Opaque, true);
|
||||||
SetStyle(ControlStyles.UserMouse, true);
|
SetStyle(ControlStyles.UserMouse, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
protected override void Dispose(bool disposing)
|
||||||
|
{
|
||||||
|
base.Dispose(disposing);
|
||||||
|
if (threadPaint != null)
|
||||||
|
{
|
||||||
|
killSignal = true;
|
||||||
|
ewh.Set();
|
||||||
|
ewh.WaitOne();
|
||||||
|
}
|
||||||
|
CleanupDisposeQueue();
|
||||||
|
}
|
||||||
|
|
||||||
|
void DoPaint()
|
||||||
|
{
|
||||||
|
if (bmp != null)
|
||||||
|
{
|
||||||
|
using (Graphics g = CreateGraphics())
|
||||||
|
{
|
||||||
|
g.PixelOffsetMode = PixelOffsetMode.HighSpeed;
|
||||||
|
g.InterpolationMode = InterpolationMode.NearestNeighbor;
|
||||||
|
g.CompositingMode = CompositingMode.SourceCopy;
|
||||||
|
g.CompositingQuality = CompositingQuality.HighSpeed;
|
||||||
|
g.DrawImage(bmp, 0, 0, Width, Height);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
CleanupDisposeQueue();
|
||||||
|
}
|
||||||
|
|
||||||
|
void PaintProc()
|
||||||
|
{
|
||||||
|
for (; ; )
|
||||||
|
{
|
||||||
|
ewh.WaitOne();
|
||||||
|
if (killSignal)
|
||||||
|
{
|
||||||
|
ewh.Set();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
DoPaint();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CleanupDisposeQueue()
|
||||||
|
{
|
||||||
|
lock (this)
|
||||||
|
{
|
||||||
|
while (DisposeQueue.Count > 0)
|
||||||
|
DisposeQueue.Dequeue().Dispose();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Queue<Bitmap> DisposeQueue = new Queue<Bitmap>();
|
||||||
|
|
||||||
|
void SignalPaint()
|
||||||
|
{
|
||||||
|
if (threadPaint == null)
|
||||||
|
DoPaint();
|
||||||
|
else
|
||||||
|
ewh.Set();
|
||||||
|
}
|
||||||
|
|
||||||
//Size logicalSize;
|
//Size logicalSize;
|
||||||
////int pitch;
|
////int pitch;
|
||||||
//public void SetLogicalSize(int w, int h)
|
//public void SetLogicalSize(int w, int h)
|
||||||
|
@ -36,24 +117,26 @@ namespace BizHawk.Core
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public void SetBitmap(Bitmap newbmp)
|
public void SetBitmap(Bitmap newbmp)
|
||||||
{
|
{
|
||||||
if (bmp != null) bmp.Dispose();
|
lock (this)
|
||||||
bmp = newbmp;
|
{
|
||||||
Refresh();
|
if(bmp != null) DisposeQueue.Enqueue(bmp);
|
||||||
|
bmp = newbmp;
|
||||||
|
}
|
||||||
|
SignalPaint();
|
||||||
}
|
}
|
||||||
|
|
||||||
Bitmap bmp;
|
Bitmap bmp;
|
||||||
|
|
||||||
|
protected override void OnPaintBackground(PaintEventArgs pevent)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
protected override void OnPaint(PaintEventArgs e)
|
protected override void OnPaint(PaintEventArgs e)
|
||||||
{
|
{
|
||||||
|
SignalPaint();
|
||||||
base.OnPaint(e);
|
base.OnPaint(e);
|
||||||
if (bmp != null)
|
|
||||||
{
|
|
||||||
e.Graphics.PixelOffsetMode = PixelOffsetMode.HighSpeed;
|
|
||||||
e.Graphics.InterpolationMode = InterpolationMode.NearestNeighbor;
|
|
||||||
e.Graphics.CompositingMode = CompositingMode.SourceCopy;
|
|
||||||
e.Graphics.CompositingQuality = CompositingQuality.HighSpeed;
|
|
||||||
e.Graphics.DrawImage(bmp, 0, 0, Width, Height);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue