From e4fa287e665e5c673403b771b7cf22ea53d23ee3 Mon Sep 17 00:00:00 2001 From: Souryo Date: Sat, 16 Jan 2016 12:29:17 -0500 Subject: [PATCH] Vista: Fixed a couple of issues that came up while testing on windows vista --- Core/IRenderingDevice.h | 1 + Core/VideoDecoder.cpp | 8 +++++--- GUI.NET/Config/PreferenceInfo.cs | 3 ++- Windows/Renderer.cpp | 23 ++++++++++++++--------- Windows/Renderer.h | 1 + 5 files changed, 23 insertions(+), 13 deletions(-) diff --git a/Core/IRenderingDevice.h b/Core/IRenderingDevice.h index ff71519e..f68fcb29 100644 --- a/Core/IRenderingDevice.h +++ b/Core/IRenderingDevice.h @@ -7,4 +7,5 @@ class IRenderingDevice public: virtual void UpdateFrame(void *frameBuffer, uint32_t width, uint32_t height) = 0; virtual void Render() = 0; + virtual void Reset() = 0; }; \ No newline at end of file diff --git a/Core/VideoDecoder.cpp b/Core/VideoDecoder.cpp index 72cc2ba4..06707d96 100644 --- a/Core/VideoDecoder.cpp +++ b/Core/VideoDecoder.cpp @@ -133,14 +133,15 @@ void VideoDecoder::UpdateFrame(void *ppuOutputBuffer, HdPpuPixelInfo *hdPixelInf void VideoDecoder::StartThread() { - if(!Instance->_decodeThread) { + if(!_decodeThread) { _stopFlag = false; _frameChanged = false; _frameCount = 0; _waitForFrame.Reset(); _waitForRender.Reset(); - Instance->_decodeThread.reset(new thread(&VideoDecoder::DecodeThread, Instance.get())); - Instance->_renderThread.reset(new thread(&VideoDecoder::RenderThread, Instance.get())); + + _decodeThread.reset(new thread(&VideoDecoder::DecodeThread, this)); + _renderThread.reset(new thread(&VideoDecoder::RenderThread, this)); } } @@ -168,6 +169,7 @@ void VideoDecoder::StopThread() void VideoDecoder::RenderThread() { + _renderer->Reset(); while(!_stopFlag.load()) { //Wait until a frame is ready, or until 16ms have passed (to allow UI to run at a minimum of 60fps) _waitForRender.Wait(16); diff --git a/GUI.NET/Config/PreferenceInfo.cs b/GUI.NET/Config/PreferenceInfo.cs index dff8f764..c173a406 100644 --- a/GUI.NET/Config/PreferenceInfo.cs +++ b/GUI.NET/Config/PreferenceInfo.cs @@ -34,7 +34,8 @@ namespace Mesen.GUI.Config Registry.SetValue(@"HKEY_CURRENT_USER\Software\Classes\.nes", null, "Mesen"); } else { //Unregister Mesen if Mesen was registered for .nes files - if(Registry.GetValue(@"HKEY_CURRENT_USER\Software\Classes\.nes", null, "").Equals("Mesen")) { + object regKey = Registry.GetValue(@"HKEY_CURRENT_USER\Software\Classes\.nes", null, ""); + if(regKey != null && regKey.Equals("Mesen")) { Registry.SetValue(@"HKEY_CURRENT_USER\Software\Classes\.nes", null, ""); } } diff --git a/Windows/Renderer.cpp b/Windows/Renderer.cpp index c26c27c3..bbd2834d 100644 --- a/Windows/Renderer.cpp +++ b/Windows/Renderer.cpp @@ -14,7 +14,7 @@ using namespace DirectX; -namespace NES +namespace NES { Renderer::Renderer(HWND hWnd) { @@ -36,7 +36,7 @@ namespace NES { uint32_t scale = EmulationSettings::GetVideoScale(); - if(_screenHeight != height*scale || _screenWidth != width*scale) { + if(_screenHeight != height*scale || _screenWidth != width*scale) { _nesFrameHeight = height; _nesFrameWidth = width; _newFrameBufferSize = width*height; @@ -44,16 +44,21 @@ namespace NES _screenHeight = height * scale; _screenWidth = width * scale; _screenBufferSize = _screenHeight*_screenWidth; - - _frameLock.Acquire(); - CleanupDevice(); - if(FAILED(InitDevice())) { - CleanupDevice(); - } - _frameLock.Release(); + + Reset(); } } + void Renderer::Reset() + { + _frameLock.Acquire(); + CleanupDevice(); + if(FAILED(InitDevice())) { + CleanupDevice(); + } + _frameLock.Release(); + } + void Renderer::CleanupDevice() { if(_pTexture) _pTexture->Release(); diff --git a/Windows/Renderer.h b/Windows/Renderer.h index 0a59c0c5..0bd5ee28 100644 --- a/Windows/Renderer.h +++ b/Windows/Renderer.h @@ -82,6 +82,7 @@ namespace NES { Renderer(HWND hWnd); ~Renderer(); + void Reset(); void Render(); void DisplayMessage(string title, string message); void DisplayToast(shared_ptr toast);