mirror of
https://github.com/libretro/ppsspp.git
synced 2025-02-12 04:11:56 +00:00
Add render target breakpoints to GE debugger.
Including z buffer as well, hope it's not confusing.
This commit is contained in:
parent
bb7dd908ba
commit
916c53c859
@ -27,14 +27,17 @@ static recursive_mutex breaksLock;
|
||||
static std::vector<bool> breakCmds;
|
||||
static std::set<u32> breakPCs;
|
||||
static std::set<u32> breakTextures;
|
||||
static std::set<u32> breakRenderTargets;
|
||||
// Small optimization to avoid a lock/lookup for the common case.
|
||||
static size_t breakPCsCount = 0;
|
||||
static size_t breakTexturesCount = 0;
|
||||
static size_t breakRenderTargetsCount = 0;
|
||||
|
||||
// If these are set, the above are also, but they should be temporary.
|
||||
static std::vector<bool> breakCmdsTemp;
|
||||
static std::set<u32> breakPCsTemp;
|
||||
static std::set<u32> breakTexturesTemp;
|
||||
static std::set<u32> breakRenderTargetsTemp;
|
||||
static bool textureChangeTemp = false;
|
||||
|
||||
static u32 lastTexture = 0xFFFFFFFF;
|
||||
@ -96,6 +99,17 @@ u32 GetAdjustedTextureAddress(u32 op) {
|
||||
return addr;
|
||||
}
|
||||
|
||||
u32 GetAdjustedRenderTargetAddress(u32 op) {
|
||||
const u8 cmd = op >> 24;
|
||||
switch (cmd) {
|
||||
case GE_CMD_FRAMEBUFPTR:
|
||||
case GE_CMD_ZBUFPTR:
|
||||
return op & 0x003FFFF0;
|
||||
}
|
||||
|
||||
return (u32)-1;
|
||||
}
|
||||
|
||||
bool IsTextureChangeBreakpoint(u32 op, u32 addr) {
|
||||
if (!textureChangeTemp) {
|
||||
return false;
|
||||
@ -131,6 +145,14 @@ bool IsTextureCmdBreakpoint(u32 op) {
|
||||
}
|
||||
}
|
||||
|
||||
bool IsRenderTargetCmdBreakpoint(u32 op) {
|
||||
const u32 addr = GetAdjustedRenderTargetAddress(op);
|
||||
if (addr != (u32)-1) {
|
||||
return IsRenderTargetBreakpoint(addr);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool IsBreakpoint(u32 pc, u32 op) {
|
||||
if (IsAddressBreakpoint(pc) || IsOpBreakpoint(op)) {
|
||||
return true;
|
||||
@ -140,6 +162,9 @@ bool IsBreakpoint(u32 pc, u32 op) {
|
||||
// Break on the next non-texture.
|
||||
AddNonTextureTempBreakpoints();
|
||||
}
|
||||
if (breakRenderTargetsCount != 0 && IsRenderTargetCmdBreakpoint(op)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
@ -184,6 +209,30 @@ bool IsTextureBreakpoint(u32 addr) {
|
||||
return breakTextures.find(addr) != breakTextures.end();
|
||||
}
|
||||
|
||||
bool IsRenderTargetBreakpoint(u32 addr, bool &temp) {
|
||||
if (breakRenderTargetsCount == 0) {
|
||||
temp = false;
|
||||
return false;
|
||||
}
|
||||
|
||||
addr &= 0x003FFFF0;
|
||||
|
||||
lock_guard guard(breaksLock);
|
||||
temp = breakRenderTargetsTemp.find(addr) != breakRenderTargetsTemp.end();
|
||||
return breakRenderTargets.find(addr) != breakRenderTargets.end();
|
||||
}
|
||||
|
||||
bool IsRenderTargetBreakpoint(u32 addr) {
|
||||
if (breakRenderTargetsCount == 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
addr &= 0x003FFFF0;
|
||||
|
||||
lock_guard guard(breaksLock);
|
||||
return breakRenderTargets.find(addr) != breakRenderTargets.end();
|
||||
}
|
||||
|
||||
bool IsCmdBreakpoint(u8 cmd, bool &temp) {
|
||||
temp = breakCmdsTemp[cmd];
|
||||
return breakCmds[cmd];
|
||||
@ -241,6 +290,24 @@ void AddTextureBreakpoint(u32 addr, bool temp) {
|
||||
breakTexturesCount = breakTextures.size();
|
||||
}
|
||||
|
||||
void AddRenderTargetBreakpoint(u32 addr, bool temp) {
|
||||
lock_guard guard(breaksLock);
|
||||
|
||||
addr &= 0x003FFFF0;
|
||||
|
||||
if (temp) {
|
||||
if (breakRenderTargets.find(addr) == breakRenderTargets.end()) {
|
||||
breakRenderTargetsTemp.insert(addr);
|
||||
breakRenderTargets.insert(addr);
|
||||
}
|
||||
} else {
|
||||
breakRenderTargetsTemp.erase(addr);
|
||||
breakRenderTargets.insert(addr);
|
||||
}
|
||||
|
||||
breakRenderTargetsCount = breakRenderTargets.size();
|
||||
}
|
||||
|
||||
void AddTextureChangeTempBreakpoint() {
|
||||
textureChangeTemp = true;
|
||||
}
|
||||
@ -268,6 +335,17 @@ void RemoveTextureBreakpoint(u32 addr) {
|
||||
breakTexturesCount = breakTextures.size();
|
||||
}
|
||||
|
||||
void RemoveRenderTargetBreakpoint(u32 addr) {
|
||||
lock_guard guard(breaksLock);
|
||||
|
||||
addr &= 0x003FFFF0;
|
||||
|
||||
breakRenderTargetsTemp.erase(addr);
|
||||
breakRenderTargets.erase(addr);
|
||||
|
||||
breakRenderTargetsCount = breakRenderTargets.size();
|
||||
}
|
||||
|
||||
void RemoveTextureChangeTempBreakpoint() {
|
||||
textureChangeTemp = false;
|
||||
}
|
||||
@ -283,14 +361,17 @@ void ClearAllBreakpoints() {
|
||||
breakCmds.resize(256, false);
|
||||
breakPCs.clear();
|
||||
breakTextures.clear();
|
||||
breakRenderTargets.clear();
|
||||
|
||||
breakCmdsTemp.clear();
|
||||
breakCmdsTemp.resize(256, false);
|
||||
breakPCsTemp.clear();
|
||||
breakTexturesTemp.clear();
|
||||
breakRenderTargetsTemp.clear();
|
||||
|
||||
breakPCsCount = breakPCs.size();
|
||||
breakTexturesCount = breakTextures.size();
|
||||
breakRenderTargetsCount = breakRenderTargets.size();
|
||||
|
||||
textureChangeTemp = false;
|
||||
}
|
||||
@ -316,7 +397,13 @@ void ClearTempBreakpoints() {
|
||||
breakTextures.erase(*it);
|
||||
}
|
||||
breakTexturesTemp.clear();
|
||||
breakPCsCount = breakTextures.size();
|
||||
breakTexturesCount = breakTextures.size();
|
||||
|
||||
for (auto it = breakRenderTargetsTemp.begin(), end = breakRenderTargetsTemp.end(); it != end; ++it) {
|
||||
breakRenderTargets.erase(*it);
|
||||
}
|
||||
breakRenderTargetsTemp.clear();
|
||||
breakRenderTargetsCount = breakRenderTargets.size();
|
||||
|
||||
textureChangeTemp = false;
|
||||
}
|
||||
|
@ -30,16 +30,20 @@ namespace GPUBreakpoints {
|
||||
bool IsCmdBreakpoint(u8 cmd);
|
||||
bool IsTextureBreakpoint(u32 addr, bool &temp);
|
||||
bool IsTextureBreakpoint(u32 addr);
|
||||
bool IsRenderTargetBreakpoint(u32 addr, bool &temp);
|
||||
bool IsRenderTargetBreakpoint(u32 addr);
|
||||
|
||||
void AddAddressBreakpoint(u32 addr, bool temp = false);
|
||||
void AddCmdBreakpoint(u8 cmd, bool temp = false);
|
||||
void AddTextureBreakpoint(u32 addr, bool temp = false);
|
||||
void AddTextureChangeTempBreakpoint();
|
||||
void AddRenderTargetBreakpoint(u32 addr, bool temp = false);
|
||||
|
||||
void RemoveAddressBreakpoint(u32 addr);
|
||||
void RemoveCmdBreakpoint(u8 cmd);
|
||||
void RemoveTextureBreakpoint(u32 addr);
|
||||
void RemoveTextureChangeTempBreakpoint();
|
||||
void RemoveRenderTargetBreakpoint(u32 addr);
|
||||
|
||||
void UpdateLastTexture(u32 addr);
|
||||
|
||||
|
@ -658,6 +658,25 @@ BOOL CGEDebugger::DlgProc(UINT message, WPARAM wParam, LPARAM lParam) {
|
||||
}
|
||||
break;
|
||||
|
||||
case IDC_GEDBG_BREAKTARGET:
|
||||
{
|
||||
attached = true;
|
||||
if (!gpuDebug) {
|
||||
break;
|
||||
}
|
||||
const auto state = gpuDebug->GetGState();
|
||||
u32 fbAddr = state.getFrameBufRawAddress();
|
||||
// TODO: Better interface that allows add/remove or something.
|
||||
if (InputBox_GetHex(GetModuleHandle(NULL), m_hDlg, L"Framebuffer Address", fbAddr, fbAddr)) {
|
||||
if (IsRenderTargetBreakpoint(fbAddr)) {
|
||||
RemoveRenderTargetBreakpoint(fbAddr);
|
||||
} else {
|
||||
AddRenderTargetBreakpoint(fbAddr);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case IDC_GEDBG_TEXLEVELDOWN:
|
||||
UpdateTextureLevel(textureLevel_ - 1);
|
||||
if (attached && gpuDebug != nullptr) {
|
||||
|
@ -187,6 +187,7 @@ BEGIN
|
||||
PUSHBUTTON "Level -",IDC_GEDBG_TEXLEVELDOWN,24,192,40,14
|
||||
PUSHBUTTON "Level +",IDC_GEDBG_TEXLEVELUP,84,192,40,14
|
||||
CONTROL "",IDC_GEDBG_FBTABS,"SysTabControl32",TCS_BUTTONS | TCS_FOCUSNEVER,384,192,110,12
|
||||
PUSHBUTTON "Break on Target...",IDC_GEDBG_BREAKTARGET,394,211,100,14
|
||||
END
|
||||
|
||||
|
||||
|
@ -324,6 +324,7 @@
|
||||
#define ID_EMULATION_ROTATION_V_R 40159
|
||||
#define ID_OPTIONS_DISPLAY_LAYOUT 40160
|
||||
#define ID_OPTIONS_VULKAN 40161
|
||||
#define IDC_GEDBG_BREAKTARGET 40162
|
||||
|
||||
// Dummy option to let the buffered rendering hotkey cycle through all the options.
|
||||
#define ID_OPTIONS_BUFFEREDRENDERINGDUMMY 40500
|
||||
@ -336,7 +337,7 @@
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
#ifndef APSTUDIO_READONLY_SYMBOLS
|
||||
#define _APS_NEXT_RESOURCE_VALUE 256
|
||||
#define _APS_NEXT_COMMAND_VALUE 40161
|
||||
#define _APS_NEXT_COMMAND_VALUE 40163
|
||||
#define _APS_NEXT_CONTROL_VALUE 1199
|
||||
#define _APS_NEXT_SYMED_VALUE 101
|
||||
#endif
|
||||
|
Loading…
x
Reference in New Issue
Block a user