mirror of
https://github.com/hrydgard/ppsspp.git
synced 2025-04-02 11:01:50 -04:00
Remove the notion of the GPU debugger being "Active". Now it's automatic.
This commit is contained in:
parent
7b3687d79c
commit
9e019ae246
10 changed files with 36 additions and 67 deletions
|
@ -485,7 +485,7 @@ void DrawEngineD3D11::DoFlush() {
|
|||
|
||||
ResetAfterDrawInline();
|
||||
framebufferManager_->SetColorUpdated(gstate_c.skipDrawReason);
|
||||
GPUDebug::NotifyDraw();
|
||||
GPUDebug::NotifyFlush();
|
||||
}
|
||||
|
||||
TessellationDataTransferD3D11::TessellationDataTransferD3D11(ID3D11DeviceContext *context, ID3D11Device *device)
|
||||
|
|
|
@ -26,7 +26,6 @@
|
|||
|
||||
namespace GPUDebug {
|
||||
|
||||
static bool active = false;
|
||||
static BreakNext breakNext = BreakNext::NONE;
|
||||
static int breakAtCount = -1;
|
||||
|
||||
|
@ -58,26 +57,15 @@ const char *BreakNextToString(BreakNext next) {
|
|||
}
|
||||
}
|
||||
|
||||
void SetActive(bool flag) {
|
||||
active = flag;
|
||||
if (!active) {
|
||||
breakNext = BreakNext::NONE;
|
||||
breakAtCount = -1;
|
||||
GPUStepping::ResumeFromStepping();
|
||||
lastStepTime = -1.0;
|
||||
}
|
||||
/*
|
||||
active = false;
|
||||
breakAtCount = -1;
|
||||
thisFlipNum = 0;
|
||||
g_primAfterDraw = false;
|
||||
lastStepTime = -1.0f;
|
||||
g_skipPcOnce = false;
|
||||
*/
|
||||
bool NeedsSlowInterpreter() {
|
||||
return breakNext != BreakNext::NONE || GPUBreakpoints::g_hasBreakpoints;
|
||||
}
|
||||
|
||||
bool IsActive() {
|
||||
return active;
|
||||
void ClearBreak() {
|
||||
breakNext = BreakNext::NONE;
|
||||
breakAtCount = -1;
|
||||
GPUStepping::ResumeFromStepping();
|
||||
lastStepTime = -1.0;
|
||||
}
|
||||
|
||||
BreakNext GetBreakNext() {
|
||||
|
@ -85,7 +73,6 @@ BreakNext GetBreakNext() {
|
|||
}
|
||||
|
||||
void SetBreakNext(BreakNext next) {
|
||||
SetActive(true);
|
||||
breakNext = next;
|
||||
breakAtCount = -1;
|
||||
if (next == BreakNext::TEX) {
|
||||
|
@ -119,11 +106,6 @@ void SetBreakCount(int c, bool relative) {
|
|||
}
|
||||
|
||||
NotifyResult NotifyCommand(u32 pc) {
|
||||
if (!active) {
|
||||
_dbg_assert_(false);
|
||||
return NotifyResult::Skip; // return false
|
||||
}
|
||||
|
||||
u32 op = Memory::ReadUnchecked_U32(pc);
|
||||
u32 cmd = op >> 24;
|
||||
if (thisFlipNum != gpuStats.numFlips) {
|
||||
|
@ -187,12 +169,9 @@ NotifyResult NotifyCommand(u32 pc) {
|
|||
return process ? NotifyResult::Execute : NotifyResult::Skip;
|
||||
}
|
||||
|
||||
// TODO: This mechanism is a bit hacky.
|
||||
void NotifyDraw() {
|
||||
if (!active)
|
||||
return;
|
||||
void NotifyFlush() {
|
||||
if (breakNext == BreakNext::DRAW && !GPUStepping::IsStepping()) {
|
||||
// Hack to handle draw notifications, that don't come in via NotifyCommand.
|
||||
// Break on the first PRIM after a flush.
|
||||
if (g_primAfterDraw) {
|
||||
NOTICE_LOG(Log::GeDebugger, "Flush detected, breaking at next PRIM");
|
||||
g_primAfterDraw = false;
|
||||
|
@ -203,17 +182,13 @@ void NotifyDraw() {
|
|||
}
|
||||
|
||||
void NotifyDisplay(u32 framebuf, u32 stride, int format) {
|
||||
if (!active)
|
||||
return;
|
||||
if (breakNext == BreakNext::FRAME) {
|
||||
// This should work fine, start stepping at the first op of the new frame.
|
||||
// Start stepping at the first op of the new frame.
|
||||
breakNext = BreakNext::OP;
|
||||
}
|
||||
}
|
||||
|
||||
void NotifyBeginFrame() {
|
||||
if (!active)
|
||||
return;
|
||||
if (breakNext == BreakNext::VSYNC) {
|
||||
// Just start stepping as soon as we can once the vblank finishes.
|
||||
breakNext = BreakNext::OP;
|
||||
|
@ -238,7 +213,6 @@ static bool ParseRange(const std::string &s, std::pair<int, int> &range) {
|
|||
}
|
||||
|
||||
bool SetRestrictPrims(const char *rule) {
|
||||
SetActive(true);
|
||||
if (rule == nullptr || rule[0] == 0 || (rule[0] == '*' && rule[1] == 0)) {
|
||||
restrictPrimRanges.clear();
|
||||
restrictPrimRule.clear();
|
||||
|
|
|
@ -34,8 +34,7 @@ enum class BreakNext {
|
|||
COUNT,
|
||||
};
|
||||
|
||||
void SetActive(bool flag);
|
||||
bool IsActive();
|
||||
bool NeedsSlowInterpreter();
|
||||
|
||||
void SetBreakNext(BreakNext next);
|
||||
void SetBreakCount(int c, bool relative = false);
|
||||
|
@ -50,7 +49,7 @@ enum class NotifyResult {
|
|||
|
||||
// While debugging is active, these may block.
|
||||
NotifyResult NotifyCommand(u32 pc);
|
||||
void NotifyDraw();
|
||||
void NotifyFlush();
|
||||
void NotifyDisplay(u32 framebuf, u32 stride, int format);
|
||||
void NotifyBeginFrame();
|
||||
|
||||
|
|
|
@ -421,7 +421,7 @@ void DrawEngineDX9::DoFlush() {
|
|||
|
||||
ResetAfterDrawInline();
|
||||
framebufferManager_->SetColorUpdated(gstate_c.skipDrawReason);
|
||||
GPUDebug::NotifyDraw();
|
||||
GPUDebug::NotifyFlush();
|
||||
}
|
||||
|
||||
void TessellationDataTransferDX9::SendDataToShader(const SimpleVertex *const *points, int size_u, int size_v, u32 vertType, const Spline::Weight2D &weights) {
|
||||
|
|
|
@ -451,7 +451,7 @@ void DrawEngineGLES::DoFlush() {
|
|||
bail:
|
||||
ResetAfterDrawInline();
|
||||
framebufferManager_->SetColorUpdated(gstate_c.skipDrawReason);
|
||||
GPUDebug::NotifyDraw();
|
||||
GPUDebug::NotifyFlush();
|
||||
}
|
||||
|
||||
// TODO: Refactor this to a single USE flag.
|
||||
|
|
|
@ -791,7 +791,8 @@ DLResult GPUCommon::ProcessDLQueue() {
|
|||
gpuState = list.pc == list.stall ? GPUSTATE_STALL : GPUSTATE_RUNNING;
|
||||
|
||||
// To enable breakpoints, we don't do fast matrix loads while debugger active.
|
||||
debugRecording_ = GPUDebug::IsActive() || GPURecord::IsActive();
|
||||
debugRecording_ = GPURecord::IsActive();
|
||||
useFastRunLoop_ = !(dumpThisFrame_ || debugRecording_ || GPUDebug::NeedsSlowInterpreter());
|
||||
} else {
|
||||
resumingFromDebugBreak_ = false;
|
||||
// The bottom part of the gpuState loop below, that wasn't executed
|
||||
|
@ -804,7 +805,7 @@ DLResult GPUCommon::ProcessDLQueue() {
|
|||
// Proceed...
|
||||
}
|
||||
|
||||
const bool useFastRunLoop = !dumpThisFrame_ && !debugRecording_;
|
||||
const bool useFastRunLoop = useFastRunLoop_;
|
||||
|
||||
while (gpuState == GPUSTATE_RUNNING) {
|
||||
if (list.pc == list.stall) {
|
||||
|
@ -880,9 +881,9 @@ DLResult GPUCommon::ProcessDLQueue() {
|
|||
}
|
||||
|
||||
bool GPUCommon::ShouldSplitOverGe() const {
|
||||
// Check for debugger active, etc.
|
||||
// Check for debugger active.
|
||||
// We only need to do this if we want to be able to step through Ge display lists using the Ge debuggers.
|
||||
return GPUDebug::IsActive() || g_Config.bShowImDebugger;
|
||||
return GPUDebug::NeedsSlowInterpreter();
|
||||
}
|
||||
|
||||
void GPUCommon::Execute_OffsetAddr(u32 op, u32 diff) {
|
||||
|
@ -948,8 +949,8 @@ void GPUCommon::DoExecuteCall(u32 target) {
|
|||
DisplayList *currentList = this->currentList;
|
||||
|
||||
// Bone matrix optimization - many games will CALL a bone matrix (!).
|
||||
// We don't optimize during recording - so the matrix data gets recorded.
|
||||
if (!debugRecording_ && Memory::IsValidRange(target, 13 * 4) && (Memory::ReadUnchecked_U32(target) >> 24) == GE_CMD_BONEMATRIXDATA) {
|
||||
// We don't optimize during recording or debugging - so the matrix data gets recorded.
|
||||
if (useFastRunLoop_ && Memory::IsValidRange(target, 13 * 4) && (Memory::ReadUnchecked_U32(target) >> 24) == GE_CMD_BONEMATRIXDATA) {
|
||||
// Check for the end
|
||||
if ((Memory::ReadUnchecked_U32(target + 11 * 4) >> 24) == GE_CMD_BONEMATRIXDATA &&
|
||||
(Memory::ReadUnchecked_U32(target + 12 * 4) >> 24) == GE_CMD_RET &&
|
||||
|
|
|
@ -447,7 +447,7 @@ protected:
|
|||
|
||||
bool interruptRunning = false;
|
||||
GPURunState gpuState = GPUSTATE_RUNNING;
|
||||
bool isbreak;
|
||||
bool isbreak; // This doesn't mean debugger breakpoints.
|
||||
u64 drawCompleteTicks;
|
||||
u64 busyTicks;
|
||||
|
||||
|
@ -459,8 +459,9 @@ protected:
|
|||
bool resumingFromDebugBreak_ = false;
|
||||
bool dumpNextFrame_ = false;
|
||||
bool dumpThisFrame_ = false;
|
||||
bool debugRecording_;
|
||||
bool interruptsEnabled_;
|
||||
bool useFastRunLoop_ = false;
|
||||
bool debugRecording_ = false;
|
||||
bool interruptsEnabled_ = false;
|
||||
bool displayResized_ = false;
|
||||
bool renderResized_ = false;
|
||||
bool configChanged_ = false;
|
||||
|
|
|
@ -896,7 +896,7 @@ void TransformUnit::Flush(const char *reason) {
|
|||
return;
|
||||
|
||||
binner_->Flush(reason);
|
||||
GPUDebug::NotifyDraw();
|
||||
GPUDebug::NotifyFlush();
|
||||
hasDraws_ = false;
|
||||
}
|
||||
|
||||
|
|
|
@ -569,7 +569,7 @@ void DrawEngineVulkan::DoFlush() {
|
|||
|
||||
framebufferManager_->SetColorUpdated(gstate_c.skipDrawReason);
|
||||
|
||||
GPUDebug::NotifyDraw();
|
||||
GPUDebug::NotifyFlush();
|
||||
}
|
||||
|
||||
void DrawEngineVulkan::ResetAfterDraw() {
|
||||
|
|
|
@ -925,8 +925,6 @@ BOOL CGEDebugger::DlgProc(UINT message, WPARAM wParam, LPARAM lParam) {
|
|||
return TRUE;
|
||||
|
||||
case WM_CLOSE:
|
||||
GPUDebug::SetActive(false);
|
||||
|
||||
stepCountDlg.Show(false);
|
||||
Show(false);
|
||||
return TRUE;
|
||||
|
@ -978,7 +976,7 @@ BOOL CGEDebugger::DlgProc(UINT message, WPARAM wParam, LPARAM lParam) {
|
|||
break;
|
||||
case IDC_GEDBG_FBTABS:
|
||||
fbTabs->HandleNotify(lParam);
|
||||
if (GPUDebug::IsActive() && gpuDebug != nullptr) {
|
||||
if (gpuDebug != nullptr) {
|
||||
UpdatePreviews();
|
||||
}
|
||||
break;
|
||||
|
@ -1025,7 +1023,6 @@ BOOL CGEDebugger::DlgProc(UINT message, WPARAM wParam, LPARAM lParam) {
|
|||
|
||||
case IDC_GEDBG_BREAKTEX:
|
||||
{
|
||||
GPUDebug::SetActive(true);
|
||||
if (!gpuDebug) {
|
||||
break;
|
||||
}
|
||||
|
@ -1044,7 +1041,6 @@ BOOL CGEDebugger::DlgProc(UINT message, WPARAM wParam, LPARAM lParam) {
|
|||
|
||||
case IDC_GEDBG_BREAKTARGET:
|
||||
{
|
||||
GPUDebug::SetActive(true);
|
||||
if (!gpuDebug) {
|
||||
break;
|
||||
}
|
||||
|
@ -1062,15 +1058,15 @@ BOOL CGEDebugger::DlgProc(UINT message, WPARAM wParam, LPARAM lParam) {
|
|||
break;
|
||||
|
||||
case IDC_GEDBG_TEXLEVELDOWN:
|
||||
UpdateTextureLevel(textureLevel_ - 1);
|
||||
if (GPUDebug::IsActive() && gpuDebug != nullptr) {
|
||||
if (gpuDebug != nullptr) {
|
||||
UpdateTextureLevel(textureLevel_ - 1);
|
||||
UpdatePreviews();
|
||||
}
|
||||
break;
|
||||
|
||||
case IDC_GEDBG_TEXLEVELUP:
|
||||
UpdateTextureLevel(textureLevel_ + 1);
|
||||
if (GPUDebug::IsActive() && gpuDebug != nullptr) {
|
||||
if (gpuDebug != nullptr) {
|
||||
UpdateTextureLevel(textureLevel_ + 1);
|
||||
UpdatePreviews();
|
||||
}
|
||||
break;
|
||||
|
@ -1094,7 +1090,7 @@ BOOL CGEDebugger::DlgProc(UINT message, WPARAM wParam, LPARAM lParam) {
|
|||
break;
|
||||
|
||||
case IDC_GEDBG_FLUSH:
|
||||
if (GPUDebug::IsActive() && gpuDebug != nullptr) {
|
||||
if (gpuDebug != nullptr) {
|
||||
if (!autoFlush_)
|
||||
GPU_FlushDrawing();
|
||||
UpdatePreviews();
|
||||
|
@ -1106,14 +1102,14 @@ BOOL CGEDebugger::DlgProc(UINT message, WPARAM wParam, LPARAM lParam) {
|
|||
break;
|
||||
|
||||
case IDC_GEDBG_FORCEOPAQUE:
|
||||
if (GPUDebug::IsActive() && gpuDebug != nullptr) {
|
||||
if (gpuDebug != nullptr) {
|
||||
forceOpaque_ = SendMessage(GetDlgItem(m_hDlg, IDC_GEDBG_FORCEOPAQUE), BM_GETCHECK, 0, 0) != 0;
|
||||
UpdatePreviews();
|
||||
}
|
||||
break;
|
||||
|
||||
case IDC_GEDBG_SHOWCLUT:
|
||||
if (GPUDebug::IsActive() && gpuDebug != nullptr) {
|
||||
if (gpuDebug != nullptr) {
|
||||
showClut_ = SendMessage(GetDlgItem(m_hDlg, IDC_GEDBG_SHOWCLUT), BM_GETCHECK, 0, 0) != 0;
|
||||
UpdatePreviews();
|
||||
}
|
||||
|
@ -1136,7 +1132,6 @@ BOOL CGEDebugger::DlgProc(UINT message, WPARAM wParam, LPARAM lParam) {
|
|||
|
||||
case WM_GEDBG_TOGGLEPCBREAKPOINT:
|
||||
{
|
||||
GPUDebug::SetActive(true);
|
||||
u32 pc = (u32)wParam;
|
||||
bool temp;
|
||||
bool isBreak = IsAddressBreakpoint(pc, temp);
|
||||
|
@ -1156,7 +1151,6 @@ BOOL CGEDebugger::DlgProc(UINT message, WPARAM wParam, LPARAM lParam) {
|
|||
|
||||
case WM_GEDBG_RUNTOWPARAM:
|
||||
{
|
||||
GPUDebug::SetActive(true);
|
||||
u32 pc = (u32)wParam;
|
||||
AddAddressBreakpoint(pc, true);
|
||||
SendMessage(m_hDlg,WM_COMMAND,IDC_GEDBG_RESUME,0);
|
||||
|
|
Loading…
Add table
Reference in a new issue