mirror of
https://github.com/RetroDECK/Duckstation.git
synced 2024-11-30 09:35:40 +00:00
DMA: Add debug window
This commit is contained in:
parent
62dbaaf02c
commit
29467d40c8
|
@ -11,6 +11,9 @@
|
||||||
#include "mdec.h"
|
#include "mdec.h"
|
||||||
#include "spu.h"
|
#include "spu.h"
|
||||||
#include "system.h"
|
#include "system.h"
|
||||||
|
#ifdef WITH_IMGUI
|
||||||
|
#include "imgui.h"
|
||||||
|
#endif
|
||||||
Log_SetChannel(DMA);
|
Log_SetChannel(DMA);
|
||||||
|
|
||||||
DMA g_dma;
|
DMA g_dma;
|
||||||
|
@ -551,3 +554,84 @@ TickCount DMA::TransferDeviceToMemory(Channel channel, u32 address, u32 incremen
|
||||||
CPU::CodeCache::InvalidateCodePages(address, word_count);
|
CPU::CodeCache::InvalidateCodePages(address, word_count);
|
||||||
return Bus::GetDMARAMTickCount(word_count);
|
return Bus::GetDMARAMTickCount(word_count);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DMA::DrawDebugStateWindow()
|
||||||
|
{
|
||||||
|
#ifdef WITH_IMGUI
|
||||||
|
static constexpr u32 NUM_COLUMNS = 10;
|
||||||
|
static constexpr std::array<const char*, NUM_COLUMNS> column_names = {
|
||||||
|
{"#", "Req", "Direction", "Chopping", "Mode", "Busy", "Enable", "Priority", "IRQ", "Flag"}};
|
||||||
|
static constexpr std::array<const char*, NUM_CHANNELS> channel_names = {
|
||||||
|
{"MDECin", "MDECout", "GPU", "CDROM", "SPU", "PIO", "OTC"}};
|
||||||
|
static constexpr std::array<const char*, 4> sync_mode_names = {{"Manual", "Request", "LinkedList", "Reserved"}};
|
||||||
|
|
||||||
|
const float framebuffer_scale = ImGui::GetIO().DisplayFramebufferScale.x;
|
||||||
|
|
||||||
|
ImGui::SetNextWindowSize(ImVec2(850.0f * framebuffer_scale, 250.0f * framebuffer_scale), ImGuiCond_FirstUseEver);
|
||||||
|
if (!ImGui::Begin("DMA State", &g_settings.debugging.show_dma_state))
|
||||||
|
{
|
||||||
|
ImGui::End();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ImGui::Columns(NUM_COLUMNS);
|
||||||
|
ImGui::SetColumnWidth(0, 100.0f * framebuffer_scale);
|
||||||
|
ImGui::SetColumnWidth(1, 50.0f * framebuffer_scale);
|
||||||
|
ImGui::SetColumnWidth(2, 100.0f * framebuffer_scale);
|
||||||
|
ImGui::SetColumnWidth(3, 150.0f * framebuffer_scale);
|
||||||
|
ImGui::SetColumnWidth(4, 80.0f * framebuffer_scale);
|
||||||
|
ImGui::SetColumnWidth(5, 80.0f * framebuffer_scale);
|
||||||
|
ImGui::SetColumnWidth(6, 80.0f * framebuffer_scale);
|
||||||
|
ImGui::SetColumnWidth(7, 80.0f * framebuffer_scale);
|
||||||
|
ImGui::SetColumnWidth(8, 80.0f * framebuffer_scale);
|
||||||
|
ImGui::SetColumnWidth(9, 80.0f * framebuffer_scale);
|
||||||
|
|
||||||
|
for (const char* title : column_names)
|
||||||
|
{
|
||||||
|
ImGui::TextUnformatted(title);
|
||||||
|
ImGui::NextColumn();
|
||||||
|
}
|
||||||
|
|
||||||
|
const ImVec4 active(1.0f, 1.0f, 1.0f, 1.0f);
|
||||||
|
const ImVec4 inactive(0.5f, 0.5f, 0.5f, 1.0f);
|
||||||
|
|
||||||
|
for (u32 i = 0; i < NUM_CHANNELS; i++)
|
||||||
|
{
|
||||||
|
const ChannelState& cs = m_state[i];
|
||||||
|
|
||||||
|
ImGui::TextColored(cs.channel_control.enable_busy ? active : inactive, "%u[%s]", i, channel_names[i]);
|
||||||
|
ImGui::NextColumn();
|
||||||
|
ImGui::TextColored(cs.request ? active : inactive, cs.request ? "Yes" : "No");
|
||||||
|
ImGui::NextColumn();
|
||||||
|
ImGui::Text("%s%s", cs.channel_control.copy_to_device ? "FromRAM" : "ToRAM",
|
||||||
|
cs.channel_control.address_step_reverse ? " Addr+" : " Addr-");
|
||||||
|
ImGui::NextColumn();
|
||||||
|
ImGui::TextColored(cs.channel_control.chopping_enable ? active : inactive, "%s/%u/%u",
|
||||||
|
cs.channel_control.chopping_enable ? "Yes" : "No",
|
||||||
|
cs.channel_control.chopping_cpu_window_size.GetValue(),
|
||||||
|
cs.channel_control.chopping_dma_window_size.GetValue());
|
||||||
|
ImGui::NextColumn();
|
||||||
|
ImGui::Text("%s", sync_mode_names[static_cast<u8>(cs.channel_control.sync_mode.GetValue())]);
|
||||||
|
ImGui::NextColumn();
|
||||||
|
ImGui::TextColored(cs.channel_control.enable_busy ? active : inactive, "%s%s",
|
||||||
|
cs.channel_control.enable_busy ? "Busy" : "Idle",
|
||||||
|
cs.channel_control.start_trigger ? " (Trigger)" : "");
|
||||||
|
ImGui::NextColumn();
|
||||||
|
ImGui::TextColored(m_DPCR.GetMasterEnable(static_cast<Channel>(i)) ? active : inactive,
|
||||||
|
m_DPCR.GetMasterEnable(static_cast<Channel>(i)) ? "Enabled" : "Disabled");
|
||||||
|
ImGui::NextColumn();
|
||||||
|
ImGui::TextColored(m_DPCR.GetMasterEnable(static_cast<Channel>(i)) ? active : inactive, "%u",
|
||||||
|
m_DPCR.GetPriority(static_cast<Channel>(i)));
|
||||||
|
ImGui::NextColumn();
|
||||||
|
ImGui::TextColored(m_DICR.IsIRQEnabled(static_cast<Channel>(i)) ? active : inactive,
|
||||||
|
m_DICR.IsIRQEnabled(static_cast<Channel>(i)) ? "Enabled" : "Disabled");
|
||||||
|
ImGui::NextColumn();
|
||||||
|
ImGui::TextColored(m_DICR.GetIRQFlag(static_cast<Channel>(i)) ? active : inactive,
|
||||||
|
m_DICR.GetIRQFlag(static_cast<Channel>(i)) ? "IRQ" : "");
|
||||||
|
ImGui::NextColumn();
|
||||||
|
}
|
||||||
|
|
||||||
|
ImGui::Columns(1);
|
||||||
|
ImGui::End();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
|
@ -45,6 +45,8 @@ public:
|
||||||
void SetMaxSliceTicks(TickCount ticks) { m_max_slice_ticks = ticks; }
|
void SetMaxSliceTicks(TickCount ticks) { m_max_slice_ticks = ticks; }
|
||||||
void SetHaltTicks(TickCount ticks) { m_halt_ticks = ticks; }
|
void SetHaltTicks(TickCount ticks) { m_halt_ticks = ticks; }
|
||||||
|
|
||||||
|
void DrawDebugStateWindow();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static constexpr PhysicalMemoryAddress BASE_ADDRESS_MASK = UINT32_C(0x00FFFFFF);
|
static constexpr PhysicalMemoryAddress BASE_ADDRESS_MASK = UINT32_C(0x00FFFFFF);
|
||||||
static constexpr PhysicalMemoryAddress ADDRESS_MASK = UINT32_C(0x001FFFFC);
|
static constexpr PhysicalMemoryAddress ADDRESS_MASK = UINT32_C(0x001FFFFC);
|
||||||
|
|
|
@ -505,6 +505,7 @@ void HostInterface::SetDefaultSettings(SettingsInterface& si)
|
||||||
si.SetBoolValue("Debug", "ShowSPUState", false);
|
si.SetBoolValue("Debug", "ShowSPUState", false);
|
||||||
si.SetBoolValue("Debug", "ShowTimersState", false);
|
si.SetBoolValue("Debug", "ShowTimersState", false);
|
||||||
si.SetBoolValue("Debug", "ShowMDECState", false);
|
si.SetBoolValue("Debug", "ShowMDECState", false);
|
||||||
|
si.SetBoolValue("Debug", "ShowDMAState", false);
|
||||||
|
|
||||||
si.SetIntValue("Hacks", "DMAMaxSliceTicks", static_cast<int>(Settings::DEFAULT_DMA_MAX_SLICE_TICKS));
|
si.SetIntValue("Hacks", "DMAMaxSliceTicks", static_cast<int>(Settings::DEFAULT_DMA_MAX_SLICE_TICKS));
|
||||||
si.SetIntValue("Hacks", "DMAHaltTicks", static_cast<int>(Settings::DEFAULT_DMA_HALT_TICKS));
|
si.SetIntValue("Hacks", "DMAHaltTicks", static_cast<int>(Settings::DEFAULT_DMA_HALT_TICKS));
|
||||||
|
|
|
@ -236,6 +236,7 @@ void Settings::Load(SettingsInterface& si)
|
||||||
debugging.show_spu_state = si.GetBoolValue("Debug", "ShowSPUState");
|
debugging.show_spu_state = si.GetBoolValue("Debug", "ShowSPUState");
|
||||||
debugging.show_timers_state = si.GetBoolValue("Debug", "ShowTimersState");
|
debugging.show_timers_state = si.GetBoolValue("Debug", "ShowTimersState");
|
||||||
debugging.show_mdec_state = si.GetBoolValue("Debug", "ShowMDECState");
|
debugging.show_mdec_state = si.GetBoolValue("Debug", "ShowMDECState");
|
||||||
|
debugging.show_dma_state = si.GetBoolValue("Debug", "ShowDMAState");
|
||||||
}
|
}
|
||||||
|
|
||||||
void Settings::Save(SettingsInterface& si) const
|
void Settings::Save(SettingsInterface& si) const
|
||||||
|
@ -349,6 +350,7 @@ void Settings::Save(SettingsInterface& si) const
|
||||||
si.SetBoolValue("Debug", "ShowSPUState", debugging.show_spu_state);
|
si.SetBoolValue("Debug", "ShowSPUState", debugging.show_spu_state);
|
||||||
si.SetBoolValue("Debug", "ShowTimersState", debugging.show_timers_state);
|
si.SetBoolValue("Debug", "ShowTimersState", debugging.show_timers_state);
|
||||||
si.SetBoolValue("Debug", "ShowMDECState", debugging.show_mdec_state);
|
si.SetBoolValue("Debug", "ShowMDECState", debugging.show_mdec_state);
|
||||||
|
si.SetBoolValue("Debug", "ShowDMAState", debugging.show_dma_state);
|
||||||
}
|
}
|
||||||
|
|
||||||
static std::array<const char*, LOGLEVEL_COUNT> s_log_level_names = {
|
static std::array<const char*, LOGLEVEL_COUNT> s_log_level_names = {
|
||||||
|
|
|
@ -152,6 +152,7 @@ struct Settings
|
||||||
mutable bool show_spu_state = false;
|
mutable bool show_spu_state = false;
|
||||||
mutable bool show_timers_state = false;
|
mutable bool show_timers_state = false;
|
||||||
mutable bool show_mdec_state = false;
|
mutable bool show_mdec_state = false;
|
||||||
|
mutable bool show_dma_state = false;
|
||||||
} debugging;
|
} debugging;
|
||||||
|
|
||||||
// TODO: Controllers, memory cards, etc.
|
// TODO: Controllers, memory cards, etc.
|
||||||
|
|
|
@ -1073,6 +1073,7 @@ void SDLHostInterface::DrawDebugMenu()
|
||||||
settings_changed |= ImGui::MenuItem("Show SPU State", nullptr, &debug_settings.show_spu_state);
|
settings_changed |= ImGui::MenuItem("Show SPU State", nullptr, &debug_settings.show_spu_state);
|
||||||
settings_changed |= ImGui::MenuItem("Show Timers State", nullptr, &debug_settings.show_timers_state);
|
settings_changed |= ImGui::MenuItem("Show Timers State", nullptr, &debug_settings.show_timers_state);
|
||||||
settings_changed |= ImGui::MenuItem("Show MDEC State", nullptr, &debug_settings.show_mdec_state);
|
settings_changed |= ImGui::MenuItem("Show MDEC State", nullptr, &debug_settings.show_mdec_state);
|
||||||
|
settings_changed |= ImGui::MenuItem("Show DMA State", nullptr, &debug_settings.show_dma_state);
|
||||||
|
|
||||||
if (settings_changed)
|
if (settings_changed)
|
||||||
{
|
{
|
||||||
|
@ -1086,6 +1087,7 @@ void SDLHostInterface::DrawDebugMenu()
|
||||||
debug_settings_copy.show_spu_state = debug_settings.show_spu_state;
|
debug_settings_copy.show_spu_state = debug_settings.show_spu_state;
|
||||||
debug_settings_copy.show_timers_state = debug_settings.show_timers_state;
|
debug_settings_copy.show_timers_state = debug_settings.show_timers_state;
|
||||||
debug_settings_copy.show_mdec_state = debug_settings.show_mdec_state;
|
debug_settings_copy.show_mdec_state = debug_settings.show_mdec_state;
|
||||||
|
debug_settings_copy.show_dma_state = debug_settings.show_dma_state;
|
||||||
RunLater([this]() { SaveAndUpdateSettings(); });
|
RunLater([this]() { SaveAndUpdateSettings(); });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -936,6 +936,8 @@ void CommonHostInterface::DrawDebugWindows()
|
||||||
g_spu.DrawDebugStateWindow();
|
g_spu.DrawDebugStateWindow();
|
||||||
if (g_settings.debugging.show_mdec_state)
|
if (g_settings.debugging.show_mdec_state)
|
||||||
g_mdec.DrawDebugStateWindow();
|
g_mdec.DrawDebugStateWindow();
|
||||||
|
if (g_settings.debugging.show_dma_state)
|
||||||
|
g_dma.DrawDebugStateWindow();
|
||||||
}
|
}
|
||||||
|
|
||||||
void CommonHostInterface::DoFrameStep()
|
void CommonHostInterface::DoFrameStep()
|
||||||
|
|
Loading…
Reference in a new issue