HD Pack Builder: Fixed issues with pause icon/break functionality when recording hd packs with debugger opened
This commit is contained in:
parent
35b182b435
commit
5f01ec59f4
6 changed files with 57 additions and 13 deletions
|
@ -45,6 +45,7 @@
|
||||||
#include "DebugHud.h"
|
#include "DebugHud.h"
|
||||||
#include "NotificationManager.h"
|
#include "NotificationManager.h"
|
||||||
#include "HistoryViewer.h"
|
#include "HistoryViewer.h"
|
||||||
|
#include "ConsolePauseHelper.h"
|
||||||
|
|
||||||
Console::Console(shared_ptr<Console> master, EmulationSettings* initialSettings)
|
Console::Console(shared_ptr<Console> master, EmulationSettings* initialSettings)
|
||||||
{
|
{
|
||||||
|
@ -1129,7 +1130,8 @@ void Console::LoadHdPack(VirtualFile &romFile, VirtualFile &patchFile)
|
||||||
|
|
||||||
void Console::StartRecordingHdPack(string saveFolder, ScaleFilterType filterType, uint32_t scale, uint32_t flags, uint32_t chrRamBankSize)
|
void Console::StartRecordingHdPack(string saveFolder, ScaleFilterType filterType, uint32_t scale, uint32_t flags, uint32_t chrRamBankSize)
|
||||||
{
|
{
|
||||||
Pause();
|
ConsolePauseHelper helper(this);
|
||||||
|
|
||||||
std::stringstream saveState;
|
std::stringstream saveState;
|
||||||
SaveState(saveState);
|
SaveState(saveState);
|
||||||
|
|
||||||
|
@ -1147,13 +1149,15 @@ void Console::StartRecordingHdPack(string saveFolder, ScaleFilterType filterType
|
||||||
}
|
}
|
||||||
|
|
||||||
LoadState(saveState);
|
LoadState(saveState);
|
||||||
Resume();
|
|
||||||
|
_soundMixer->StopAudio();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Console::StopRecordingHdPack()
|
void Console::StopRecordingHdPack()
|
||||||
{
|
{
|
||||||
if(_hdPackBuilder) {
|
if(_hdPackBuilder) {
|
||||||
Pause();
|
ConsolePauseHelper helper(this);
|
||||||
|
|
||||||
std::stringstream saveState;
|
std::stringstream saveState;
|
||||||
SaveState(saveState);
|
SaveState(saveState);
|
||||||
|
|
||||||
|
@ -1173,7 +1177,8 @@ void Console::StopRecordingHdPack()
|
||||||
}
|
}
|
||||||
|
|
||||||
LoadState(saveState);
|
LoadState(saveState);
|
||||||
Resume();
|
|
||||||
|
_soundMixer->StopAudio();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
33
Core/ConsolePauseHelper.h
Normal file
33
Core/ConsolePauseHelper.h
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
#pragma once
|
||||||
|
#include "stdafx.h"
|
||||||
|
#include "DebugBreakHelper.h"
|
||||||
|
#include "Console.h"
|
||||||
|
|
||||||
|
class ConsolePauseHelper
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
unique_ptr<DebugBreakHelper> _breakHelper;
|
||||||
|
shared_ptr<Debugger> _debugger;
|
||||||
|
Console* _console;
|
||||||
|
|
||||||
|
public:
|
||||||
|
ConsolePauseHelper(Console* console)
|
||||||
|
{
|
||||||
|
_console = console;
|
||||||
|
_debugger = console->GetDebugger(false);
|
||||||
|
if(_debugger) {
|
||||||
|
//Pause using the debugger (on the next instruction), when possible
|
||||||
|
_breakHelper.reset(new DebugBreakHelper(_debugger.get()));
|
||||||
|
} else {
|
||||||
|
//If the debugger isn't active, pause at the end of the next frame
|
||||||
|
console->Pause();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
~ConsolePauseHelper()
|
||||||
|
{
|
||||||
|
if(!_debugger) {
|
||||||
|
_console->Resume();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
|
@ -528,6 +528,7 @@
|
||||||
<ClInclude Include="BmcHpxx.h" />
|
<ClInclude Include="BmcHpxx.h" />
|
||||||
<ClInclude Include="BmcK3046.h" />
|
<ClInclude Include="BmcK3046.h" />
|
||||||
<ClInclude Include="CityFighter.h" />
|
<ClInclude Include="CityFighter.h" />
|
||||||
|
<ClInclude Include="ConsolePauseHelper.h" />
|
||||||
<ClInclude Include="ControlDeviceState.h" />
|
<ClInclude Include="ControlDeviceState.h" />
|
||||||
<ClInclude Include="Dance2000.h" />
|
<ClInclude Include="Dance2000.h" />
|
||||||
<ClInclude Include="DragonFighter.h" />
|
<ClInclude Include="DragonFighter.h" />
|
||||||
|
|
|
@ -1468,6 +1468,9 @@
|
||||||
<ClInclude Include="StereoCombFilter.h">
|
<ClInclude Include="StereoCombFilter.h">
|
||||||
<Filter>Nes\APU\Filters</Filter>
|
<Filter>Nes\APU\Filters</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="ConsolePauseHelper.h">
|
||||||
|
<Filter>Misc</Filter>
|
||||||
|
</ClInclude>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="stdafx.cpp">
|
<ClCompile Include="stdafx.cpp">
|
||||||
|
|
|
@ -703,11 +703,15 @@ bool Debugger::SleepUntilResume(BreakSource source)
|
||||||
source = BreakSource::BreakAfterSuspend;
|
source = BreakSource::BreakAfterSuspend;
|
||||||
}
|
}
|
||||||
|
|
||||||
if((stepCount == 0 || _breakRequested) && !_stopFlag && _suspendCount == 0) {
|
//Read both values here since they might change while executing the code below
|
||||||
|
int32_t preventResume = _preventResume;
|
||||||
|
bool breakRequested = _breakRequested;
|
||||||
|
|
||||||
|
if((stepCount == 0 || breakRequested) && !_stopFlag && _suspendCount == 0) {
|
||||||
//Break
|
//Break
|
||||||
auto lock = _breakLock.AcquireSafe();
|
auto lock = _breakLock.AcquireSafe();
|
||||||
|
|
||||||
if(_preventResume == 0) {
|
if(preventResume == 0) {
|
||||||
_console->GetSoundMixer()->StopAudio();
|
_console->GetSoundMixer()->StopAudio();
|
||||||
_console->GetNotificationManager()->SendNotification(ConsoleNotificationType::CodeBreak, (void*)(uint64_t)source);
|
_console->GetNotificationManager()->SendNotification(ConsoleNotificationType::CodeBreak, (void*)(uint64_t)source);
|
||||||
ProcessEvent(EventType::CodeBreak);
|
ProcessEvent(EventType::CodeBreak);
|
||||||
|
@ -718,7 +722,7 @@ bool Debugger::SleepUntilResume(BreakSource source)
|
||||||
}
|
}
|
||||||
|
|
||||||
_executionStopped = true;
|
_executionStopped = true;
|
||||||
_pausedForDebugHelper = _breakRequested;
|
_pausedForDebugHelper = breakRequested;
|
||||||
while(((stepCount == 0 || _breakRequested) && !_stopFlag && _suspendCount == 0) || _preventResume > 0) {
|
while(((stepCount == 0 || _breakRequested) && !_stopFlag && _suspendCount == 0) || _preventResume > 0) {
|
||||||
std::this_thread::sleep_for(std::chrono::duration<int, std::milli>(10));
|
std::this_thread::sleep_for(std::chrono::duration<int, std::milli>(10));
|
||||||
if(stepCount == 0) {
|
if(stepCount == 0) {
|
||||||
|
@ -1039,7 +1043,7 @@ bool Debugger::IsExecutionStopped()
|
||||||
|
|
||||||
bool Debugger::IsPauseIconShown()
|
bool Debugger::IsPauseIconShown()
|
||||||
{
|
{
|
||||||
return IsExecutionStopped() && !CheckFlag(DebuggerFlags::HidePauseIcon) && _preventResume == 0 && !_pausedForDebugHelper;
|
return (_executionStopped || _console->IsPaused()) && !CheckFlag(DebuggerFlags::HidePauseIcon) && _preventResume == 0 && !_pausedForDebugHelper;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Debugger::PreventResume()
|
void Debugger::PreventResume()
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
#include "HdPackBuilder.h"
|
#include "HdPackBuilder.h"
|
||||||
#include "HdNesPack.h"
|
#include "HdNesPack.h"
|
||||||
#include "Console.h"
|
#include "Console.h"
|
||||||
|
#include "ConsolePauseHelper.h"
|
||||||
|
|
||||||
HdPackBuilder* HdPackBuilder::_instance = nullptr;
|
HdPackBuilder* HdPackBuilder::_instance = nullptr;
|
||||||
|
|
||||||
|
@ -350,18 +351,17 @@ void HdPackBuilder::SaveHdPack()
|
||||||
|
|
||||||
void HdPackBuilder::GetChrBankList(uint32_t *banks)
|
void HdPackBuilder::GetChrBankList(uint32_t *banks)
|
||||||
{
|
{
|
||||||
_instance->_console->Pause();
|
ConsolePauseHelper helper(_instance->_console.get());
|
||||||
for(std::pair<const uint32_t, std::map<uint32_t, vector<HdPackTileInfo*>>> &kvp : _instance->_tilesByChrBankByPalette) {
|
for(std::pair<const uint32_t, std::map<uint32_t, vector<HdPackTileInfo*>>> &kvp : _instance->_tilesByChrBankByPalette) {
|
||||||
*banks = kvp.first;
|
*banks = kvp.first;
|
||||||
banks++;
|
banks++;
|
||||||
}
|
}
|
||||||
*banks = -1;
|
*banks = -1;
|
||||||
_instance->_console->Resume();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void HdPackBuilder::GetBankPreview(uint32_t bankNumber, uint32_t pageNumber, uint32_t *rgbBuffer)
|
void HdPackBuilder::GetBankPreview(uint32_t bankNumber, uint32_t pageNumber, uint32_t *rgbBuffer)
|
||||||
{
|
{
|
||||||
_instance->_console->Pause();
|
ConsolePauseHelper helper(_instance->_console.get());
|
||||||
|
|
||||||
for(uint32_t i = 0; i < 128 * 128 * _instance->_hdData.Scale*_instance->_hdData.Scale; i++) {
|
for(uint32_t i = 0; i < 128 * 128 * _instance->_hdData.Scale*_instance->_hdData.Scale; i++) {
|
||||||
rgbBuffer[i] = 0xFF666666;
|
rgbBuffer[i] = 0xFF666666;
|
||||||
|
@ -410,6 +410,4 @@ void HdPackBuilder::GetBankPreview(uint32_t bankNumber, uint32_t pageNumber, uin
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_instance->_console->Resume();
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue