From d7e5b7956e31c4113658a99612d21536cffb9384 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 15 Jun 2014 10:01:32 -0700 Subject: [PATCH] Add buttons to select texture level in ge debugger. --- Windows/GEDebugger/GEDebugger.cpp | 41 ++++++++++++++++++++++++-- Windows/GEDebugger/GEDebugger.h | 1 + Windows/GEDebugger/TabDisplayLists.cpp | 2 +- Windows/ppsspp.rc | 4 ++- Windows/resource.h | 4 ++- 5 files changed, 46 insertions(+), 6 deletions(-) diff --git a/Windows/GEDebugger/GEDebugger.cpp b/Windows/GEDebugger/GEDebugger.cpp index 3152bb1a54..e3ac010227 100644 --- a/Windows/GEDebugger/GEDebugger.cpp +++ b/Windows/GEDebugger/GEDebugger.cpp @@ -120,6 +120,8 @@ CGEDebugger::CGEDebugger(HINSTANCE _hInstance, HWND _hParent) int w = g_Config.iGEWindowW == -1 ? minWidth : g_Config.iGEWindowW; int h = g_Config.iGEWindowH == -1 ? minHeight : g_Config.iGEWindowH; MoveWindow(m_hDlg,x,y,w,h,FALSE); + + UpdateTextureLevel(textureLevel_); } CGEDebugger::~CGEDebugger() { @@ -153,7 +155,7 @@ void CGEDebugger::UpdatePreviews() { wchar_t desc[256]; const GPUDebugBuffer *primaryBuffer = NULL; bool bufferResult = false; - GPUgstate state; + GPUgstate state = {0}; if (gpuDebug != NULL) { state = gpuDebug->GetGState(); @@ -186,12 +188,13 @@ void CGEDebugger::UpdatePreviews() { auto fmt = SimpleGLWindow::Format(primaryBuffer->GetFormat()); frameWindow->Draw(primaryBuffer->GetData(), primaryBuffer->GetStride(), primaryBuffer->GetHeight(), primaryBuffer->GetFlipped(), fmt); SetDlgItemText(m_hDlg, IDC_GEDBG_FRAMEBUFADDR, desc); - } else { + } else if (frameWindow != NULL) { frameWindow->Clear(); SetDlgItemText(m_hDlg, IDC_GEDBG_FRAMEBUFADDR, L"Failed"); } const GPUDebugBuffer *bufferTex = NULL; + UpdateTextureLevel(textureLevel_); bufferResult = GPU_GetCurrentTexture(bufferTex, textureLevel_); if (bufferResult) { @@ -211,7 +214,7 @@ void CGEDebugger::UpdatePreviews() { } else { UpdateLastTexture((u32)-1); } - } else { + } else if (texWindow != NULL) { texWindow->Clear(); if (gpuDebug == NULL || state.isTextureMapEnabled()) { SetDlgItemText(m_hDlg, IDC_GEDBG_TEXADDR, L"Texture: failed"); @@ -242,6 +245,24 @@ void CGEDebugger::UpdatePreviews() { lists->Update(); } +void CGEDebugger::UpdateTextureLevel(int level) { + GPUgstate state = {0}; + if (gpuDebug != NULL) { + state = gpuDebug->GetGState(); + } + + int maxValid = 0; + for (int i = 1; i < 8; ++i) { + if (state.getTextureAddress(i) != 0) { + maxValid = i; + } + } + + textureLevel_ = std::min(std::max(0, level), maxValid); + EnableWindow(GetDlgItem(m_hDlg, IDC_GEDBG_TEXLEVELDOWN), textureLevel_ > 0); + EnableWindow(GetDlgItem(m_hDlg, IDC_GEDBG_TEXLEVELUP), textureLevel_ < maxValid); +} + void CGEDebugger::UpdateSize(WORD width, WORD height) { // only resize the tab for now HWND tabControl = GetDlgItem(m_hDlg, IDC_GEDBG_MAINTAB); @@ -378,6 +399,20 @@ BOOL CGEDebugger::DlgProc(UINT message, WPARAM wParam, LPARAM lParam) { } break; + case IDC_GEDBG_TEXLEVELDOWN: + UpdateTextureLevel(textureLevel_ - 1); + if (attached && gpuDebug != NULL) { + UpdatePreviews(); + } + break; + + case IDC_GEDBG_TEXLEVELUP: + UpdateTextureLevel(textureLevel_ + 1); + if (attached && gpuDebug != NULL) { + UpdatePreviews(); + } + break; + case IDC_GEDBG_RESUME: frameWindow->Clear(); texWindow->Clear(); diff --git a/Windows/GEDebugger/GEDebugger.h b/Windows/GEDebugger/GEDebugger.h index a6ad13befe..edebfdf85a 100644 --- a/Windows/GEDebugger/GEDebugger.h +++ b/Windows/GEDebugger/GEDebugger.h @@ -70,6 +70,7 @@ private: void UpdateSize(WORD width, WORD height); void SavePosition(); void SetBreakNext(BreakNextType type); + void UpdateTextureLevel(int level); CtrlDisplayListView *displayList; TabDisplayLists *lists; diff --git a/Windows/GEDebugger/TabDisplayLists.cpp b/Windows/GEDebugger/TabDisplayLists.cpp index 041051a9ab..46fd211f3c 100644 --- a/Windows/GEDebugger/TabDisplayLists.cpp +++ b/Windows/GEDebugger/TabDisplayLists.cpp @@ -229,7 +229,7 @@ void TabDisplayLists::UpdateSize(WORD width, WORD height) void TabDisplayLists::Update(bool reload) { - if (reload) + if (reload && gpuDebug != NULL) { lists = gpuDebug->ActiveDisplayLists(); } diff --git a/Windows/ppsspp.rc b/Windows/ppsspp.rc index d1126e7f6f..e587780ca1 100644 --- a/Windows/ppsspp.rc +++ b/Windows/ppsspp.rc @@ -183,7 +183,9 @@ BEGIN CONTROL "",IDC_GEDBG_MAINTAB,"SysTabControl32",TCS_TABS | TCS_FOCUSNEVER,10,216,480,180 EDITTEXT IDC_GEDBG_FRAMEBUFADDR,148,192,128,12,ES_READONLY | NOT WS_BORDER EDITTEXT IDC_GEDBG_TEXADDR,10,152,128,12,ES_READONLY | NOT WS_BORDER - PUSHBUTTON "Break on Te&xture...",IDC_GEDBG_BREAKTEX,24,172,100,14 + PUSHBUTTON "Break on Te&xture...",IDC_GEDBG_BREAKTEX,24,168,100,14 + PUSHBUTTON "Level -",IDC_GEDBG_TEXLEVELDOWN,24,188,40,14 + PUSHBUTTON "Level +",IDC_GEDBG_TEXLEVELUP,84,188,40,14 CONTROL "",IDC_GEDBG_FBTABS,"SysTabControl32",TCS_BUTTONS | TCS_FOCUSNEVER,384,192,110,12 END diff --git a/Windows/resource.h b/Windows/resource.h index 74fe42e925..79302e7615 100644 --- a/Windows/resource.h +++ b/Windows/resource.h @@ -309,6 +309,8 @@ #define ID_DEBUG_EXTRACTFILE 40145 #define ID_OPTIONS_IGNOREWINKEY 40146 #define IDC_MODULELIST 40147 +#define IDC_GEDBG_TEXLEVELDOWN 40148 +#define IDC_GEDBG_TEXLEVELUP 40149 // Dummy option to let the buffered rendering hotkey cycle through all the options. #define ID_OPTIONS_BUFFEREDRENDERINGDUMMY 40500 @@ -321,7 +323,7 @@ #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 256 -#define _APS_NEXT_COMMAND_VALUE 40148 +#define _APS_NEXT_COMMAND_VALUE 40150 #define _APS_NEXT_CONTROL_VALUE 1197 #define _APS_NEXT_SYMED_VALUE 101 #endif