Debugger: Event Viewer - Display current dot for all consoles + refactor code

This commit is contained in:
Sour 2022-04-01 21:02:21 -04:00
parent 367a277870
commit c05e3fb0f5
9 changed files with 98 additions and 129 deletions

View file

@ -79,3 +79,69 @@ void BaseEventManager::ClearFrameEvents()
_prevDebugEvents = _debugEvents;
_debugEvents.clear();
}
void BaseEventManager::GetDisplayBuffer(uint32_t* buffer, uint32_t bufferSize)
{
auto lock = _lock.AcquireSafe();
FrameInfo size = GetDisplayBufferSize();
if(_snapshotScanline < 0 || bufferSize < size.Width * size.Height * sizeof(uint32_t)) {
return;
}
//Clear buffer
for(uint32_t i = 0; i < size.Width * size.Height; i++) {
buffer[i] = 0xFF555555;
}
//Draw output screen
DrawScreen(buffer);
//Draw events, current scanline/dot, etc.
DrawEvents(buffer, size);
}
void BaseEventManager::DrawLine(uint32_t* buffer, FrameInfo size, uint32_t color, uint32_t row)
{
uint32_t offset = row * 2 * size.Width;
for(int i = 0; i < size.Width; i++) {
buffer[offset + i] = color;
buffer[offset + size.Width + i] = color;
}
}
void BaseEventManager::DrawEvent(DebugEventInfo& evt, bool drawBackground, uint32_t* buffer)
{
EventViewerCategoryCfg evtCfg = GetEventConfig(evt);
uint32_t color = evtCfg.Color;
int32_t y = evt.Scanline;
int32_t x = evt.Cycle;
ConvertScanlineCycleToRowColumn(x, y);
DrawDot(x, y, color, drawBackground, buffer);
}
void BaseEventManager::DrawEvents(uint32_t* buffer, FrameInfo size)
{
if(_snapshotScanline != 0 || _snapshotCycle != 0) {
DrawLine(buffer, size, 0xFFFFFF55, _snapshotScanline);
}
FilterEvents();
for(DebugEventInfo& evt : _sentEvents) {
DrawEvent(evt, true, buffer);
}
for(DebugEventInfo& evt : _sentEvents) {
DrawEvent(evt, false, buffer);
}
//Draw dot over current pixel
if(_snapshotScanline != 0 || _snapshotCycle != 0) {
int32_t y = _snapshotScanline + _snapshotScanlineOffset;
int32_t x = _snapshotCycle;
ConvertScanlineCycleToRowColumn(x, y);
DrawDot(x, y, 0xFF990099, true, buffer);
DrawDot(x, y, 0xFFFF00FF, false, buffer);
}
}

View file

@ -46,6 +46,7 @@ protected:
vector<DebugEventInfo> _snapshotCurrentFrame;
vector<DebugEventInfo> _snapshotPrevFrame;
int16_t _snapshotScanline = -1;
int16_t _snapshotScanlineOffset = 0;
uint16_t _snapshotCycle = 0;
SimpleLock _lock;
@ -55,6 +56,13 @@ protected:
void DrawDot(uint32_t x, uint32_t y, uint32_t color, bool drawBackground, uint32_t* buffer);
virtual int GetScanlineOffset() { return 0; }
void DrawLine(uint32_t* buffer, FrameInfo size, uint32_t color, uint32_t row);
void DrawEvents(uint32_t* buffer, FrameInfo size);
virtual void ConvertScanlineCycleToRowColumn(int32_t& x, int32_t& y) = 0;
virtual void DrawScreen(uint32_t* buffer) = 0;
void DrawEvent(DebugEventInfo& evt, bool drawBackground, uint32_t* buffer);
public:
virtual ~BaseEventManager() {}
@ -71,6 +79,7 @@ public:
virtual uint32_t TakeEventSnapshot() = 0;
virtual FrameInfo GetDisplayBufferSize() = 0;
virtual void GetDisplayBuffer(uint32_t* buffer, uint32_t bufferSize) = 0;
virtual DebugEventInfo GetEvent(uint16_t scanline, uint16_t cycle) = 0;
void GetDisplayBuffer(uint32_t* buffer, uint32_t bufferSize);
};

View file

@ -115,14 +115,10 @@ EventViewerCategoryCfg GbEventManager::GetEventConfig(DebugEventInfo& evt)
}
}
void GbEventManager::DrawEvent(DebugEventInfo& evt, bool drawBackground, uint32_t* buffer)
void GbEventManager::ConvertScanlineCycleToRowColumn(int32_t& x, int32_t& y)
{
EventViewerCategoryCfg evtCfg = GetEventConfig(evt);
uint32_t color = evtCfg.Color;
uint32_t y = std::min<uint32_t>(evt.Scanline * 2, _scanlineCount * 2);
uint32_t x = evt.Cycle * 2;
DrawDot(x, y, color, drawBackground, buffer);
y *= 2;
x *= 2;
}
uint32_t GbEventManager::TakeEventSnapshot()
@ -158,14 +154,8 @@ FrameInfo GbEventManager::GetDisplayBufferSize()
return size;
}
void GbEventManager::GetDisplayBuffer(uint32_t* buffer, uint32_t bufferSize)
void GbEventManager::DrawScreen(uint32_t* buffer)
{
auto lock = _lock.AcquireSafe();
FrameInfo size = GetDisplayBufferSize();
if(_snapshotScanline < 0 || bufferSize < size.Width * size.Height * sizeof(uint32_t)) {
return;
}
uint16_t *src = _ppuBuffer;
for(uint32_t y = 0, len = GbEventManager::ScreenHeight*2; y < len; y++) {
for(uint32_t x = 0; x < GbEventManager::ScanlineWidth; x++) {
@ -173,21 +163,4 @@ void GbEventManager::GetDisplayBuffer(uint32_t* buffer, uint32_t bufferSize)
buffer[y*GbEventManager::ScanlineWidth + x] = SnesDefaultVideoFilter::ToArgb(src[srcOffset]);
}
}
constexpr uint32_t currentScanlineColor = 0xFFFFFF55;
uint32_t scanlineOffset = _snapshotScanline * 2 * GbEventManager::ScanlineWidth;
if(_snapshotScanline != 0) {
for(int i = 0; i < GbEventManager::ScanlineWidth; i++) {
buffer[scanlineOffset + i] = currentScanlineColor;
buffer[scanlineOffset + GbEventManager::ScanlineWidth + i] = currentScanlineColor;
}
}
FilterEvents();
for(DebugEventInfo &evt : _sentEvents) {
DrawEvent(evt, true, buffer);
}
for(DebugEventInfo &evt : _sentEvents) {
DrawEvent(evt, false, buffer);
}
}

View file

@ -47,10 +47,10 @@ private:
uint32_t _scanlineCount = GbEventManager::ScreenHeight;
uint16_t* _ppuBuffer = nullptr;
void DrawEvent(DebugEventInfo& evt, bool drawBackground, uint32_t* buffer);
protected:
bool ShowPreviousFrameEvents() override;
void ConvertScanlineCycleToRowColumn(int32_t& x, int32_t& y) override;
void DrawScreen(uint32_t* buffer) override;
public:
GbEventManager(Debugger* debugger, GbCpu* cpu, GbPpu* ppu);
@ -62,7 +62,6 @@ public:
EventViewerCategoryCfg GetEventConfig(DebugEventInfo& evt);
uint32_t TakeEventSnapshot();
void GetDisplayBuffer(uint32_t* buffer, uint32_t bufferSize);
DebugEventInfo GetEvent(uint16_t y, uint16_t x);
FrameInfo GetDisplayBufferSize() override;

View file

@ -18,6 +18,7 @@ NesEventManager::NesEventManager(Debugger *debugger, NesConsole* console)
_cpu = console->GetCpu();
_ppu = console->GetPpu();
_mapper = console->GetMapper();
_snapshotScanlineOffset = -1;
NesDefaultVideoFilter::GetFullPalette(_palette, console->GetNesConfig(), _ppu->GetPpuModel());
@ -180,18 +181,10 @@ EventViewerCategoryCfg NesEventManager::GetEventConfig(DebugEventInfo& evt)
return {};
}
void NesEventManager::DrawEvent(DebugEventInfo &evt, bool drawBackground, uint32_t *buffer)
void NesEventManager::ConvertScanlineCycleToRowColumn(int32_t& x, int32_t& y)
{
EventViewerCategoryCfg eventCfg = GetEventConfig(evt);
uint32_t color = eventCfg.Color;
if(!eventCfg.Visible) {
return;
}
uint32_t y = std::min<uint32_t>((evt.Scanline + 1) * 2, _scanlineCount * 2);
uint32_t x = evt.Cycle * 2;
DrawDot(x, y, color, drawBackground, buffer);
y = (y + 1) * 2;
x = x * 2;
}
uint32_t NesEventManager::TakeEventSnapshot()
@ -226,19 +219,8 @@ FrameInfo NesEventManager::GetDisplayBufferSize()
return size;
}
void NesEventManager::GetDisplayBuffer(uint32_t *buffer, uint32_t bufferSize)
void NesEventManager::DrawScreen(uint32_t *buffer)
{
auto lock = _lock.AcquireSafe();
FrameInfo size = GetDisplayBufferSize();
if(_snapshotScanline < 0 || bufferSize < size.Width * size.Height * sizeof(uint32_t)) {
return;
}
for(uint32_t i = 0; i < size.Width*size.Height; i++) {
buffer[i] = 0xFF555555;
}
uint16_t *src = _ppuBuffer;
for(uint32_t y = 0, len = NesConstants::ScreenHeight*2; y < len; y++) {
int rowOffset = (y + 2) * NesConstants::CyclesPerLine * 2;
@ -252,29 +234,6 @@ void NesEventManager::GetDisplayBuffer(uint32_t *buffer, uint32_t bufferSize)
if(_config.ShowNtscBorders) {
DrawNtscBorders(buffer);
}
constexpr uint32_t currentScanlineColor = 0xFFFFFF55;
uint32_t scanlineOffset = _snapshotScanline * 2 * NesConstants::CyclesPerLine * 2;
for(int i = 0; i < NesConstants::CyclesPerLine * 2; i++) {
if(_snapshotScanline != 0) {
buffer[scanlineOffset + i] = currentScanlineColor;
buffer[scanlineOffset + NesConstants::CyclesPerLine * 2 + i] = currentScanlineColor;
}
}
FilterEvents();
for(DebugEventInfo &evt : _sentEvents) {
DrawEvent(evt, true, buffer);
}
for(DebugEventInfo &evt : _sentEvents) {
DrawEvent(evt, false, buffer);
}
//Draw dot over current pixel
if(_snapshotScanline != 0 || _snapshotCycle != 0) {
DrawDot(_snapshotCycle * 2, _snapshotScanline * 2, 0xFF990099, true, buffer);
DrawDot(_snapshotCycle * 2, _snapshotScanline * 2, 0xFFFF00FF, false, buffer);
}
}
void NesEventManager::DrawPixel(uint32_t *buffer, int32_t x, uint32_t y, uint32_t color)

View file

@ -59,11 +59,13 @@ private:
uint32_t _scanlineCount = 262;
uint16_t *_ppuBuffer = nullptr;
void DrawEvent(DebugEventInfo &evt, bool drawBackground, uint32_t *buffer);
void DrawNtscBorders(uint32_t *buffer);
void DrawPixel(uint32_t *buffer, int32_t x, uint32_t y, uint32_t color);
protected:
void ConvertScanlineCycleToRowColumn(int32_t& x, int32_t& y) override;
void DrawScreen(uint32_t* buffer) override;
bool ShowPreviousFrameEvents() override;
int GetScanlineOffset() override { return 1; }
@ -81,7 +83,6 @@ public:
uint32_t TakeEventSnapshot();
FrameInfo GetDisplayBufferSize() override;
void GetDisplayBuffer(uint32_t* buffer, uint32_t bufferSize) override;
DebugEventInfo GetEvent(uint16_t y, uint16_t x) override;

View file

@ -151,15 +151,10 @@ EventViewerCategoryCfg SnesEventManager::GetEventConfig(DebugEventInfo& evt)
}
}
void SnesEventManager::DrawEvent(DebugEventInfo &evt, bool drawBackground, uint32_t *buffer)
void SnesEventManager::ConvertScanlineCycleToRowColumn(int32_t& x, int32_t& y)
{
EventViewerCategoryCfg eventCfg = GetEventConfig(evt);
uint32_t color = eventCfg.Color;
uint32_t y = std::min<uint32_t>(evt.Scanline * 2, _scanlineCount * 2);
uint32_t x = evt.Cycle / 2;
DrawDot(x, y, color, drawBackground, buffer);
y *= 2;
x /= 2;
}
uint32_t SnesEventManager::TakeEventSnapshot()
@ -199,19 +194,8 @@ FrameInfo SnesEventManager::GetDisplayBufferSize()
return size;
}
void SnesEventManager::GetDisplayBuffer(uint32_t *buffer, uint32_t bufferSize)
void SnesEventManager::DrawScreen(uint32_t *buffer)
{
auto lock = _lock.AcquireSafe();
FrameInfo size = GetDisplayBufferSize();
if(_snapshotScanline < 0 || bufferSize < size.Width * size.Height * sizeof(uint32_t)) {
return;
}
for(uint32_t i = 0; i < size.Width*size.Height; i++) {
buffer[i] = 0xFF555555;
}
//Skip the first 7 blank lines in the buffer when overscan mode is off
uint16_t *src = _ppuBuffer + (_overscanMode ? 0 : (_useHighResOutput ? (512 * 14) : (256 * 7)));
@ -221,25 +205,4 @@ void SnesEventManager::GetDisplayBuffer(uint32_t *buffer, uint32_t bufferSize)
buffer[(y + 2)*SnesEventManager::ScanlineWidth + x + 22*2] = SnesDefaultVideoFilter::ToArgb(src[srcOffset]);
}
}
constexpr uint32_t nmiColor = 0xFF55FFFF;
constexpr uint32_t currentScanlineColor = 0xFFFFFF55;
int nmiScanline = (_overscanMode ? 240 : 225) * 2 * SnesEventManager::ScanlineWidth;
uint32_t scanlineOffset = _snapshotScanline * 2 * SnesEventManager::ScanlineWidth;
for(int i = 0; i < SnesEventManager::ScanlineWidth; i++) {
buffer[nmiScanline + i] = nmiColor;
buffer[nmiScanline + SnesEventManager::ScanlineWidth + i] = nmiColor;
if(_snapshotScanline != 0) {
buffer[scanlineOffset + i] = currentScanlineColor;
buffer[scanlineOffset + SnesEventManager::ScanlineWidth + i] = currentScanlineColor;
}
}
FilterEvents();
for(DebugEventInfo &evt : _sentEvents) {
DrawEvent(evt, true, buffer);
}
for(DebugEventInfo &evt : _sentEvents) {
DrawEvent(evt, false, buffer);
}
}

View file

@ -58,9 +58,9 @@ private:
uint32_t _scanlineCount = 262;
uint16_t *_ppuBuffer = nullptr;
void DrawEvent(DebugEventInfo& evt, bool drawBackground, uint32_t* buffer);
protected:
void ConvertScanlineCycleToRowColumn(int32_t& x, int32_t& y) override;
void DrawScreen(uint32_t* buffer) override;
bool ShowPreviousFrameEvents() override;
public:
@ -73,8 +73,7 @@ public:
EventViewerCategoryCfg GetEventConfig(DebugEventInfo& evt);
uint32_t TakeEventSnapshot();
FrameInfo GetDisplayBufferSize();
void GetDisplayBuffer(uint32_t *buffer, uint32_t bufferSize);
FrameInfo GetDisplayBufferSize() override;
DebugEventInfo GetEvent(uint16_t y, uint16_t x);
void SetConfiguration(BaseEventViewerConfig& config) override;

View file

@ -584,7 +584,7 @@ namespace Mesen.Interop
public Int16 Scanline;
public UInt16 Cycle;
public Int16 BreakpointId;
public byte DmaChannel;
public sbyte DmaChannel;
public DmaChannelConfig DmaChannelInfo;
public EventFlags Flags;
public MemoryOperationInfo TargetMemory;