Introducing RSX debugger entry (main debugger)

This commit is contained in:
Eladash 2021-01-15 20:28:45 +02:00 committed by Ivan
parent 62cb532460
commit dbecf0fa50
14 changed files with 1685 additions and 1220 deletions

View file

@ -10,6 +10,7 @@
#include "Capture/rsx_capture.h"
#include "rsx_methods.h"
#include "rsx_utils.h"
#include "gcm_printing.h"
#include "Emu/Cell/lv2/sys_event.h"
#include "Emu/Cell/Modules/cellGcmSys.h"
#include "Overlays/overlay_perf_metrics.h"
@ -469,7 +470,7 @@ namespace rsx
if (capture_current_frame)
{
u32 element_count = rsx::method_registers.current_draw_clause.get_elements_count();
capture_frame("Draw " + rsx::to_string(rsx::method_registers.current_draw_clause.primitive) + std::to_string(element_count));
capture_frame(fmt::format("Draw %s %d", rsx::method_registers.current_draw_clause.primitive, element_count));
}
}
@ -524,8 +525,6 @@ namespace rsx
g_fxo->get<rsx::dma_manager>()->init();
on_init_thread();
method_registers.init();
if (!zcull_ctrl)
{
//Backend did not provide an implementation, provide NULL object
@ -2018,11 +2017,13 @@ namespace rsx
void thread::init(u32 ctrlAddress)
{
method_registers.init();
dma_address = ctrlAddress;
ctrl = vm::_ptr<RsxDmaControl>(ctrlAddress);
flip_status = CELL_GCM_DISPLAY_FLIP_STATUS_DONE;
memset(display_buffers, 0, sizeof(display_buffers));
std::memset(display_buffers, 0, sizeof(display_buffers));
on_init_rsx();
m_rsx_thread_exiting = false;
@ -2565,6 +2566,18 @@ namespace rsx
recovered_fifo_cmds_history.push({fifo_ctrl->last_cmd(), current_time});
}
std::vector<std::pair<u32, u32>> thread::dump_callstack() const
{
std::vector<std::pair<u32, u32>> result;
if (u32 addr = fifo_ret_addr; addr != RSX_CALL_STACK_EMPTY)
{
result.emplace_back(addr, 0);
}
return result;
}
void thread::fifo_wake_delay(u64 div)
{
// TODO: Nanoseconds accuracy
@ -2626,6 +2639,48 @@ namespace rsx
return fifo_ctrl->last_cmd();
}
void invalid_method(thread*, u32, u32);
std::string thread::dump_regs() const
{
std::string result;
for (u32 i = 0; i < 1 << 14; i++)
{
if (rsx::methods[i] == &invalid_method)
{
continue;
}
switch (i)
{
case NV4097_NO_OPERATION:
case NV4097_INVALIDATE_L2:
case NV4097_INVALIDATE_VERTEX_FILE:
case NV4097_INVALIDATE_VERTEX_CACHE_FILE:
case NV4097_INVALIDATE_ZCULL:
case NV4097_WAIT_FOR_IDLE:
case NV4097_PM_TRIGGER:
case NV4097_ZCULL_SYNC:
continue;
default:
{
if (i >= NV308A_COLOR && i < NV3089_SET_OBJECT)
{
continue;
}
break;
}
}
fmt::append(result, "[%04x] %s\n", i, ensure(rsx::get_pretty_printing_function(i))(i, method_registers.registers[i]));
}
return result;
}
flags32_t thread::read_barrier(u32 memory_address, u32 memory_range, bool unconditional)
{
flags32_t zcull_flags = (unconditional)? reports::sync_none : reports::sync_defer_copy;