From e2d25e307578282b7d8a80110b634397dd239c78 Mon Sep 17 00:00:00 2001 From: Aaron Robinson Date: Sat, 27 Mar 2004 09:49:27 +0000 Subject: [PATCH] vertex buffer patching cleanup, etc --- Cxbx.dsp | 5 +- Cxbx.opt | Bin 64512 -> 60928 bytes Include/Win32/CxbxKrnl/EmuD3D8/VertexBuffer.h | 49 +++-- Include/Win32/CxbxKrnl/EmuXTL.h | 3 +- Source/Win32/CxbxKrnl/EmuD3D8.cpp | 110 ++++++----- Source/Win32/CxbxKrnl/EmuD3D8/PushBuffer.cpp | 2 +- .../Win32/CxbxKrnl/EmuD3D8/VertexBuffer.cpp | 180 ++++++++++-------- 7 files changed, 192 insertions(+), 157 deletions(-) diff --git a/Cxbx.dsp b/Cxbx.dsp index 49044290f..fd25a55c3 100644 --- a/Cxbx.dsp +++ b/Cxbx.dsp @@ -1,5 +1,5 @@ # Microsoft Developer Studio Project File - Name="Cxbx" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# Microsoft Developer Studio Generated Build File, Format Version 60000 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Application" 0x0101 @@ -74,8 +74,7 @@ PostBuild_Cmds=cd PostBuild upxCxbx.bat # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /GZ /c -# ADD CPP /nologo /MDd /W3 /Gm /Zi /Od /I "Include" /I "Include/Core/" /I "Include/Win32/" /I "Include/Win32/Cxbxkrnl" /I "Include/Win32/Cxbx" /I "Include/Win32/Cxbx/jpegdec" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /GZ /c -# SUBTRACT CPP /Fr +# ADD CPP /nologo /MDd /W3 /Gm /Zi /Od /I "Include" /I "Include/Core/" /I "Include/Win32/" /I "Include/Win32/Cxbxkrnl" /I "Include/Win32/Cxbx" /I "Include/Win32/Cxbx/jpegdec" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /Fr /YX /FD /GZ /c # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "_DEBUG" diff --git a/Cxbx.opt b/Cxbx.opt index 02646b1e043ae22908cd8c85643543b8b9e89c78..d6447cdea9d097a753cb2cd4c9b1ae66cac6354d 100644 GIT binary patch literal 60928 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 ( @@ -6058,12 +6058,19 @@ VOID WINAPI XTL::EmuIDirect3DDevice8_DrawVertices // Convert from Xbox to PC enumeration D3DPRIMITIVETYPE PCPrimitiveType = EmuPrimitiveType(PrimitiveType); - IDirect3DVertexBuffer8 *pOrigVertexBuffer8 = 0; - IDirect3DVertexBuffer8 *pHackVertexBuffer8 = 0; + VertexPatchDesc VPDesc; - uint32 nStride = EmuFixupVerticesA(PrimitiveType, PrimitiveCount, pOrigVertexBuffer8, pHackVertexBuffer8, StartVertex, 0, 0, 0); + VPDesc.PrimitiveType = PrimitiveType; + VPDesc.dwPrimitiveCount = PrimitiveCount; + VPDesc.dwOffset = StartVertex; + VPDesc.pVertexStreamZeroData = 0; + VPDesc.uiVertexStreamZeroStride = 0; - if (IsValidCurrentShader()) + VertexPatcher VertPatch; + + bool bPatched = VertPatch.Apply(&VPDesc); + + if(IsValidCurrentShader()) { #ifdef _DEBUG_TRACK_VB if(g_bVBSkipStream) @@ -6082,16 +6089,14 @@ VOID WINAPI XTL::EmuIDirect3DDevice8_DrawVertices ( PCPrimitiveType, StartVertex, - PrimitiveCount + VPDesc.dwPrimitiveCount ); #ifdef _DEBUG_TRACK_VB } #endif } - // TODO: use original stride here (duh!) - if(nStride != -1) - EmuFixupVerticesB(nStride, pOrigVertexBuffer8, pHackVertexBuffer8); + VertPatch.Restore(); EmuSwapFS(); // XBox FS @@ -6191,12 +6196,17 @@ VOID WINAPI XTL::EmuIDirect3DDevice8_DrawVerticesUP // Convert from Xbox to PC enumeration D3DPRIMITIVETYPE PCPrimitiveType = EmuPrimitiveType(PrimitiveType); - IDirect3DVertexBuffer8 *pOrigVertexBuffer8 = 0; - IDirect3DVertexBuffer8 *pHackVertexBuffer8 = 0; + VertexPatchDesc VPDesc; - PVOID pNewVertexStreamZeroData = pVertexStreamZeroData; + VPDesc.PrimitiveType = PrimitiveType; + VPDesc.dwPrimitiveCount = PrimitiveCount; + VPDesc.dwOffset = 0; + VPDesc.pVertexStreamZeroData = pVertexStreamZeroData; + VPDesc.uiVertexStreamZeroStride = VertexStreamZeroStride; - uint32 nStride = EmuFixupVerticesA(PrimitiveType, PrimitiveCount, pOrigVertexBuffer8, pHackVertexBuffer8, 0, pVertexStreamZeroData, VertexStreamZeroStride, &pNewVertexStreamZeroData); + VertexPatcher VertPatch; + + bool bPatched = VertPatch.Apply(&VPDesc); if (IsValidCurrentShader()) { @@ -6208,9 +6218,9 @@ VOID WINAPI XTL::EmuIDirect3DDevice8_DrawVerticesUP g_pD3DDevice8->DrawPrimitiveUP ( PCPrimitiveType, - PrimitiveCount, - pNewVertexStreamZeroData, - VertexStreamZeroStride + VPDesc.dwPrimitiveCount, + VPDesc.pVertexStreamZeroData, + VPDesc.uiVertexStreamZeroStride ); #ifdef _DEBUG_TRACK_VB @@ -6218,13 +6228,7 @@ VOID WINAPI XTL::EmuIDirect3DDevice8_DrawVerticesUP #endif } - if(nStride != -1) - { - EmuFixupVerticesB(nStride, pOrigVertexBuffer8, pHackVertexBuffer8); - - if(pNewVertexStreamZeroData != 0) - CxbxFree(pNewVertexStreamZeroData); - } + VertPatch.Restore(); EmuSwapFS(); // XBox FS @@ -6294,10 +6298,17 @@ VOID WINAPI XTL::EmuIDirect3DDevice8_DrawIndexedVertices // Convert from Xbox to PC enumeration D3DPRIMITIVETYPE PCPrimitiveType = EmuPrimitiveType(PrimitiveType); - IDirect3DVertexBuffer8 *pOrigVertexBuffer8 = 0; - IDirect3DVertexBuffer8 *pHackVertexBuffer8 = 0; + VertexPatchDesc VPDesc; - uint32 nStride = EmuFixupVerticesA(PrimitiveType, PrimitiveCount, pOrigVertexBuffer8, pHackVertexBuffer8, 0, 0, 0, 0); + VPDesc.PrimitiveType = PrimitiveType; + VPDesc.dwPrimitiveCount = PrimitiveCount; + VPDesc.dwOffset = 0; + VPDesc.pVertexStreamZeroData = 0; + VPDesc.uiVertexStreamZeroStride = 0; + + VertexPatcher VertPatch; + + bool bPatched = VertPatch.Apply(&VPDesc); #ifdef _DEBUG_TRACK_VB if(!g_bVBSkipStream) @@ -6315,15 +6326,16 @@ VOID WINAPI XTL::EmuIDirect3DDevice8_DrawIndexedVertices g_pD3DDevice8->GetIndices(&pIndexBuffer, &BaseIndex); if(pIndexBuffer != 0) + { bActiveIB = true; - - pIndexBuffer->Release(); + pIndexBuffer->Release(); + } } UINT uiNumVertices = 0; UINT uiStartIndex = 0; - // TODO: Caching (if it becomes noticably slow to recreate the buffer each time) + // TODO: caching (if it becomes noticably slow to recreate the buffer each time) if(!bActiveIB) { g_pD3DDevice8->CreateIndexBuffer(VertexCount*2, D3DUSAGE_WRITEONLY, D3DFMT_INDEX16, D3DPOOL_MANAGED, &pIndexBuffer); @@ -6353,11 +6365,11 @@ VOID WINAPI XTL::EmuIDirect3DDevice8_DrawIndexedVertices uiStartIndex = ((DWORD)pIndexData)/2; } - if (IsValidCurrentShader()) + if(IsValidCurrentShader()) { g_pD3DDevice8->DrawIndexedPrimitive ( - PCPrimitiveType, 0, uiNumVertices, uiStartIndex, PrimitiveCount + PCPrimitiveType, 0, uiNumVertices, uiStartIndex, VPDesc.dwPrimitiveCount ); } @@ -6371,8 +6383,7 @@ VOID WINAPI XTL::EmuIDirect3DDevice8_DrawIndexedVertices } #endif - if(nStride != -1) - EmuFixupVerticesB(nStride, pOrigVertexBuffer8, pHackVertexBuffer8); + VertPatch.Restore(); EmuSwapFS(); // XBox FS @@ -6417,12 +6428,17 @@ VOID WINAPI XTL::EmuIDirect3DDevice8_DrawIndexedVerticesUP // Convert from Xbox to PC enumeration D3DPRIMITIVETYPE PCPrimitiveType = EmuPrimitiveType(PrimitiveType); - IDirect3DVertexBuffer8 *pOrigVertexBuffer8 = 0; - IDirect3DVertexBuffer8 *pHackVertexBuffer8 = 0; + VertexPatchDesc VPDesc; - PVOID pNewVertexStreamZeroData = pVertexStreamZeroData; + VPDesc.PrimitiveType = PrimitiveType; + VPDesc.dwPrimitiveCount = PrimitiveCount; + VPDesc.dwOffset = 0; + VPDesc.pVertexStreamZeroData = pVertexStreamZeroData; + VPDesc.uiVertexStreamZeroStride = VertexStreamZeroStride; - uint32 nStride = EmuFixupVerticesA(PrimitiveType, PrimitiveCount, pOrigVertexBuffer8, pHackVertexBuffer8, 0, pVertexStreamZeroData, VertexStreamZeroStride, &pNewVertexStreamZeroData); + VertexPatcher VertPatch; + + bool bPatched = VertPatch.Apply(&VPDesc); #ifdef _DEBUG_TRACK_VB if(!g_bVBSkipStream) @@ -6433,7 +6449,7 @@ VOID WINAPI XTL::EmuIDirect3DDevice8_DrawIndexedVerticesUP { g_pD3DDevice8->DrawIndexedPrimitiveUP ( - PCPrimitiveType, 0, VertexCount, PrimitiveCount, pIndexData, D3DFMT_INDEX16, pNewVertexStreamZeroData, VertexStreamZeroStride + PCPrimitiveType, 0, VertexCount, VPDesc.dwPrimitiveCount, pIndexData, D3DFMT_INDEX16, VPDesc.pVertexStreamZeroData, VPDesc.uiVertexStreamZeroStride ); } @@ -6441,13 +6457,7 @@ VOID WINAPI XTL::EmuIDirect3DDevice8_DrawIndexedVerticesUP } #endif - if(nStride != -1) - { - EmuFixupVerticesB(nStride, pOrigVertexBuffer8, pHackVertexBuffer8); - - if(pNewVertexStreamZeroData != 0) - CxbxFree(pNewVertexStreamZeroData); - } + VertPatch.Restore(); EmuSwapFS(); // XBox FS diff --git a/Source/Win32/CxbxKrnl/EmuD3D8/PushBuffer.cpp b/Source/Win32/CxbxKrnl/EmuD3D8/PushBuffer.cpp index f293d855c..12cc637cb 100644 --- a/Source/Win32/CxbxKrnl/EmuD3D8/PushBuffer.cpp +++ b/Source/Win32/CxbxKrnl/EmuD3D8/PushBuffer.cpp @@ -234,7 +234,7 @@ void XTL::EmuExecutePushBuffer if(!g_bPBSkipPusher) { - if (IsValidCurrentShader()) + if(IsValidCurrentShader()) { g_pD3DDevice8->DrawIndexedPrimitive ( diff --git a/Source/Win32/CxbxKrnl/EmuD3D8/VertexBuffer.cpp b/Source/Win32/CxbxKrnl/EmuD3D8/VertexBuffer.cpp index 3ff802198..40b8ed0e8 100644 --- a/Source/Win32/CxbxKrnl/EmuD3D8/VertexBuffer.cpp +++ b/Source/Win32/CxbxKrnl/EmuD3D8/VertexBuffer.cpp @@ -45,25 +45,26 @@ XTL::X_D3DPRIMITIVETYPE XTL::g_IVBPrimitiveType = 0; UINT XTL::g_IVBTblOffs = 0; struct XTL::_D3DIVB *XTL::g_IVBTable = 0; -// fixup xbox extensions to be compatible with PC direct3d -UINT XTL::EmuFixupVerticesA -( - DWORD PrimitiveType, - UINT &PrimitiveCount, - XTL::IDirect3DVertexBuffer8 *&pOrigVertexBuffer8, - XTL::IDirect3DVertexBuffer8 *&pHackVertexBuffer8, - UINT dwOffset, - PVOID pVertexStreamZeroData, - UINT uiVertexStreamZeroStride, - PVOID *ppNewVertexStreamZeroData -) +XTL::VertexPatcher::VertexPatcher() { - // only quad and listloop are supported right now - if(PrimitiveType != 8 && PrimitiveType != 3) - return -1; + this->pOrigVertexBuffer8 = 0; + this->pPatchedVertexBuffer8 = 0; + this->uiStride = 0; + this->bPatched = false; + this->bAllocatedStreamZeroData = false; +} - // stride of this stream source - UINT uiStride = 0; +XTL::VertexPatcher::~VertexPatcher() +{ +} + +bool XTL::VertexPatcher::Apply(VertexPatchDesc *pPatchDesc) +{ + // only quad and listloop are currently supported + if((pPatchDesc->PrimitiveType != 8) && (pPatchDesc->PrimitiveType != 3)) + return false; + + uiStride = 0; // sizes of our part in the vertex buffer DWORD dwOriginalSize = 0; @@ -75,27 +76,29 @@ UINT XTL::EmuFixupVerticesA // vertex data arrays BYTE *pOrigVertexData = 0; - BYTE *pHackVertexData = 0; + BYTE *pPatchedVertexData = 0; - if(pVertexStreamZeroData == 0) + if(pPatchDesc->pVertexStreamZeroData == 0) { g_pD3DDevice8->GetStreamSource(0, &pOrigVertexBuffer8, &uiStride); - if(PrimitiveType == 8) // Quad + // Quad + if(pPatchDesc->PrimitiveType == 8) { - PrimitiveCount *= 2; + pPatchDesc->dwPrimitiveCount *= 2; // This is a list of sqares/rectangles, so we convert it to a list of triangles - dwOriginalSize = PrimitiveCount*uiStride*2; - dwNewSize = PrimitiveCount*uiStride*3; + dwOriginalSize = pPatchDesc->dwPrimitiveCount*uiStride*2; + dwNewSize = pPatchDesc->dwPrimitiveCount*uiStride*3; } - else if(PrimitiveType == 3) // LineLoop + // LineLoop + else if(pPatchDesc->PrimitiveType == 3) { - PrimitiveCount += 1; + pPatchDesc->dwPrimitiveCount += 1; // We will add exactly one more line - dwOriginalSize = PrimitiveCount*uiStride; - dwNewSize = PrimitiveCount*uiStride + uiStride; + dwOriginalSize = pPatchDesc->dwPrimitiveCount*uiStride; + dwNewSize = pPatchDesc->dwPrimitiveCount*uiStride + uiStride; } // Retrieve the original buffer size @@ -113,42 +116,45 @@ UINT XTL::EmuFixupVerticesA dwNewSizeWR = dwNewSize + dwOriginalSizeWR - dwOriginalSize; } - g_pD3DDevice8->CreateVertexBuffer(dwNewSizeWR, 0, 0, XTL::D3DPOOL_MANAGED, &pHackVertexBuffer8); + g_pD3DDevice8->CreateVertexBuffer(dwNewSizeWR, 0, 0, XTL::D3DPOOL_MANAGED, &pPatchedVertexBuffer8); if(pOrigVertexBuffer8 != 0) pOrigVertexBuffer8->Lock(0, 0, &pOrigVertexData, 0); - if(pHackVertexBuffer8 != 0) - pHackVertexBuffer8->Lock(0, 0, &pHackVertexData, 0); + if(pPatchedVertexBuffer8 != 0) + pPatchedVertexBuffer8->Lock(0, 0, &pPatchedVertexData, 0); } else { - uiStride = uiVertexStreamZeroStride; + uiStride = pPatchDesc->uiVertexStreamZeroStride; - if(PrimitiveType == 8) // Quad + if(pPatchDesc->PrimitiveType == 8) // Quad { - PrimitiveCount *= 2; + pPatchDesc->dwPrimitiveCount *= 2; // This is a list of sqares/rectangles, so we convert it to a list of triangles - dwOriginalSize = PrimitiveCount*uiStride*2; - dwNewSize = PrimitiveCount*uiStride*3; + dwOriginalSize = pPatchDesc->dwPrimitiveCount*uiStride*2; + dwNewSize = pPatchDesc->dwPrimitiveCount*uiStride*3; } - else if(PrimitiveType == 3) // LineLoop + else if(pPatchDesc->PrimitiveType == 3) // LineLoop { - PrimitiveCount += 1; + pPatchDesc->dwPrimitiveCount += 1; // We will add exactly one more line - dwOriginalSize = PrimitiveCount*uiStride; - dwNewSize = PrimitiveCount*uiStride + uiStride; + dwOriginalSize = pPatchDesc->dwPrimitiveCount*uiStride; + dwNewSize = pPatchDesc->dwPrimitiveCount*uiStride + uiStride; } dwOriginalSizeWR = dwOriginalSize; dwNewSizeWR = dwNewSize; - pHackVertexData = (uint08*)CxbxMalloc(dwNewSizeWR); - pOrigVertexData = (uint08*)pVertexStreamZeroData; + pNewVertexStreamZeroData = (uint08*)CxbxMalloc(dwNewSizeWR); + this->bAllocatedStreamZeroData = true; - *ppNewVertexStreamZeroData = pHackVertexData; + pPatchedVertexData = (uint08*)pNewVertexStreamZeroData; + pOrigVertexData = (uint08*)pPatchDesc->pVertexStreamZeroData; + + pPatchDesc->pVertexStreamZeroData = pPatchedVertexData; } DWORD dwVertexShader = NULL; @@ -156,31 +162,34 @@ UINT XTL::EmuFixupVerticesA g_pD3DDevice8->GetVertexShader(&dwVertexShader); // Copy the nonmodified data - memcpy(pHackVertexData, pOrigVertexData, dwOffset); - memcpy(&pHackVertexData[dwOffset+dwNewSize], &pOrigVertexData[dwOffset+dwOriginalSize], dwOriginalSizeWR-dwOffset-dwOriginalSize); + memcpy(pPatchedVertexData, pOrigVertexData, pPatchDesc->dwOffset); + memcpy(&pPatchedVertexData[pPatchDesc->dwOffset+dwNewSize], + &pOrigVertexData[pPatchDesc->dwOffset+dwOriginalSize], + dwOriginalSizeWR - pPatchDesc->dwOffset - dwOriginalSize); - if(PrimitiveType == 8) // Quad + // Quad + if(pPatchDesc->PrimitiveType == 8) { - uint08 *pHack1 = &pHackVertexData[dwOffset+0*uiStride]; - uint08 *pHack2 = &pHackVertexData[dwOffset+3*uiStride]; - uint08 *pHack3 = &pHackVertexData[dwOffset+4*uiStride]; - uint08 *pHack4 = &pHackVertexData[dwOffset+5*uiStride]; + uint08 *pPatch1 = &pPatchedVertexData[pPatchDesc->dwOffset+0*uiStride]; + uint08 *pPatch2 = &pPatchedVertexData[pPatchDesc->dwOffset+3*uiStride]; + uint08 *pPatch3 = &pPatchedVertexData[pPatchDesc->dwOffset+4*uiStride]; + uint08 *pPatch4 = &pPatchedVertexData[pPatchDesc->dwOffset+5*uiStride]; - uint08 *pOrig1 = &pOrigVertexData[dwOffset+0*uiStride]; - uint08 *pOrig2 = &pOrigVertexData[dwOffset+2*uiStride]; - uint08 *pOrig3 = &pOrigVertexData[dwOffset+3*uiStride]; + uint08 *pOrig1 = &pOrigVertexData[pPatchDesc->dwOffset+0*uiStride]; + uint08 *pOrig2 = &pOrigVertexData[pPatchDesc->dwOffset+2*uiStride]; + uint08 *pOrig3 = &pOrigVertexData[pPatchDesc->dwOffset+3*uiStride]; - for(uint32 i=0;idwPrimitiveCount/2;i++) { - memcpy(pHack1, pOrig1, uiStride*3); // Vertex 0,1,2 := Vertex 0,1,2 - memcpy(pHack2, pOrig2, uiStride); // Vertex 3 := Vertex 2 - memcpy(pHack3, pOrig3, uiStride); // Vertex 4 := Vertex 3 - memcpy(pHack4, pOrig1, uiStride); // Vertex 5 := Vertex 0 + memcpy(pPatch1, pOrig1, uiStride*3); // Vertex 0,1,2 := Vertex 0,1,2 + memcpy(pPatch2, pOrig2, uiStride); // Vertex 3 := Vertex 2 + memcpy(pPatch3, pOrig3, uiStride); // Vertex 4 := Vertex 3 + memcpy(pPatch4, pOrig1, uiStride); // Vertex 5 := Vertex 0 - pHack1 += uiStride*6; - pHack2 += uiStride*6; - pHack3 += uiStride*6; - pHack4 += uiStride*6; + pPatch1 += uiStride*6; + pPatch2 += uiStride*6; + pPatch3 += uiStride*6; + pPatch4 += uiStride*6; pOrig1 += uiStride*4; pOrig2 += uiStride*4; @@ -190,47 +199,52 @@ UINT XTL::EmuFixupVerticesA { for(int z=0;z<6;z++) { - if(((FLOAT*)&pHackVertexData[dwOffset+i*uiStride*6+z*uiStride])[2] == 0.0f) - ((FLOAT*)&pHackVertexData[dwOffset+i*uiStride*6+z*uiStride])[2] = 1.0f; - if(((FLOAT*)&pHackVertexData[dwOffset+i*uiStride*6+z*uiStride])[3] == 0.0f) - ((FLOAT*)&pHackVertexData[dwOffset+i*uiStride*6+z*uiStride])[3] = 1.0f; + if(((FLOAT*)&pPatchedVertexData[pPatchDesc->dwOffset+i*uiStride*6+z*uiStride])[2] == 0.0f) + ((FLOAT*)&pPatchedVertexData[pPatchDesc->dwOffset+i*uiStride*6+z*uiStride])[2] = 1.0f; + if(((FLOAT*)&pPatchedVertexData[pPatchDesc->dwOffset+i*uiStride*6+z*uiStride])[3] == 0.0f) + ((FLOAT*)&pPatchedVertexData[pPatchDesc->dwOffset+i*uiStride*6+z*uiStride])[3] = 1.0f; } } } } - else if(PrimitiveType == 3) + // LineLoop + else if(pPatchDesc->PrimitiveType == 3) { - memcpy(&pHackVertexData[dwOffset], &pOrigVertexData[dwOffset], dwOriginalSize); - memcpy(&pHackVertexData[dwOffset + dwOriginalSize], &pOrigVertexData[dwOffset], uiStride); + memcpy(&pPatchedVertexData[pPatchDesc->dwOffset], &pOrigVertexData[pPatchDesc->dwOffset], dwOriginalSize); + memcpy(&pPatchedVertexData[pPatchDesc->dwOffset + dwOriginalSize], &pOrigVertexData[pPatchDesc->dwOffset], uiStride); } - if(pVertexStreamZeroData == 0) + if(pPatchDesc->pVertexStreamZeroData == 0) { pOrigVertexBuffer8->Unlock(); - pHackVertexBuffer8->Unlock(); + pPatchedVertexBuffer8->Unlock(); - g_pD3DDevice8->SetStreamSource(0, pHackVertexBuffer8, uiStride); + g_pD3DDevice8->SetStreamSource(0, pPatchedVertexBuffer8, uiStride); } - return uiStride; + this->bPatched = true; + + return true; } -// fixup xbox extensions to be compatible with PC direct3d -VOID XTL::EmuFixupVerticesB -( - UINT nStride, - XTL::IDirect3DVertexBuffer8 *&pOrigVertexBuffer8, - XTL::IDirect3DVertexBuffer8 *&pHackVertexBuffer8 -) +bool XTL::VertexPatcher::Restore() { - if(pOrigVertexBuffer8 != 0 && pHackVertexBuffer8 != 0) - g_pD3DDevice8->SetStreamSource(0, pOrigVertexBuffer8, nStride); + if(!this->bPatched) + return false; + + if(pOrigVertexBuffer8 != 0 && pPatchedVertexBuffer8 != 0) + g_pD3DDevice8->SetStreamSource(0, pOrigVertexBuffer8, uiStride); if(pOrigVertexBuffer8 != 0) pOrigVertexBuffer8->Release(); - if(pHackVertexBuffer8 != 0) - pHackVertexBuffer8->Release(); + if(pPatchedVertexBuffer8 != 0) + pPatchedVertexBuffer8->Release(); + + if(this->bAllocatedStreamZeroData) + CxbxFree(pNewVertexStreamZeroData); + + return true; } VOID XTL::EmuFlushIVB()