From 7b6f156f599b93e9723061a114b7d86dd4d486b2 Mon Sep 17 00:00:00 2001 From: Aaron Robinson Date: Tue, 16 Mar 2004 03:19:55 +0000 Subject: [PATCH] DbgConsole vertex buffer enable/disable --- Cxbx.opt | Bin 69120 -> 62976 bytes Include/Cxbx.h | 6 +- Include/Win32/CxbxKrnl/EmuD3D8/VertexBuffer.h | 7 +- Include/Win32/CxbxKrnl/EmuNtDll.h | 2 +- Include/Win32/CxbxKrnl/EmuXapi.h | 4 +- Source/Win32/CxbxKrnl/DbgConsole.cpp | 135 ++++++++++++++++-- Source/Win32/CxbxKrnl/Emu.cpp | 5 +- Source/Win32/CxbxKrnl/EmuD3D8.cpp | 69 ++++++++- .../Win32/CxbxKrnl/EmuD3D8/VertexBuffer.cpp | 67 ++++++++- Source/Win32/CxbxKrnl/EmuXapi.cpp | 8 +- 10 files changed, 270 insertions(+), 33 deletions(-) diff --git a/Cxbx.opt b/Cxbx.opt index 962978b11509de8b39955746bc7ce6be788e062f..6b185df7b850b8f872d21fa0790582d63323b744 100644 GIT binary patch literal 62976 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 literal 69120 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 == NULL)) + break; + + cur = cur->next; + } + + if(n == v && (cur != NULL) && (cur->next != NULL)) + { + if(enable) + { + g_VBTrackDisable.remove(cur->vb); + } + else + { + g_VBTrackDisable.insert(cur->vb); + } + + printf("CxbxDbg: %.02d (0x%.08X) %s\n", n, cur->vb, enable ? "enabled" : "disabled"); + } + else + { + printf("CxbxDbg: # out of range\n"); + } + + return; +} +#endif + void DbgConsole::ParseCommand() { printf("\n"); + char szCmd[32]; + + sscanf(m_szInput, "%s", szCmd); + // TODO: as command list grows, turn into static string/ptr lookup - if(stricmp(m_szInput, "h") == 0 || stricmp(m_szInput, "help") == 0) + if(stricmp(szCmd, "h") == 0 || stricmp(szCmd, "help") == 0) { printf("CxbxDbg: \n"); printf("CxbxDbg: Cxbx Debug Command List:\n"); printf("CxbxDbg: \n"); - printf("CxbxDbg: HELP (H)\n"); - printf("CxbxDbg: QUIT (Q or EXIT)\n"); - printf("CxbxDbg: TRACE (T)\n"); + printf("CxbxDbg: HELP (H)\n"); + printf("CxbxDbg: QUIT (Q or EXIT)\n"); + printf("CxbxDbg: TRACE (T)\n"); + printf("CxbxDbg: ListVB (LVB)\n"); + printf("CxbxDbg: DisableVB # (DVB #)\n"); + printf("CxbxDbg: EnableVB # (EVB #)\n"); printf("CxbxDbg: CLS\n"); printf("CxbxDbg: \n"); } - else if(stricmp(m_szInput, "cls") == 0) - { - // clear screen using system call - system("cls"); - } - else if(stricmp(m_szInput, "q") == 0 || stricmp(m_szInput, "quit") == 0 || stricmp(m_szInput, "exit") == 0) + else if(stricmp(szCmd, "q") == 0 || stricmp(szCmd, "quit") == 0 || stricmp(szCmd, "exit") == 0) { printf("CxbxDbg: Goodbye...\n"); EmuCleanup(NULL); } - else if(stricmp(m_szInput, "t") == 0 || stricmp(m_szInput, "trace") == 0) + else if(stricmp(szCmd, "t") == 0 || stricmp(szCmd, "trace") == 0) { g_bPrintfOn = !g_bPrintfOn; printf("CxbxDbg: Trace is now %s\n", g_bPrintfOn ? "ON" : "OFF"); } + else if(stricmp(szCmd, "lvb") == 0 || stricmp(szCmd, "ListVB") == 0) + { + #ifdef _DEBUG_TRACK_VB + { + using namespace XTL; + + int v=0; + + VBNode *cur = g_VBTrackTotal.getHead(); + + while(cur != NULL && cur->next != NULL) + { + bool enabled = !g_VBTrackDisable.exists(cur->vb); + + printf("CxbxDbg: %.02d : 0x%.08X (%s)\n", v++, cur->vb, enabled ? "enabled" : "disabled"); + + cur = cur->next; + } + } + #else + printf("CxbxDbg: _DEBUG_TRACK_VB is not defined!\n"); + #endif + } + else if(stricmp(szCmd, "dvb") == 0 || stricmp(szCmd, "DisableVB") == 0) + { + #ifdef _DEBUG_TRACK_VB + { + using namespace XTL; + + int n=0; + + if(sscanf(m_szInput, "%*s %d", &n) == 1) + { + EnableVB(n, false); + } + else + { + printf("CxbxDbg: Syntax Incorrect (dvb #)\n"); + } + } + #else + printf("CxbxDbg: _DEBUG_TRACK_VB is not defined!\n"); + #endif + } + else if(stricmp(szCmd, "evb") == 0 || stricmp(szCmd, "EnableVB") == 0) + { + #ifdef _DEBUG_TRACK_VB + { + using namespace XTL; + + int n=0; + + if(sscanf(m_szInput, "%*s %d", &n) == 1) + { + EnableVB(n, true); + } + else + { + printf("CxbxDbg: Syntax Incorrect (dvb #)\n"); + } + } + #else + printf("CxbxDbg: _DEBUG_TRACK_VB is not defined!\n"); + #endif + } + else if(stricmp(szCmd, "cls") == 0) + { + // clear screen using system call + system("cls"); + } else { - printf("CxbxDbg: Cmd \"%s\" not recognized!\n", m_szInput); + printf("CxbxDbg: Cmd \"%s\" not recognized!\n", szCmd); } } diff --git a/Source/Win32/CxbxKrnl/Emu.cpp b/Source/Win32/CxbxKrnl/Emu.cpp index 48f3d3200..98d4794b2 100644 --- a/Source/Win32/CxbxKrnl/Emu.cpp +++ b/Source/Win32/CxbxKrnl/Emu.cpp @@ -665,7 +665,10 @@ extern "C" CXBXKRNL_API void NTAPI EmuCleanup(const char *szErrorMessage, ...) if(g_hEmuParent != NULL) SendMessage(g_hEmuParent, WM_PARENTNOTIFY, WM_DESTROY, 0); - TerminateProcess(GetCurrentProcess(), 0); + exit(0); + + // Much less friendly :] + // TerminateProcess(GetCurrentProcess(), 0); return; } diff --git a/Source/Win32/CxbxKrnl/EmuD3D8.cpp b/Source/Win32/CxbxKrnl/EmuD3D8.cpp index 36c73c67e..f8b809849 100644 --- a/Source/Win32/CxbxKrnl/EmuD3D8.cpp +++ b/Source/Win32/CxbxKrnl/EmuD3D8.cpp @@ -3093,7 +3093,18 @@ static void EmuFlushD3DIVB() g_pD3DDevice8->SetVertexShader(dwFVF); - HRESULT hRet = g_pD3DDevice8->DrawPrimitiveUP(XTL::EmuPrimitiveType(g_dwD3DIVBPrim), XTL::EmuD3DVertex2PrimitiveCount(g_dwD3DIVBPrim, g_dwD3DIVBInd), pStreamData, i/g_dwD3DIVBInd); + HRESULT hRet = S_OK; + + #ifdef _DEBUG_TRACK_VB + if(!XTL::g_bVBSkipStream) + { + #endif + + hRet = g_pD3DDevice8->DrawPrimitiveUP(XTL::EmuPrimitiveType(g_dwD3DIVBPrim), XTL::EmuD3DVertex2PrimitiveCount(g_dwD3DIVBPrim, g_dwD3DIVBInd), pStreamData, i/g_dwD3DIVBInd); + + #ifdef _DEBUG_TRACK_VB + } + #endif // HACK: TODO: probably unnecessary!!! //g_pD3DDevice8->Present(0,0,0,0); @@ -3578,6 +3589,10 @@ HRESULT WINAPI XTL::EmuIDirect3DResource8_Register &pResource->EmuVertexBuffer8 ); + #ifdef _DEBUG_TRACK_VB + g_VBTrackTotal.insert(pResource->EmuVertexBuffer8); + #endif + BYTE *pData = 0; hRet = pResource->EmuVertexBuffer8->Lock(0, 0, &pData, 0); @@ -3780,6 +3795,7 @@ HRESULT WINAPI XTL::EmuIDirect3DResource8_Register EmuCleanup("CreateImageSurface Failed!"); DbgPrintf("EmuIDirect3DResource8_Register (0x%X) : Successfully Created ImageSurface (0x%.08X, 0x%.08X)\n", GetCurrentThreadId(), pResource, pResource->EmuSurface8); + DbgPrintf("EmuIDirect3DResource8_Register (0x%X) : Width : %d, Height : %d, Format : %d\n", GetCurrentThreadId(), dwWidth, dwHeight, Format); } else { @@ -4126,9 +4142,13 @@ VOID WINAPI XTL::EmuGet2DSurfaceDesc HRESULT hRet; if(dwLevel == 0xFEFEFEFE) + { hRet = pPixelContainer->EmuSurface8->GetDesc(&SurfaceDesc); + } else + { hRet = pPixelContainer->EmuTexture8->GetLevelDesc(dwLevel, &SurfaceDesc); + } // rearrange into windows format (remove D3DPOOL) { @@ -4637,6 +4657,10 @@ XTL::X_D3DVertexBuffer* WINAPI XTL::EmuIDirect3DDevice8_CreateVertexBuffer2 if(FAILED(hRet)) EmuWarning("CreateVertexBuffer Failed!"); + #ifdef _DEBUG_TRACK_VB + g_VBTrackTotal.insert(pD3DVertexBuffer->EmuVertexBuffer8); + #endif + EmuSwapFS(); // XBox FS return pD3DVertexBuffer; @@ -6057,6 +6081,13 @@ HRESULT WINAPI XTL::EmuIDirect3DDevice8_SetStreamSource pVertexBuffer8->Unlock(); } + #ifdef _DEBUG_TRACK_VB + if(pStreamData != NULL) + { + g_bVBSkipStream = g_VBTrackDisable.exists(pStreamData->EmuVertexBuffer8); + } + #endif + HRESULT hRet = g_pD3DDevice8->SetStreamSource(StreamNumber, pVertexBuffer8, Stride); if(FAILED(hRet)) @@ -6151,6 +6182,11 @@ VOID WINAPI XTL::EmuIDirect3DDevice8_DrawVertices uint32 nStride = EmuFixupVerticesA(PrimitiveType, PrimitiveCount, pOrigVertexBuffer8, pHackVertexBuffer8, StartVertex, 0, 0, 0); + #ifdef _DEBUG_TRACK_VB + if(!g_bVBSkipStream) + { + #endif + g_pD3DDevice8->DrawPrimitive ( PCPrimitiveType, @@ -6158,6 +6194,10 @@ VOID WINAPI XTL::EmuIDirect3DDevice8_DrawVertices PrimitiveCount ); + #ifdef _DEBUG_TRACK_VB + } + #endif + // TODO: use original stride here (duh!) if(nStride != -1) EmuFixupVerticesB(nStride, pOrigVertexBuffer8, pHackVertexBuffer8); @@ -6207,6 +6247,11 @@ VOID WINAPI XTL::EmuIDirect3DDevice8_DrawVerticesUP uint32 nStride = EmuFixupVerticesA(PrimitiveType, PrimitiveCount, pOrigVertexBuffer8, pHackVertexBuffer8, 0, pVertexStreamZeroData, VertexStreamZeroStride, &pNewVertexStreamZeroData); + #ifdef _DEBUG_TRACK_VB + if(!g_bVBSkipStream) + { + #endif + g_pD3DDevice8->DrawPrimitiveUP ( PCPrimitiveType, @@ -6215,6 +6260,10 @@ VOID WINAPI XTL::EmuIDirect3DDevice8_DrawVerticesUP VertexStreamZeroStride ); + #ifdef _DEBUG_TRACK_VB + } + #endif + if(nStride != -1) { EmuFixupVerticesB(nStride, pOrigVertexBuffer8, pHackVertexBuffer8); @@ -6296,11 +6345,20 @@ VOID WINAPI XTL::EmuIDirect3DDevice8_DrawIndexedVertices uint32 nStride = EmuFixupVerticesA(PrimitiveType, PrimitiveCount, pOrigVertexBuffer8, pHackVertexBuffer8, 0, 0, 0, 0); + #ifdef _DEBUG_TRACK_VB + if(!g_bVBSkipStream) + { + #endif + g_pD3DDevice8->DrawIndexedPrimitive ( PCPrimitiveType, 0, VertexCount, ((DWORD)pIndexData)/2, PrimitiveCount ); + #ifdef _DEBUG_TRACK_VB + } + #endif + if(nStride != -1) EmuFixupVerticesB(nStride, pOrigVertexBuffer8, pHackVertexBuffer8); @@ -6354,11 +6412,20 @@ VOID WINAPI XTL::EmuIDirect3DDevice8_DrawIndexedVerticesUP uint32 nStride = EmuFixupVerticesA(PrimitiveType, PrimitiveCount, pOrigVertexBuffer8, pHackVertexBuffer8, 0, pVertexStreamZeroData, VertexStreamZeroStride, &pNewVertexStreamZeroData); + #ifdef _DEBUG_TRACK_VB + if(!g_bVBSkipStream) + { + #endif + g_pD3DDevice8->DrawIndexedPrimitiveUP ( PCPrimitiveType, 0, VertexCount, PrimitiveCount, pIndexData, D3DFMT_INDEX16, pNewVertexStreamZeroData, VertexStreamZeroStride ); + #ifdef _DEBUG_TRACK_VB + } + #endif + if(nStride != -1) { EmuFixupVerticesB(nStride, pOrigVertexBuffer8, pHackVertexBuffer8); diff --git a/Source/Win32/CxbxKrnl/EmuD3D8/VertexBuffer.cpp b/Source/Win32/CxbxKrnl/EmuD3D8/VertexBuffer.cpp index f0185e49d..f98349ff5 100644 --- a/Source/Win32/CxbxKrnl/EmuD3D8/VertexBuffer.cpp +++ b/Source/Win32/CxbxKrnl/EmuD3D8/VertexBuffer.cpp @@ -47,7 +47,9 @@ extern XTL::LPDIRECT3DDEVICE8 g_pD3DDevice8; // Direct3D8 Device #ifdef _DEBUG_TRACK_VB -extern XTL::VBTracker g_VBTrack; +bool XTL::g_bVBSkipStream = false; + +XTL::VBTracker XTL::g_VBTrackTotal, XTL::g_VBTrackDisable; XTL::VBTracker::~VBTracker() { @@ -55,15 +57,20 @@ XTL::VBTracker::~VBTracker() while(cur != NULL) { - free(cur); + VBNode *tmp = cur->next; - cur = cur->next; + delete cur; + + cur = tmp; } } void XTL::VBTracker::insert(IDirect3DVertexBuffer8 *pVB) { - if(m_head == 0) + if(exists(pVB)) + return; + + if(m_head == 0) { m_tail = m_head = new VBNode(); m_tail->vb = 0; @@ -73,20 +80,66 @@ void XTL::VBTracker::insert(IDirect3DVertexBuffer8 *pVB) m_tail->vb = pVB; m_tail->next = new VBNode(); - m_tail->next->vb = 0; - m_tail->next->next = 0; + + m_tail = m_tail->next; + + m_tail->vb = 0; + m_tail->next = 0; return; } void XTL::VBTracker::remove(IDirect3DVertexBuffer8 *pVB) { + VBNode *pre = 0; + VBNode *cur = m_head; + + while(cur != NULL) + { + if(cur->vb == pVB) + { + if(pre != 0) + { + pre->next = cur->next; + } + else + { + m_head = cur->next; + + if(m_head->next == 0) + { + delete m_head; + + m_head = 0; + m_tail = 0; + } + } + + delete cur; + + return; + } + + pre = cur; + cur = cur->next; + } + return; } bool XTL::VBTracker::exists(IDirect3DVertexBuffer8 *pVB) { - return false; + VBNode *cur = m_head; + + while(cur != NULL) + { + if(cur->vb == pVB) + return true; + + cur = cur->next; + } + + return false; } #endif // _DEBUG_TRACK_VB diff --git a/Source/Win32/CxbxKrnl/EmuXapi.cpp b/Source/Win32/CxbxKrnl/EmuXapi.cpp index 4a6c5177b..1e87439a3 100644 --- a/Source/Win32/CxbxKrnl/EmuXapi.cpp +++ b/Source/Win32/CxbxKrnl/EmuXapi.cpp @@ -72,7 +72,7 @@ PVOID WINAPI XTL::EmuRtlCreateHeap IN PVOID Base OPTIONAL, IN ULONG Reserve OPTIONAL, IN ULONG Commit, - IN BOOLEAN Lock OPTIONAL, + IN PVOID Lock OPTIONAL, IN PVOID RtlHeapParams OPTIONAL ) { @@ -744,9 +744,7 @@ VOID WINAPI XTL::EmuXapiInitProcess() DbgPrintf("EmuXapi (0x%X): EmuXapiInitProcess();\n", GetCurrentThreadId()); - // ****************************************************************** - // * Call RtlCreateHeap - // ****************************************************************** + // call RtlCreateHeap { RTL_HEAP_PARAMETERS HeapParameters; @@ -763,7 +761,7 @@ VOID WINAPI XTL::EmuXapiInitProcess() #define HEAP_GROWABLE 0x00000002 - *XTL::EmuXapiProcessHeap = XTL::g_pRtlCreateHeap(HEAP_GROWABLE, 0, dwPeHeapReserve, dwPeHeapCommit, 0, &HeapParameters); + *XTL::EmuXapiProcessHeap = XTL::g_pRtlCreateHeap(HEAP_GROWABLE, 0, dwPeHeapReserve, dwPeHeapCommit, NULL, &HeapParameters); } return;