Frame Debugger: Allow the framebuffer's size/format to be changed by the user.

This commit is contained in:
Jean-Philip Desjardins 2014-12-30 23:00:51 -05:00
parent 544f287499
commit 3fe421e13e
8 changed files with 72 additions and 8 deletions

View File

@ -40,9 +40,11 @@ CFrameDebugger::CFrameDebugger()
m_tab = std::make_unique<CTabHost>(*m_mainSplitter, GetClientRect());
m_gsContextView0 = std::make_unique<CGsContextView>(*m_tab, GetClientRect(), m_gs.get(), 0);
m_gsContextView0->SetFbDisplayMode(m_fbDisplayMode);
m_gsContextView0->Show(SW_HIDE);
m_gsContextView1 = std::make_unique<CGsContextView>(*m_tab, GetClientRect(), m_gs.get(), 1);
m_gsContextView1->SetFbDisplayMode(m_fbDisplayMode);
m_gsContextView1->Show(SW_HIDE);
m_gsInputStateView = std::make_unique<CGsInputStateView>(*m_tab, GetClientRect());
@ -112,6 +114,15 @@ long CFrameDebugger::OnCommand(unsigned short id, unsigned short msg, HWND hwndF
case ID_FD_SETTINGS_ALPHABLEND:
ToggleAlphaBlending();
break;
case ID_FD_SETTINGS_FB_RAW:
SetFbDisplayMode(CGsContextView::FB_DISPLAY_MODE_RAW);
break;
case ID_FD_SETTINGS_FB_448I:
SetFbDisplayMode(CGsContextView::FB_DISPLAY_MODE_448I);
break;
case ID_FD_SETTINGS_FB_448P:
SetFbDisplayMode(CGsContextView::FB_DISPLAY_MODE_448P);
break;
case ID_FD_VU1_STEP:
StepVu1();
break;
@ -190,6 +201,21 @@ void CFrameDebugger::UpdateMenus()
assert(!alphaBlendMenuItem.IsEmpty());
alphaBlendMenuItem.Check(m_gs->GetAlphaBlendingEnabled());
}
{
auto fbDisplayModeRawMenuItem = Framework::Win32::CMenuItem::FindById(GetMenu(m_hWnd), ID_FD_SETTINGS_FB_RAW);
assert(!fbDisplayModeRawMenuItem.IsEmpty());
fbDisplayModeRawMenuItem.Check(m_fbDisplayMode == CGsContextView::FB_DISPLAY_MODE_RAW);
}
{
auto fbDisplayMode448iMenuItem = Framework::Win32::CMenuItem::FindById(GetMenu(m_hWnd), ID_FD_SETTINGS_FB_448I);
assert(!fbDisplayMode448iMenuItem.IsEmpty());
fbDisplayMode448iMenuItem.Check(m_fbDisplayMode == CGsContextView::FB_DISPLAY_MODE_448I);
}
{
auto fbDisplayMode448pMenuItem = Framework::Win32::CMenuItem::FindById(GetMenu(m_hWnd), ID_FD_SETTINGS_FB_448P);
assert(!fbDisplayMode448pMenuItem.IsEmpty());
fbDisplayMode448pMenuItem.Check(m_fbDisplayMode == CGsContextView::FB_DISPLAY_MODE_448P);
}
}
void CFrameDebugger::UpdateDisplay(int32 targetCmdIndex)
@ -321,6 +347,14 @@ void CFrameDebugger::ToggleAlphaBlending()
UpdateMenus();
}
void CFrameDebugger::SetFbDisplayMode(CGsContextView::FB_DISPLAY_MODE fbDisplayMode)
{
m_gsContextView0->SetFbDisplayMode(fbDisplayMode);
m_gsContextView1->SetFbDisplayMode(fbDisplayMode);
m_fbDisplayMode = fbDisplayMode;
UpdateMenus();
}
void CFrameDebugger::StepVu1()
{
#ifdef DEBUGGER_INCLUDED

View File

@ -43,11 +43,13 @@ private:
void ToggleAlphaTest();
void ToggleDepthTest();
void ToggleAlphaBlending();
void SetFbDisplayMode(CGsContextView::FB_DISPLAY_MODE);
void StepVu1();
std::unique_ptr<CGSH_Direct3D9> m_gs;
CGsPacketMetadata m_currentMetadata;
DRAWINGKICK_INFO m_currentDrawingKick;
CGsContextView::FB_DISPLAY_MODE m_fbDisplayMode = CGsContextView::FB_DISPLAY_MODE_RAW;
CFrameDump m_frameDump;
CVu1Vm m_vu1vm;

View File

@ -35,6 +35,12 @@ CGsContextView::~CGsContextView()
}
void CGsContextView::SetFbDisplayMode(FB_DISPLAY_MODE fbDisplayMode)
{
m_fbDisplayMode = fbDisplayMode;
UpdateBufferView();
}
void CGsContextView::UpdateState(CGSHandler* gs, CGsPacketMetadata*, DRAWINGKICK_INFO* drawingKick)
{
assert(gs == m_gs);
@ -52,6 +58,15 @@ void CGsContextView::UpdateBufferView()
if(!framebuffer.IsEmpty())
{
RenderDrawKick(framebuffer);
if(m_fbDisplayMode == FB_DISPLAY_MODE_448P)
{
framebuffer = framebuffer.ResizeCanvas(640, 448);
}
else if(m_fbDisplayMode == FB_DISPLAY_MODE_448I)
{
framebuffer = framebuffer.ResizeCanvas(640, 224);
framebuffer = framebuffer.Resize(640, 448);
}
}
m_bufferView->SetBitmap(framebuffer);
}

View File

@ -12,9 +12,18 @@
class CGsContextView : public Framework::Win32::CWindow, public IFrameDebuggerTab
{
public:
enum FB_DISPLAY_MODE
{
FB_DISPLAY_MODE_RAW,
FB_DISPLAY_MODE_448P,
FB_DISPLAY_MODE_448I
};
CGsContextView(HWND, const RECT&, CGSHandler*, unsigned int);
virtual ~CGsContextView();
void SetFbDisplayMode(FB_DISPLAY_MODE);
void UpdateState(CGSHandler*, CGsPacketMetadata*, DRAWINGKICK_INFO*) override;
protected:
@ -33,5 +42,6 @@ private:
unsigned int m_contextId = 0;
CGSHandler* m_gs = nullptr;
FB_DISPLAY_MODE m_fbDisplayMode = FB_DISPLAY_MODE_RAW;
DRAWINGKICK_INFO m_drawingKick;
};

View File

@ -951,10 +951,8 @@ void CGSH_Direct3D9::SetupFramebuffer(uint64 frameReg)
//Any framebuffer selected at this point can be used as a texture
framebuffer->m_canBeUsedAsTexture = true;
bool halfHeight = GetCrtIsInterlaced() && GetCrtIsFrameMode();
float projWidth = static_cast<float>(framebuffer->m_width);
float projHeight = static_cast<float>(halfHeight ? (framebuffer->m_height / 2) : framebuffer->m_height);
float projHeight = static_cast<float>(framebuffer->m_height);
HRESULT result = S_OK;
Framework::Win32::CComPtr<IDirect3DSurface9> renderSurface;

View File

@ -25,10 +25,6 @@ CGSH_Direct3D9::TEXTURE_INFO CGSH_Direct3D9::LoadTexture(const TEX0& tex0, const
float scaleRatioX = static_cast<float>(tex0.GetWidth()) / static_cast<float>(candidateFramebuffer->m_width);
float scaleRatioY = static_cast<float>(tex0.GetHeight()) / static_cast<float>(candidateFramebuffer->m_height);
//If we're currently in interlaced mode, framebuffer will have twice the height
bool halfHeight = GetCrtIsInterlaced() && GetCrtIsFrameMode();
if(halfHeight) scaleRatioY *= 2.0f;
{
D3DXMATRIX textureMatrix;
D3DXMatrixIdentity(&textureMatrix);

View File

@ -197,6 +197,12 @@ BEGIN
MENUITEM "Alpha Test Enabled", ID_FD_SETTINGS_ALPHATEST
MENUITEM "Depth Test Enabled", ID_FD_SETTINGS_DEPTHTEST
MENUITEM "Alpha Blend Enabled", ID_FD_SETTINGS_ALPHABLEND
POPUP "Framebuffer Display Mode"
BEGIN
MENUITEM "&Raw", ID_FD_SETTINGS_FB_RAW
MENUITEM "640x448 Non-Interlaced", ID_FD_SETTINGS_FB_448P
MENUITEM "640x448 Interlaced", ID_FD_SETTINGS_FB_448I
END
END
END

View File

@ -110,13 +110,16 @@
#define ID_FD_VU1_STEP 40178
#define ID_FD_SETTINGS_ALPHABLEND 40181
#define ID_FD_SETTINGS_ALPHATEST 40183
#define ID_FD_SETTINGS_FB_RAW 40188
#define ID_FD_SETTINGS_FB_448P 40192
#define ID_FD_SETTINGS_FB_448I 40193
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 119
#define _APS_NEXT_COMMAND_VALUE 40184
#define _APS_NEXT_COMMAND_VALUE 40194
#define _APS_NEXT_CONTROL_VALUE 1002
#define _APS_NEXT_SYMED_VALUE 101
#endif